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

C 如何在Linux内核中创建全局可访问结构,c,linux,linux-kernel,C,Linux,Linux Kernel,我想向Linux内核添加一个新功能。为了实现它,我需要添加一个可以通过名称从内核的其他部分访问的结构 如何操作?使用EXPORT\u SYMBOL导出结构变量。它将出现在整个内核代码和模块中使用EXPORT\u SYMBOL导出结构变量。它将出现在整个内核代码和模块中我不确定是否理解您的问题。据我了解, 您正在尝试定义新的用户定义结构,并希望在必要的位置使用它们。同时也在寻找一个共同的地方来定义它。对吧 所有内核模块都应该包括linux/module.h。您可以在这里添加您的结构。我希望在所有模

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


如何操作?

使用
EXPORT\u SYMBOL
导出结构变量。它将出现在整个内核代码和模块中

使用
EXPORT\u SYMBOL
导出结构变量。它将出现在整个内核代码和模块中

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

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


所有内核模块都应该包括
linux/module.h
。您可以在这里添加您的结构。我希望在所有模块中都可以访问此信息。

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

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


所有内核模块都应该包括
linux/module.h
。您可以在这里添加您的结构。我希望在所有模块中都可以访问它。

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

我建议只定义一组函数。此外,我不确定提供全局数据是否是一个好主意-它们可能是同步问题,特别是在多核机器上[目前大多数系统至少有两个核]。因此,您可能最好定义一组函数接口,对它们进行良好的文档记录(至少有良好的注释),并避免使用全局数据

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


祝你好运。了解您打算实现什么样的子系统或功能会很好。

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

我建议只定义一组函数。此外,我不确定提供全局数据是否是一个好主意-它们可能是同步问题,特别是在多核机器上[目前大多数系统至少有两个核]。因此,您可能最好定义一组函数接口,对它们进行良好的文档记录(至少有良好的注释),并避免使用全局数据

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


祝你好运。了解您打算实现什么样的子系统或功能会很好。

在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]);

在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]);

它将不作为模块包含-它将是内核的一部分。是的,您可以。。。。假设您正试图在以太网驱动程序中使用该结构。该以太网驱动程序还包括
模块.h
。所以你可以访问你的结构类型。它将不会作为模块包含-它将是内核的一部分。是的,你可以。。。。假设您正试图在以太网驱动程序中使用该结构。该以太网驱动程序还包括
模块.h
。所以你可以访问你的结构类型。这可能是个坏主意。出于模块化的原因,您可能更喜欢提供函数(可能是内联函数)来提供此功能。一个包含数百个全球数据的庞大程序非常混乱,因此社区可能不喜欢你的想法。。。。并且更喜欢由函数定义的干净API。(另外,由于锁定、中断等原因,无法在内核中随意访问全局数据。)@BasileStarynkevitch是的,我考虑过,但实际上我不知道如何实现它。如果你能帮忙,我想把它作为一个答案。谢谢。所以我在下面给出了答复。这可能是个坏主意。出于模块化的原因,您可能更喜欢提供函数(可能是内联函数)来提供此功能。一个包含数百个全球数据的庞大程序非常混乱,因此社区可能不喜欢你的想法。。。。并且更喜欢由函数定义的干净API。(另外,由于锁定、中断等原因,无法在内核中随意访问全局数据。)@BasileStarynkevitch是的,我考虑过,但实际上我不知道如何实现它。如果你能帮忙,我想把它作为一个答案。谢谢。所以我在下面给出了一个回复。Alex想把定义它的头放在顶级include目录下的某个地方