Linux内核模块 - 在源文件之间共享变量

时间:2018-04-06 20:29:20

标签: linux linux-kernel kernel-module

我正在尝试将内核模块链接到非LKM源文件。问题是,我遇到了一些问题。这两个文件的名称是chardev.c(LKM)和foo.c。

我的Makefile:

obj-m += chardev.o
obj-y += foo.o

all:
    make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
    $(CC) test.c -o test
clean:
    make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
    rm test 

在chardev.c中我有以下代码行:extern int foo;,而在foo中我有以下代码行:int foo = 123;。 (两行都在文件范围内。)

运行make时,我得到以下输出:

make -C /lib/modules/4.4.0-31-generic/build/ M=/home/kylemart/Desktop/Device-Driver modules
make[1]: Entering directory `/usr/src/linux-headers-4.4.0-31-generic'
  CC [M]  /home/kylemart/Desktop/Device-Driver/chardev.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "foo" [/home/kylemart/Desktop/Device-Driver/chardev.ko] undefined!
  CC      /home/kylemart/Desktop/Device-Driver/chardev.mod.o
  LD [M]  /home/kylemart/Desktop/Device-Driver/chardev.ko
make[1]: Leaving directory `/usr/src/linux-headers-4.4.0-31-generic'
cc test.c -o test

似乎事情没有正确连接。我做错了什么?

修改

这似乎有效,但有一个问题:

obj-m += chardev.o
chardev-objs += foo.o

all:
    make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
    $(CC) test.c -o test
clean:
    make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
    rm test  

虽然在没有警告的情况下进行编译,但在安装已编译的模块(即sudo insmod chardev.ko)之后,/dev中没有新设备。以前,在不尝试链接源文件的情况下,如前所述安装内核模块会创建一个设备文件。也就是说,运行lsmod时设备存在。

1 个答案:

答案 0 :(得分:2)

您的all目标只构建模块,但不构建内核,因此那里不存在foo符号。

在将内核(此处为foo.c)编译到内核中时,必须将makefile集成到内核源代码中。例如。你必须添加

obj-y += my-driver/

到上一个目录中的makefile并构建整个内核。您应该从makefile中删除all:clean:目标,以避免与内核内置规则冲突。

foo.c必须包含

EXPORT_SYMBOL(foo);

EXPORT_SYMBOL_GPL(foo);

第二个makefile ......

只会生成chardev.ko模块,该模块仅由foo.c构建;不会使用chardev.c。当你真的想要这个时,你必须改变文件名; e.g。

obj-m += chardev.o
chardev-objs = chardev-core.o foo.o