Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 linux.ko中用于多个设备的全局变量_C_Linux_Linux Kernel_Driver - Fatal编程技术网

C linux.ko中用于多个设备的全局变量

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系统的Wi-Fi驱动程序(一个.ko文件),我的主板上有两个相同的Wi-Fi设备。将.ko文件插入内核后,系统能够驱动这两个Wi-Fi设备

我的问题是:如果驱动程序的源代码包含全局变量(和静态变量),那么这两个设备是否共享同一组变量?或者,每个设备将有两个驱动程序实例


谢谢

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驱动程序探测两次,而第二个驱动程序未探测。