如何在Linux内核中创建全局可访问的结构

时间:2012-10-03 09:28:57

标签: c linux linux-kernel

我想为Linux Kernel添加新功能。为了实现它,我需要添加一个可以通过名称从内核的其他部分访问的结构。

我该怎么做?

4 个答案:

答案 0 :(得分:1)

使用EXPORT_SYMBOL导出您的结构变量。它将在整个内核代码和模块中看到

答案 1 :(得分:1)

我不是内核专家,但我建议避免使用全局可见符号,并提供基于函数的API(可能带有一些内联函数,适用于那些对性能至关重要的人)。

我建议仅定义一组函数。此外,我不确定提供全局数据是一个好主意 - 它们可能是同步问题,尤其是在多核机器上[大多数系统至少有2个内核]。因此,您可能最好定义一组函数接口,将它们记录得很好(至少有好的注释),并避免使用全局数据。

我还建议从内核的某个部分(或子系统)中获取灵感,这可能与您想要实现的类似。我还建议从内核社区获取建议,即使在设计阶段的早期,您的工作也是如此(特别是在代码工作之前使代码公开,以启用注释)。

祝你好运。很高兴了解您希望实现什么样的子系统或功能。

答案 2 :(得分:1)

在module.h中解析你的结构将导致编译内核中的所有模块。最好选择本地目录中的头文件,或者在本地目录中创建一个定义结构的新头。既然你说你的组件将是内核的一部分,那么在c文件中声明结构变量并使用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]);

答案 3 :(得分:0)

我不确定我是否理解你的问题。据我了解,

您正在尝试定义新的用户定义结构,并希望在必要的位置使用它们。并寻找一个共同的地方来定义它。右??

所有内核模块都应包含linux/module.h。您可以在此处添加结构。我希望所有模块都可以访问它。