C linux.ko中用于多个设备的全局变量
我有一个用于嵌入式Linux系统的Wi-Fi驱动程序(一个.ko文件),我的主板上有两个相同的Wi-Fi设备。将.ko文件插入内核后,系统能够驱动这两个Wi-Fi设备 我的问题是:如果驱动程序的源代码包含全局变量(和静态变量),那么这两个设备是否共享同一组变量?或者,每个设备将有两个驱动程序实例C linux.ko中用于多个设备的全局变量,c,linux,linux-kernel,driver,C,Linux,Linux Kernel,Driver,我有一个用于嵌入式Linux系统的Wi-Fi驱动程序(一个.ko文件),我的主板上有两个相同的Wi-Fi设备。将.ko文件插入内核后,系统能够驱动这两个Wi-Fi设备 我的问题是:如果驱动程序的源代码包含全局变量(和静态变量),那么这两个设备是否共享同一组变量?或者,每个设备将有两个驱动程序实例 谢谢 Linux内核模块链接到内核中的方式与任何文件在C中的链接方式相同。如果它们具有全局变量,则每个全局变量只有一个副本。他们甚至可以使用来自其他模块的全局变量。单个驱动程序支持多个设备是正常的 虽然
谢谢 Linux内核模块链接到内核中的方式与任何文件在C中的链接方式相同。如果它们具有全局变量,则每个全局变量只有一个副本。他们甚至可以使用来自其他模块的全局变量。单个驱动程序支持多个设备是正常的 虽然一些模块的变量在不同的设备之间共享,但大多数变量存储在设备特定的结构中
当为设备“A”调用驱动程序函数时,它接受指向设备特定结构“data-A”的指针。使用此指针,函数提取“A”的参数。当为设备“B”调用相同的函数时,它接受指向另一个设备特定结构“data-B”的指针。谢谢。如果我定义
inta代码>在一个驱动程序的一个.c文件中,并定义了另一个inta
在另一个驱动程序的另一个.c文件中,编译内核时是否会发出重新定义错误?否,不共享来自不同模块的同名全局变量。使用insmod
将模块加载到内核时,将根据从内核和所有已加载模块收集的导出符号集执行链接。无法加载模块,该模块导出(使用导出符号)符号,该符号由已加载的模块导出。默认情况下,具有全局可见性的符号不会导出,因此它们不会共享。是的,正如@Tsyvarev所说的那样,您需要导出\u SYMBOL
,以使其对其他模块可见。通常是使用一个.c
创建一个.o
来生成一个.ko
。但是,可以使用多个.c
文件(即多个.o
文件)创建模块。这些需要全局符号来通信/链接。globals主要用于最终.ko
的[内部]链接。应该由其他模块可见/可用的模块用EXPORT\u SYMBOL
标记。这类似于从多个.o
文件构建的共享库。并不是所有的全局变量都是的一部分。所以ABI,所以非ABI变量(通常通过链接器脚本)被省略了@guanboshen是的,不用担心。。。正如我[和其他人]所指出的,当最后的.ko
链接完成时,只有导出符号
符号定义是全局可见的(例如,如果.o
有一个普通的全局,它会“神奇地”降级为[相当于]静态定义)。但是,如果模块X有一个外部符号foo
[但没有定义],模块Y有一个EXPORT\u符号(foo)
,那么必须首先加载Y
,然后X
将使用上周我在我的电路板上测试的Y的foo
定义。驱动程序只初始化一次(module_init),并探测两次,因为板上连接了两个设备。全局变量(位于.c文件顶部的静态变量)由两个设备共享。我进一步将代码复制到另一个目录,更改驱动程序名(以及代码中的资源名)并编译。Linux能够加载两个.ko驱动程序,并且每个驱动程序初始化一次。第一个insmod ed驱动程序探测两次,而第二个驱动程序未探测。