我正在设计两个模块——一个是类,第二个是设备驱动程序。我的问题是最后的两个
.ko
模块都不是内置的,也没有调用来探测设备树中的设备 - 当我插入类,然后使用 insmod 插入驱动程序时,才会创建设备文件。
我把文件放到package/kernel/mypackage目录下,Makefile包含
define KernelPackage/mypackage
...
FILES:= $(PKG_BUILD_DIR)/mydriver.ko $(PKG_BUILD_DIR)/myclass.ko
AUTOLOAD:=$(call AutoLoad,30,mypackage,1)
...
endef
然后有
src/
目录,其中包含源文件和 Makefile
obj-m += myclass.o
obj-m += mydriver.o
当我运行
make V=s package/kernel/mypackage/{clean,compile}
时,我在屏幕上看到“need-built-in=1”,当我刚刚运行make V=s
时,我看不到它。
接下来,如果我将
obj-m
更改为 obj-y
,事情将完全停止编译,进程会抱怨缺少 .ko 文件(工作目录中确实缺少这些文件)。
我做错了什么?
我把文件放到package/kernel/mypackage目录下
所以你的模块的源代码是out-of-tree,即......与内核源代码树分开。
“in-tree”模块的源代码,即......内核源代码树的一部分,可以构建为可加载模块(即单独的 .ko 文件)或静态链接到内核映像(又名“built-in”)。
但是“树外”代码(例如您的模块)只能构建为可加载模块。您将其构建到内核中的努力将是徒劳的。
我做错了什么?
您已将文件放在错误的位置。Kconfig您可以将代码合并到内核源代码树副本中适当的子目录中,然后为您的模块定义新的 CONFIG_MYDRIVER 构建符号,并修改适当的
和
Makefile文件以支持您的新模块。 或者将您的代码留在树外并构建一个可加载模块。然后正确安装
.ko文件以在启动期间自动加载模块(即在挂载 rootfs 之后但在用户空间启动之前);请参阅内核模块如何自动加载。如果使用 ARM SoC,请注意需要指定驱动程序的正确编写的设备树,例如请参阅内核模块中的驱动程序代码不执行?。