尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【Linux 驱动小白教程】三、内核Kconfig Makefile 配置编译全流程

【Linux 驱动小白教程】三、内核Kconfig  Makefile 配置编译全流程 接上篇驱动 Makefile 编写 模块操作全套命令实操前面我们写的是外部独立模块单独编译.koinsmod加载。本篇讲内核源码内部编译流程Kconfig配置菜单、make menuconfig图形配置、默认 defconfig、内核顶层 Makefile 条件编译语法。这是做内核裁剪、平台驱动、把驱动编译进内核 / 编译成模块的必学内容面试高频考点。区分两个场景外部模块我们上一篇写的独立文件夹单独 Makefile编译出.ko不改动内核源码。适合自己写的小驱动。内核内部驱动放到内核源码树里面受Kconfig 内核 Makefile 管控通过make menuconfig选择 y/m/n。适合板级驱动、内核原生驱动。一、内核完整编译配置两条路线内核编译第一步生成.config配置文件.config决定哪些代码编译进内核、哪些编译成模块、哪些不编译。路线 1自定义图形配置make menuconfigarch/$(ARCH)/Kconfig ←——总配置入口 ↓ make menuconfig // 图形菜单界面手动勾选功能 ↓ 生成 .config // 最终配置文件保存所有CONFIG_xxx选项 ↓ make // 根据.config编译内核 zImage 模块koarch/$(ARCH)/Kconfig对应架构的总 Kconfig会source引入各级子目录 Kconfig是整个配置菜单的总入口。.config隐藏文件在内核源码根目录所有CONFIG_XXXy/m/n都写在这里。⚠️注意修改 menuconfig 保存后就是更新根目录.config。路线 2使用板子默认配置 defconfigarch/$(ARCH)/configs/xxx_defconfig //厂商板级默认配置文件 ↓ make xxx_defconfig //把defconfig拷贝生成根目录 .config ↓ make⚠️非常重要考点make xxx_defconfig会直接覆盖根目录已有的.config之前手动 menuconfig 的修改全部丢失开发板拿到官方 defconfig一般流程makexxx_defconfig#载入板子默认配置生成.configmakemenuconfig#在默认配置基础上再做少量自定义修改make-j4二、Kconfig 语法详解make menuconfig 菜单的源文件Kconfig是描述菜单的脚本只负责显示菜单、接收用户选择 (y/m/n)不负责编译真正编译由 Makefile 完成。完整关键字汇总 示例menu 我的测试驱动菜单 # menu 开始一个菜单组 comment 驱动实验选项 # comment菜单界面显示注释文字无配置功能 config MY_TEST_DRIVER # config 配置项生成 CONFIG_MY_TEST_DRIVER bool Enable my test driver # bool只能 y 或者 n不能编译模块m tristate My test tristate driver # tristate三种选择 y/m/n default y # 默认选项 y/m/n depends on ARCH_ARM # depends on依赖只有ARCH_ARM开启本选项才出现 select DMA_SUPPORT # select选中本项自动强制打开 DMA_SUPPORT help This is my test driver for study. Press h in menuconfig view help. choice # choice / endchoice 互斥多选组只能选其中一个(X) prompt 选择传输模式 default MODE_A config MODE_A bool 模式A config MODE_B bool 模式B endchoice source drivers/led/Kconfig # source导入下级目录的Kconfig文件 endmenu # 结束menu菜单关键字逐条小白解释menu ... endmenu一组菜单包裹menuconfig 界面上显示一个折叠菜单。config 配置名定义配置项内核会生成宏CONFIG_配置名。例config MY_TEST→ 对应宏CONFIG_MY_TEST类型bool取值y(选中) /n(不选)不能编译成模块 m。tristate三态y编译进内核镜像 zImagem编译成内核模块.kon不编译string字符串配置填写文本。menuconfig 界面符号含义[*]→ booly[ ]→ booln*→ tristatey编进内核M→ tristatem编译模块 ko → tristaten不编译(X)→ choice 互斥组选中项default y/m/n配置项默认值。help按h查看帮助文档。comment xxx仅仅在菜单打印一行注释文字不会产生 CONFIG 宏。depends on XXX依赖条件只有XXX配置开启当前 config 选项才会显示出来否则灰掉不可选。select XXX只要本项被选中强制自动打开 XXX 配置不需要用户手动勾选。source 路径/Kconfig导入其他目录的 Kconfig内核通过 source 一层层把全部驱动菜单组装起来。易错点Kconfig 只管界面选项写了 Kconfig 不代表代码会编译必须配合 Makefile三、内核源码树内 Makefile 语法条件编译内核各级子目录 Makefile读取.config里面CONFIG_xxx的值决定源码如何编译。1.obj-$(CONFIG_XXX) xxx.o【最高频】obj-$(CONFIG_MY_TEST_DRIVER) mytest.o逻辑如果CONFIG_MY_TEST_DRIVERy→obj-y mytest.o→编译进内核 zImage 镜像如果CONFIG_MY_TEST_DRIVERm→obj-m mytest.o→编译成独立 ko 模块如果CONFIG_MY_TEST_DRIVERn→obj-n mytest.o→不编译该文件这是内核驱动目录最核心写法obj‑$(CONFIG_XXX)会根据.config 自动替换成 obj‑y /obj‑m /obj‑n。2.obj-y subdir/包含子目录obj-y led/ obj-$(CONFIG_SPI) spi/ 目录名/末尾必须带斜杠 /含义编译进入这个子目录执行子目录下的 Makefile。obj-y led/无条件编译 led 子目录obj‑$(CONFIG_SPI) spi/CONFIG_SPI 开启才编译 spi 子目录。对比回顾上篇外部模块 Makefile外部模块直接写obj‑m xxx.o不受 Kconfig 管控。内核树内模块obj‑$(CONFIG_XXX) xxx.o和 Kconfig config 一一绑定。目录层级关系举例drivers/ ├─ Kconfig # source下级各个子目录Kconfig ├─ Makefile # obj-y led/ 包含子目录 └─ led/ ├─ Kconfig # config LED_DRIVER tristate ... └─ Makefile # obj‑$(CONFIG_LED_DRIVER) led_drv.o四、完整实操流程内核内部新增一个自己驱动在drivers/mydrv/新建mydrv.c我们第一篇最简驱动代码drivers/mydrv/Kconfig写 config 配置项tristate 类型drivers/mydrv/Makefile写obj‑$(CONFIG_MYDRV) mydrv.o修改上层drivers/Kconfig增加source drivers/mydrv/Kconfig修改上层drivers/Makefile增加obj‑$(CONFIG_MYDRV) mydrv/make xxx_defconfig载入板级默认配置make menuconfig找到我们菜单选择或者 *make编译内核 模块小坑新增 Kconfig 之后要重新执行一次 defconfig/menuconfig新 CONFIG 项才会写入.config。五、高频踩坑小白总结make xxx_defconfig会覆盖.config手动 menuconfig 修改会丢失想保留自定义先 defconfig 再 menuconfig 微调。Kconfig 写了 configMakefile 没写 obj‑$(CONFIG_XXX)代码不会编译。tristate支持 y/m/nbool只能 y/n不能选 M 模块。obj-y dir/末尾斜杠不能丢代表子目录。depends on是 “有条件显示”select是强制打开别的配置。source关键字用于 Kconfig 导入下级菜单不是 Makefile 语法。本篇知识点速记表配置 / 编译作用make menuconfig图形界面手动配置生成.configmake xxx_defconfig使用板级默认配置覆盖.configmenu / endmenuKconfig 菜单分组config XXXKconfig 定义配置项生成 CONFIG_XXXchoice / endchoiceKconfig 互斥单选组bool / tristateKconfig 变量类型tristate 支持 m 模块depends onKconfig 依赖select强制选中其他选项source xxx/KconfigKconfig 导入下级配置文件obj‑$(CONFIG_XXX) xxx.o内核 Makefile 核心y 编进内核m 编译模块obj-y xxx/Makefile 包含子目录末尾斜杠本篇为专栏入门免费章节完整专栏包含三大基础驱动设备面向入门、内核机制原理讲解面向面试、多套驱动框架配套源码面向工作等内容后续进阶内容仅专栏订阅用户可见点击专栏主页订阅解锁全部教程。
返回列表