目录
1.基础概念
1.1 内核是怎么管理代码的?
1.2 三个关键文件
1.3 三个编译状态
1.4 配置变量
2. 如何添加驱动(完整步骤)
第1步:在 drivers/char/Makefile 中增加目录引用
第2步:在 drivers/char/fire_led/ 下创建你自己的 Makefile
第3步:在 drivers/char/fire_led/ 下创建 Kconfig 文件
第4步:让上级Kconfig包含你的Kconfig
第5步:生成并修改 .config 配置
第6步:编译内核
3. 内核裁剪简述
1.基础概念
1.1 内核是怎么管理代码的?
内核源码由成千上万个文件组成,分散在不同目录下。
每个目录下都有一个Makefile和一个Kconfig文件,它们决定了哪些代码被编译,以及如何让用户选择。
1.2 三个关键文件
| 文件 | 作用 |
|---|---|
| Makefile | 告诉编译系统哪些文件要编译,编译成什么(是编进内核镜像,还是编成独立的模块) |
| Kconfig | 定义配置选项,这些选项会出现在make menuconfig的图形菜单里 |
| .config | 存储你最终选择的所有配置项(y/n/m),编译时依据这个文件 |
Kbuild是Linux 内核自己的构建系统(Kernel Build System),作用是:
负责根据配置(.config)决定哪些代码需要编译、怎么编译、生成内核镜像和模块。
简单理解:
Make是工具Makefile是规则文件- Kbuild 是 Linux 内核定义的一套 Makefile 规则和框架
- 最终执行编译、链接等动作的还是
make,但 Kbuild 提供了一套内核约定的规则、变量和流程,把复杂的编译管理封装起来
1.3 三个编译状态
obj-y→ 编译进内核镜像(固定在内核里,开机就有)obj-m→ 编译成独立的模块(.ko文件,可以手动加载/卸载)obj-(空) → 不编译
1.4 配置变量
在Kconfig中定义的
config FOO,会生成变量CONFIG_FOO。这个变量的值(y/m/n)由
.config决定,Makefile通过obj-$(CONFIG_FOO)来引用它。
2. 如何添加驱动(完整步骤)
假设想在drivers/char/下新建一个目录fire_led/,里面放你的驱动源码led_cdev.c。
第1步:在drivers/char/Makefile中增加目录引用
打开drivers/char/Makefile,添加下面任意一行(选一种):
obj-$(CONFIG_FIRE_ABC) += fire_led/ # 由配置决定是否编译该目录 # 或者 obj-y += fire_led/ # 总是编译该目录(不推荐,最好用配置控制)
第2步:在drivers/char/fire_led/下创建你自己的 Makefile
新建文件drivers/char/fire_led/Makefile,内容如下:
obj-$(CONFIG_GXA_LED) += led_cdev.o
这表示:如果CONFIG_GXA_LED被定义为y或m,则编译led_cdev.c成目标文件。
第3步:在drivers/char/fire_led/下创建 Kconfig 文件
新建drivers/char/fire_led/Kconfig,内容示例:
menuconfig FIRE_ABC bool "Fire LED Framework" help 这是驱动框架的菜单项,选上它才能看到子选项。 config GXA_LED tristate "support fire led" depends on FIRE_ABC help 这是具体的LED驱动,依赖上面的FIRE_ABC。
bool→ 只能选 y 或 n(编入内核或不编)tristate→ 可以选 y / m / n(编入内核、模块、不编)depends on→ 只有父项被选中,该项才可见
第4步:让上级Kconfig包含你的Kconfig
打开drivers/char/Kconfig,在合适位置添加:
source "drivers/char/fire_led/Kconfig"
这样,在make menuconfig时就能看到你的菜单了。
第5步:生成并修改 .config 配置
# 先使用参考配置(以arm架构为例)这一步也可以使用自己的准备好的shell脚本导入arch 以及编译器的变量make ARCH=arm npi_v7_defconfig # 然后打开图形配置界面 make ARCH=arm menuconfig在菜单中找到Fire LED Framework并选上,再进入子项support fire led,按需求选y或m。
保存退出后,.config中会自动出现:
CONFIG_FIRE_ABC=y CONFIG_GXA_LED=m # 或 y
第6步:编译内核
make -j4
如果选的是
y,驱动会编译进内核镜像(zImage)。如果选的是
m,会生成led_cdev.ko模块文件。
3. 内核裁剪简述
裁剪就是通过
make menuconfig取消不需要的功能,减小内核体积。原则:去掉
obj-y中不必要的模块,或把y改成m(如果可能)。常用命令:
make menuconfig里按空格切换状态,/搜索选项。
现在不再大量依赖 machine_desc 进行板级初始化,machine_desc 主要用于 DT 平台匹配和少量早期初始化。