kernel-module:top-level指针应该是静态的吗?

时间:2018-02-10 22:24:21

标签: c linux memory-management kernel-module

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

它采用内核模块的形式并插入i8042内核模块,该模块为installingcalling这种过滤器提供了一种机制。

在我的模块的顶层(在任何函数调用之外),我定义了一个数据类型,其中包含有关单个键的信息:

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

1 个答案:

答案 0 :(得分:1)

除非您需要直接在模块外部访问变量,否则应始终将static关键字用于模块级变量。这使得只有模块内的代码才能访问它,这反过来又确保您不会遇到与其他模块的名称空间冲突。我没有检查过,但您可以想象Linux内核中的其他几个文件,其中包含各种名为keys的文件。

一般而言,这不仅仅是在Linux内核中。如果你不需要暴露它,那就不要。

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