努力制作内置模块

问题描述 投票:0回答:1

我正在设计两个模块——一个是类,第二个是设备驱动程序。我的问题是最后的两个

.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 文件(工作目录中确实缺少这些文件)。

我做错了什么?

kernel-module openwrt
1个回答
0
投票

我把文件放到package/kernel/mypackage目录下

所以你的模块的源代码是out-of-tree,即......与内核源代码树分开。

“in-tree”模块的源代码,即......内核源代码树的一部分,可以构建为可加载模块(即单独的 .ko 文件)或静态链接到内核映像(又名“built-in”)。 但是“树外”代码(例如您的模块)只能构建为可加载模块。您将其构建到内核中的努力将是徒劳的。
我做错了什么?

您已将文件放在错误的位置。

您可以将代码合并到内核源代码树副本中适当的子目录中,然后为您的模块定义新的 CONFIG_MYDRIVER 构建符号,并修改适当的
Kconfig

Makefile

文件以支持您的新模块。 或者将您的代码留在树外并构建一个可加载模块。然后正确安装

.ko

文件以在启动期间自动加载模块(即在挂载 rootfs 之后但在用户空间启动之前);请参阅内核模块如何自动加载。如果使用 ARM SoC,请注意需要指定驱动程序的正确编写的设备树,例如请参阅内核模块中的驱动程序代码不执行?

© www.soinside.com 2019 - 2024. All rights reserved.