图解 Linux 驱动编译进内核的完整工作流程

这张图演示把自己写的 hello 字符驱动,添加进 Linux 内核源码树,通过 menuconfig 配置,最终编译进 zImage 内核镜像的整套原理,一步步拆解:

1. 驱动源码文件

/driver/char/hello.c

写驱动代码,里面包含入口module_init()、出口module_exit()函数,这是驱动本身的逻辑。

/driver/char/Kconfig里添加这段配置:

复制代码
 config HELLO
    bool "this is first drv test"
    default y
    help
    this is test dev ,auth, YAS;

注:

  • config HELLO:定义宏名CONFIG_HELLO
  • bool:二选一选项(Y 编译进内核 / N 不编译,没有 M 模块)
  • "this is first drv test":就是make menuconfig图形菜单上显示的文字(图里红框选中的那一行)
  • default y:默认选中

作用:运行make menuconfig时,在字符设备菜单里多出一条【this is first drv test】选项,可以手动选择开启 / 关闭。

3. 子目录 Makefile:根据宏决定是否编译 hello.c

driver/char/Makefile添加代码:

复制代码
obj-$(CONFIG_HELLO) += hello.o

含义:

  • 如果 menuconfig 里选 Y:.config中生成CONFIG_HELLO=y → obj-y += hello.o,把 hello.c 编译成 hello.o,链接进内核
  • 如果选 N:.config中生成CONFIG_HELLO=n → 这一行失效,不会编译 hello.c

4. .config 配置文件

执行make menuconfig保存配置后,内核根目录生成.config文件,里面记录所有选项,包括CONFIG_HELLO=y。

.config就是整个内核编译的总开关,决定哪些.c 文件最终会编译打包进 zImage。

5. 顶层 Makefile 递归编译

内核顶层 Makefile 执行编译时,会递归读取各个子目录的 Makefile (driver/char/Makefile),根据.config里的宏,选择性编译对应的源码。

6. 最终结果

编译内核后,hello 驱动被编译链接进arch/arm/boot/zImage内核镜像,就是前面那条cp命令复制的文件。开发板 u-boot 通过 tftp 加载 zImage 启动,驱动会在内核启动时自动执行module_init。

一句话总结该过程

hello.c(驱动代码) + Kconfig(菜单选项) → make menuconfig 勾选 → 保存到.config → 子目录 Makefile 根据.config 决定是否编译 hello.c → 编译完成,驱动打包进 zImage。

相关推荐
刚入门的大一新生26 分钟前
Linux-线程概念
linux·jvm
H.莓飛35 分钟前
【数据结构】排序总结与规模实测
linux·服务器·开发语言·数据结构·visual studio·1024程序员节
xianyuCcCcCCCcc37 分钟前
Kubernetes :健康检查、认证授权与可视化面板
运维·云原生·kubernetes·dashboard
Zenova EdgeOS1 小时前
Linux 日志实战:用 journalctl 精准检索与治理工业边缘日志
linux·运维·chrome
Dory_Youth1 小时前
电脑的搜索功能不能用,一搜就黑屏闪退
运维·笔记
Dxy12393102161 小时前
Linux 压缩解压相关命令介绍
linux·运维·服务器
eleven_4u1 小时前
QPS如何计算,如何部署架构
java·linux·运维·jvm·中间件
云飞云共享云桌面2 小时前
非标自动化工厂研发部门怎么实现一台服务器带10个SolidWorks设计并发
运维·服务器·人工智能·3d·自动化·电脑·制造
分布式存储与RustFS2 小时前
你的网站备份只存一块盘?把 1Panel 的备份目标换成 RustFS
运维·开源·备份·对象存储·1panel·s3·rustfs
遇见小修修2 小时前
打印机无法连接故障:操作误区汇总与排查教程
运维·服务器