内核模块:顶级指针应该是静态的吗?

kernel-module: should top-level pointer be static?

我正在编写一个过滤器来接收键盘事件,过滤掉一些,然后让其余的通过。

它以内核模块的形式插入到i8042内核模块中,为installing and 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;

我很好奇这是否会以任何方式影响内存 allocation/freeing。

如果更多上下文有帮助,这里是此类过滤器的简化版本:gist

除非您需要直接在模块外访问您的变量,否则您应该始终对模块级变量使用 static 关键字。这使得只有模块内部的代码才能访问它,从而确保您不会 运行 与其他模块发生名称-space 冲突。我没有检查过,但你可以想象 Linux 内核中的其他几个文件,其中包含一个名为 keys.

的变量

这在一般情况下是正确的,不仅仅是在 Linux 内核中。不需要暴露就不暴露

内核中有一些地方暴露了一个或多个全局变量,但这些往往是出于非常具体的原因。