我想向 Linux 内核添加一个新功能。为了实现它,我需要添加一个可以通过名称从内核的其他部分访问的结构。
我该怎么做?
在 module.h 中定义你的结构将导致编译内核中的所有模块。最好在本地目录中选择一个头文件,或者在本地目录中创建一个定义您的结构的新头文件。既然你说你的组件将成为内核的一部分,所以在 ac 文件中声明结构变量并在任何你想要的地方使用它与 extern 修饰符。这将不需要导出 sysmbol。它将如下所示:
kernel/test.h:
struct test {
char name[10][20];
};
kernel/workqueue.c:
struct test *test_list;
some_fun()
{
test_list = kmalloc(sizeof(struct test) * 2, GFP_KERNEL);
}
kernel/softirq.c:
extern struct test *test_list;
printk(KERN_INFO "%s\n", test_list[0].name[0]);
用于EXPORT_SYMBOL
导出您的结构变量。它将在整个内核代码和模块中看到
我不是内核专家,但我建议避免使用全局可见的符号,并提供基于函数的 API(可能带有一些内联函数,对于那些对性能至关重要的少数人)。
我建议只定义一组函数。另外,我不确定提供全局数据是一个好主意——它们可能是同步问题,尤其是在多核机器上[当今大多数系统至少有 2 个内核]。所以你最好定义一组函数接口,把它们记录好(至少有好的注释),并避免使用全局数据。
我还建议从内核的某些部分(或子系统)中汲取灵感,这可能与您想要实现的目标相似。我还建议从内核社区获得建议,即使在设计阶段的早期,你的工作(特别是,在你的代码工作之前就公开你的代码,以启用评论)。
祝你好运。很高兴了解您打算实现什么样的子系统或功能。
我不确定我是否理解你的问题。据我了解,
您正在尝试定义一个新的用户定义结构并希望在必要的地方使用它们。并寻找一个共同的地方来定义它。对??
所有内核模块都应该包括linux/module.h
. 您可以在此处添加您的结构。我希望这可以在所有模块中访问。