内核模块:顶级指针应该是静态的吗?
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 内核中。不需要暴露就不暴露
内核中有一些地方暴露了一个或多个全局变量,但这些往往是出于非常具体的原因。
我正在编写一个过滤器来接收键盘事件,过滤掉一些,然后让其余的通过。
它以内核模块的形式插入到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 内核中。不需要暴露就不暴露
内核中有一些地方暴露了一个或多个全局变量,但这些往往是出于非常具体的原因。