首页 > 解决方案 > 如何在用 C 编写的内核模块中包含 linux 驱动程序源文件?

问题描述

我目前正在编写一个需要包含来自 linux 驱动程序源代码的文件的 linux 内核模块。我要包含的特定文件是:https ://elixir.bootlin.com/linux/latest/source/drivers/nvme/host/nvme.h

但该/lib/modules/$(shell uname -r)/build目录不包含该drivers文件夹。我试过这样做sudo apt-get install linux-headers-$(shell uname -r),但这也不包括驱动程序头文件。我的 Makefile 看起来像这样:

obj-m += hello_world.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

然后,我尝试对最接近我的内核版本的内核版本进行完整的内核检查(我找不到我的内核版本的确切源代码。)我指出我的 Makefile 使用该版本,但是当我尝试插入内核模块,它会抛出Invalid module format错误并dmesg显示no symbol version for module layout. 我的源目录确实包含该Module.symvers文件,但它仍然会引发此错误。我相信如果我以某种方式使用我当前的 linux 源代码,这个错误可以得到解决。

那么,获取驱动程序头文件并在内核模块中使用它们的最佳方法是什么。任何帮助,将不胜感激。

标签: linuxlinux-kernelkernelkernel-modulenvme

解决方案


我看到你正在使用apt. 在这种情况下,您只需启用源存储库(参见此处此处了解如何),然后获取包的源代码,即可为您的内核获取正确的源代码:

$ sudo apt-get update
$ sudo apt-get source linux-image-$(uname -r)

在此之后,您将在当前目录中拥有以下文件:

linux-XXX/
linux_XXX.tar.xz
linux_XXX.dsc
linux_XXX.orig.tar.xz

第一个是包含已安装内核的正确源代码的文件夹。然后,您将能够#include获得模块所需的标题。


推荐阅读