C 内核模块:顶级指针应该是静态的吗?
我正在编写一个过滤器,它接收键盘事件,过滤掉一些,并让其余的通过 它采用内核模块的形式,并插入i8042内核模块,该模块提供了一种用于和此类过滤器的机制 在任何函数调用之外的模块顶层,我定义了一个数据类型,其中包含关于单个键的信息:C 内核模块:顶级指针应该是静态的吗?,c,linux,memory-management,kernel-module,C,Linux,Memory Management,Kernel Module,我正在编写一个过滤器,它接收键盘事件,过滤掉一些,并让其余的通过 它采用内核模块的形式,并插入i8042内核模块,该模块提供了一种用于和此类过滤器的机制 在任何函数调用之外的模块顶层,我定义了一个数据类型,其中包含关于单个键的信息: struct key_data { bool is_pressed; unsigned long updated_at; }; 然后,我仍然在顶层声明一个指向该类型的指针,以便存储和引用128个不同键的信息: #define NUM_KEYS 12
struct key_data {
bool is_pressed;
unsigned long updated_at;
};
然后,我仍然在顶层声明一个指向该类型的指针,以便存储和引用128个不同键的信息:
#define NUM_KEYS 128
#define SIZEOF_KEYS (sizeof(struct key_data) * NUM_KEYS)
struct key_data *keys;
初始化过滤器的函数会相应地分配内存:
// inside inialation function
keys = vmalloc(SIZEOF_KEYS);
if (keys)
memset(keys, 0x00, SIZEOF_KEYS);
类似地,删除过滤器的函数将释放内存:
// inside removal function
vfree(keys);
我的问题是,键指针应该声明为静态的吗
我很好奇这是否会以任何方式影响内存分配/释放
如果更多上下文有帮助,下面是这种过滤器的简化版本:除非您需要直接在模块外部访问变量,否则应始终使用static关键字访问模块级变量。这使得只有模块内的代码才能访问它,从而确保不会与其他模块发生名称空间冲突。我还没有检查,但是您可以想象Linux内核中的其他几个文件具有各种可命名密钥 这在一般情况下是正确的,不仅仅是在Linux内核中。如果你不需要暴露它,那就不要 内核中有些地方会公开一个或多个全局变量,但这些都是出于非常特定的原因。在模块的顶层,在任何函数调用之外,我定义了一个数据类型。。。然后,我声明了一个指向该类型的指针,它仍然是顶级的…-只有一个struct key_data*键实例,指针初始化为0。它本身已经是静态的,但变量具有外部链接。将其更改为静态存储类会将链接更改为内部。我想问题是,你的链接/可见性要求是什么?@jww我尝试在密钥声明中添加static,但一切似乎都是一样的,所以我想它不需要我模块之外的可见性。我看到一个类似的模块,其中没有使用static,所以我想知道是否还有更多我可能遗漏的内容。听起来好像没有:
static struct key_data *keys;