如何将.ko驱动模块固化进系统,并与设备树匹配(全流程详解)
本文基于实际开发经验,详细讲解如何将
.ko内核模块“固化”到嵌入式系统中(即开机自动加载),并正确与设备树匹配,适用于 Linux 驱动开发、内核裁剪、量产部署等场景。
一、背景知识
在嵌入式 Linux 开发中,驱动通常以.ko(kernel object)模块形式存在,便于调试。但在量产阶段,我们常常希望:
- 驱动开机自动加载(无需手动
insmod或modprobe); - 驱动与设备树匹配(通过
compatible自动 probe); - 驱动“固化”进内核(可选,提升可靠性,避免文件系统损坏导致驱动丢失)。
二、把.ko固化进系统:两种主流方式
✅ 方法 1:作为模块,开机自动加载(推荐开发阶段)
步骤如下:
- 将
.ko放入标准模块目录
cpmydrv.ko /lib/modules/$(uname-r)/extra/- 更新模块依赖关系
depmod-a配置开机自动加载
新建文件
/etc/modules-load.d/mydrv.conf,内容写:
mydrv或者写在/etc/rc.local中:
modprobe mydrv- 重启验证
lsmod|grepmydrvdmesg|grepmydrv✅ 方法 2:驱动直接编译进内核(真正“固化”)
适合量产或高可靠性场景,最终内核镜像(如zImage/uImage)中包含驱动代码,不存在.ko文件。
步骤如下:
将驱动源码放入内核树
假设路径为:
drivers/char/myled/myled.c修改 Kconfig,添加配置项
编辑
drivers/char/Kconfig,加入:
config MYLED tristate "LED driver for my board" default y help Say Y here to enable the LED driver on my custom board.修改 Makefile,告诉编译链如何编译
编辑
drivers/char/Makefile,加入:
obj-$(CONFIG_MYLED) += myled.o如果驱动放在子目录,也可在
drivers/char/myled/下新建 Makefile:
> obj-$(CONFIG_MYLED) += myled.o > ``` > 并在 `drivers/char/Makefile` 中加入: > ```makefile > obj-$(CONFIG_MYLED) += myled/ > ``` 4. 配置内核并编译 ```bash make menuconfig # 进入 Device Drivers → Character devices # 确保 [*] LED driver for my board 被选中(* 表示编进内核) make uImage # 或 zImage make dtbs # 若设备树有改动烧录新内核与设备树
使用厂商提供的工具(如
fastboot,dfu,tftp等)烧录。
三、驱动与设备树匹配:让内核自动 probe
✅ 设备树中添加节点
在.dts文件中添加:
myled: myled@12340000 { compatible = "vendor,myled"; reg = <0x12340000 0x1000>; status = "okay"; };✅ 驱动中添加of_match_table
在驱动代码中加入:
staticconststructof_device_idmyled_of_match[]={{.compatible="vendor,myled"},{/* sentinel */}};MODULE_DEVICE_TABLE(of,myled_of_match);staticstructplatform_drivermyled_driver={.probe=myled_probe,.remove=myled_remove,.driver={.name="myled",.of_match_table=myled_of_match,},};四、完整开发流程(推荐顺序)
步骤 操作
1 修改.dts,添加设备节点,编译设备树make dtbs
2 编写驱动源码,确保of_match_table匹配
3 编译驱动为.ko,手动insmod调试
4 调试通过后,将驱动编进内核(make menuconfig→default y)
5 重新编译内核与设备树,烧录,重启验证
五、常见问题 FAQ
问题 解决思路
驱动编进内核后,dmesg 没打印 检查probe是否返回 0,compatible是否匹配
模块无法自动加载 检查/etc/modules-load.d/是否写对模块名,是否执行了depmod -a
设备树节点不识别 用of_find_compatible_node()或dmesg查看是否匹配成功
六、总结一句话
Kconfig 让驱动“看得见”,Makefile 让驱动“编得进”,设备树让驱动“找得到”。
七、参考与致谢
本文内容整理自实际项目经验与社区资料,感谢 Linux 内核社区与各大博客分享者。
如需转载,请注明出处。
欢迎评论区交流嵌入式 Linux 驱动开发经验!
发布时间:2025年12月
CSDN 博客分类:Linux 驱动开发 / 嵌入式系统