
这张图演示把自己写的 hello 字符驱动,添加进 Linux 内核源码树,通过 menuconfig 配置,最终编译进 zImage 内核镜像的整套原理,一步步拆解:
1. 驱动源码文件
/driver/char/hello.c
写驱动代码,里面包含入口module_init()、出口module_exit()函数,这是驱动本身的逻辑。

2. Kconfig:在 menuconfig 菜单增加选项
/driver/char/Kconfig里添加这段配置:
config HELLO
bool "this is first drv test"
default y
help
this is test dev ,auth, YAS;
注:
config HELLO:定义宏名CONFIG_HELLObool:二选一选项(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。