Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 内核模块:顶级指针应该是静态的吗?_C_Linux_Memory Management_Kernel Module - Fatal编程技术网

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

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

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

它采用内核模块的形式,并插入i8042内核模块,该模块提供了一种用于和此类过滤器的机制

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

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;