news 2025/12/21 13:03:44

经过一个下午的奋战,终于明白!!!如何将 `.ko` 驱动模块固化进系统,并与设备树匹配(全流程详解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
经过一个下午的奋战,终于明白!!!如何将 `.ko` 驱动模块固化进系统,并与设备树匹配(全流程详解)

如何将.ko驱动模块固化进系统,并与设备树匹配(全流程详解)

本文基于实际开发经验,详细讲解如何将.ko内核模块“固化”到嵌入式系统中(即开机自动加载),并正确与设备树匹配,适用于 Linux 驱动开发、内核裁剪、量产部署等场景。


一、背景知识

在嵌入式 Linux 开发中,驱动通常以.ko(kernel object)模块形式存在,便于调试。但在量产阶段,我们常常希望:

  1. 驱动开机自动加载(无需手动insmodmodprobe);
  2. 驱动与设备树匹配(通过compatible自动 probe);
  3. 驱动“固化”进内核(可选,提升可靠性,避免文件系统损坏导致驱动丢失)。

二、把.ko固化进系统:两种主流方式

✅ 方法 1:作为模块,开机自动加载(推荐开发阶段)

步骤如下:

  1. .ko放入标准模块目录
cpmydrv.ko /lib/modules/$(uname-r)/extra/
  1. 更新模块依赖关系
depmod-a
  1. 配置开机自动加载

    新建文件/etc/modules-load.d/mydrv.conf,内容写:

mydrv

或者写在/etc/rc.local中:

modprobe mydrv
  1. 重启验证
lsmod|grepmydrvdmesg|grepmydrv

✅ 方法 2:驱动直接编译进内核(真正“固化”)

适合量产或高可靠性场景,最终内核镜像(如zImage/uImage)中包含驱动代码,不存在.ko文件。

步骤如下:

  1. 将驱动源码放入内核树

    假设路径为:

drivers/char/myled/myled.c
  1. 修改 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.
  1. 修改 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 # 若设备树有改动
  1. 烧录新内核与设备树

    使用厂商提供的工具(如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 menuconfigdefault 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 驱动开发 / 嵌入式系统


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/17 16:36:04

python中模型加速训练accelerate包的用法

文章目录介绍应用示例适配训练环境快速启动分布式训练推理时的显存优化优势介绍 accelerate 最核心的价值是简化大模型训练 / 推理的硬件适配&#xff0c;它抽象了不同硬件&#xff08;单卡、多卡、CPU、TPU、GPU 混合精度&#xff09;的底层差异&#xff0c;让你用一套代码就…

作者头像 李华
网站建设 2025/12/17 16:34:29

科技发展的ai

科技发展的双重赋能与治理困境&#xff1a;在创新与平衡中探寻可持续路径摘要科技发展作为人类文明进步的核心驱动力&#xff0c;在重塑经济结构、优化生活方式、破解全球难题等方面展现出颠覆性力量。从智能手机普及到人工智能赋能产业升级&#xff0c;从绿色技术革新到跨领域…

作者头像 李华
网站建设 2025/12/17 16:34:18

Java基础阶段练手项目清单

Java基础阶段练手项目清单这份清单覆盖语法应用、逻辑训练、简单数据处理等核心能力&#xff0c;适合刚学完基础语法的新手&#xff0c;无需框架&#xff0c;只用JDK即可完成。1. 控制台计算器- 核心需求&#xff1a;实现加、减、乘、除、取余运算&#xff0c;支持输入两个数字…

作者头像 李华
网站建设 2025/12/17 16:33:47

30、Linux系统操作与资源指南

Linux系统操作与资源指南 1. info工具的操作 info工具是Linux系统中常用的帮助工具,其相关文件存放在 /usr/share/info 目录下。在info工具中,有一些常用的组合键操作,如下表所示: | 组合键 | 操作 | | — | — | | 空格键、PageDown | 向下滚动到下一页 | | 退格键…

作者头像 李华
网站建设 2025/12/17 16:33:47

9.有人网络转RS485模块的使用

可能是水平问题&#xff0c;个人不太喜欢用QT的串口类&#xff0c;进行开发&#xff0c;宁可转一下。有人的网络转RS485&#xff0c;比较喜欢用。这里记录一下&#xff0c;使用方法&#xff1a;设置成服务端&#xff1a;然后&#xff0c;保存重启即可。此时模块就变成一个网络转…

作者头像 李华
网站建设 2025/12/17 16:33:01

HSWeb框架企业级权限管理系统终极指南:从入门到精通

HSWeb框架企业级权限管理系统终极指南&#xff1a;从入门到精通 【免费下载链接】hsweb-framework hsweb (haʊs wɛb) 是一个基于spring-boot 2.x开发 ,首个使用全响应式编程的企业级后台管理系统基础项目。 项目地址: https://gitcode.com/gh_mirrors/hs/hsweb-framework …

作者头像 李华