如何在Yocto Project中构建Linux内核in-tree树内模块?
Yocto 环境下in-tree树内内核模块构建步骤
你已经掌握out-of-tree模块编译的基础,做in-tree构建只需要按下面的流程操作即可,全程不需要手动修改Yocto临时工作目录里的内核源码,符合Yocto可复现构建的规范。
第一步:给内核源码树添加模块编译规则
in-tree模块的编译逻辑由内核源码树自带的Kconfig、Makefile体系管理,自定义模块优先放到drivers/misc/目录(内核预留的杂项驱动目录,新手不需要额外适配目录的层级配置):
- 把你的
custom_lkm.c源码文件放到对应目录 - 修改同目录下的
Kconfig文件,添加模块的配置项入口,示例如下:
config CUSTOM_LKM tristate "Custom LKM: custom_lkm" default m help Custom kernel module, select m to build as loadable .ko, select y to build directly into kernel image.
这里tristate代表配置支持三态:y编进内核镜像、m编译为可加载ko模块、n不编译;default m代表默认编译为ko模块,和你之前out-of-tree的产物形式一致。
- 修改同目录下的
Makefile文件,添加模块的编译关联规则:
obj-$(CONFIG_CUSTOM_LKM) += custom_lkm.o
注意CONFIG_后缀必须和Kconfig里config后面的标识完全一致,否则不会触发编译。
上面两个文件的修改不要直接在tmp目录的内核源码里改,做成git patch格式,存到你自己的自定义meta层里即可。
第二步:通过Yocto内核recipe整合改动
在你自定义meta层的recipes-kernel/linux/路径下创建内核的bbappend扩展文件,命名格式为linux-yocto_%.bbappend(通配符%会自动匹配你当前使用的所有linux-yocto版本,不需要针对特定版本写死文件名):
- 在文件里通过
SRC_URI变量引用你准备好的源码、Kconfig补丁、Makefile补丁、内核配置片段:
SRC_URI += "file://custom_lkm.c \ file://0001-add-custom-lkm-config-entry.patch \ file://0002-add-custom-lkm-build-rule.patch \ file://custom_lkm.cfg \ "
- 新建
custom_lkm.cfg内核配置片段,内容只有一行,用来显式启用你的模块配置:
CONFIG_CUSTOM_LKM=m
Yocto构建内核时会自动合并这个配置片段,不需要手动跑menuconfig修改内核配置。
第三步:构建与验证
- 执行内核构建命令:
bitbake virtual/kernel - 构建完成后,生成的
custom_lkm.ko会被自动部署到rootfs的/lib/modules/<对应内核版本>/kernel/drivers/misc/路径下,烧录镜像启动设备后,不需要手动拷贝ko文件,直接执行modprobe custom_lkm即可完成加载。如果需要开机自动加载,只需要添加一行modules-load配置,不需要额外写部署脚本。
新手常见注意点
- 版本一致性问题:in-tree模块和内核是同一次构建产出,不会出现out-of-tree模块常见的version magic不匹配导致的加载失败问题。
- 内置模块选项:如果不需要ko形式,想把模块功能直接编进内核镜像,只需要把cfg文件里的
CONFIG_CUSTOM_LKM=m改成CONFIG_CUSTOM_LKM=y,系统启动后模块功能直接生效,不需要执行加载操作。 - 构建规范问题:所有源码、配置改动都必须放在自定义meta层通过bbappend引入,不要直接修改tmp工作目录下的内核源码,Yocto清理临时目录时会直接丢弃这些改动,也无法保证构建可复现。
内容的提问来源于stack exchange,提问作者Đức Nghĩa Phùng
相关产品推荐
相关产品推荐

