我正在编写一个接收键盘事件的过滤器,过滤掉一些,然后让其余部分通过。
它采用内核模块的形式并插入i8042内核模块,该模块为installing和calling这种过滤器提供了一种机制。
在我的模块的顶层(在任何函数调用之外),我定义了一个数据类型,其中包含有关单个键的信息:
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);
我的问题是,如果keys
指针被声明为static
吗?
static struct key_data *keys;
我很好奇这是否会以任何方式影响内存分配/释放。
如果更多上下文有用,则以下是此类过滤器的简化版本:gist
答案 0 :(得分:1)
除非您需要直接在模块外部访问变量,否则应始终将static
关键字用于模块级变量。这使得只有模块内的代码才能访问它,这反过来又确保您不会遇到与其他模块的名称空间冲突。我没有检查过,但您可以想象Linux内核中的其他几个文件,其中包含各种名为keys
的文件。
一般而言,这不仅仅是在Linux内核中。如果你不需要暴露它,那就不要。
内核中有些地方会公开一个或多个全局变量,但这些变量往往是出于非常具体的原因。