第1章:Linux内核源码结构——从目录到裁剪,一个老司机的实战笔记
各位同学,大家好。我是老李,在车载Linux这行摸爬滚打了十多年。今天咱们开始《车载Linux内核移植与驱动开发实战》的第一课。
内核源码,说白了就是Linux操作系统的“心脏”。你想想看,一个车载系统要跑得稳、跑得快,内核必须得调教好。很多新手一上来就急着写驱动,结果连内核源码长啥样都不清楚,这肯定不行。
我个人习惯,拿到一个新平台,第一件事就是先把内核源码的目录结构摸一遍。就像你到一个新城市,先看地图一样。今天我就带大家把这张“地图”给画出来。
1.1 内核源码目录分析——别被文件夹吓到
先说说内核源码的顶层目录。你解压一个Linux内核源码包,会看到一堆文件夹。别慌,其实有规律可循。
我列个表,大家先有个整体印象:
| 目录名 | 作用 | 车载开发中的重要性 |
|---|---|---|
| arch/ | 架构相关代码,比如ARM、x86 | ⭐⭐⭐⭐⭐ 移植核心 |
| drivers/ | 设备驱动,占源码一半以上 | ⭐⭐⭐⭐⭐ 天天打交道 |
| kernel/ | 核心调度、进程管理等 | ⭐⭐⭐ 一般不动 |
| fs/ | 文件系统实现 | ⭐⭐⭐ 了解即可 |
| include/ | 头文件,各种宏定义 | ⭐⭐⭐⭐ 经常引用 |
| mm/ | 内存管理 | ⭐⭐⭐ 调优时用 |
| net/ | 网络协议栈 | ⭐⭐⭐ 车载以太网相关 |
| scripts/ | 编译脚本、工具 | ⭐⭐ 偶尔用 |
| Documentation/ | 官方文档 | ⭐⭐ 查资料用 |
嗯,这里要注意。arch/目录是咱们做车载移植的重中之重。为什么?因为车载芯片大多是ARM架构,比如瑞萨R-Car、NXP i.MX系列。你想想看,没有arch/目录下的启动代码,内核连跑都跑不起来。
我在项目中遇到过一件事。有次移植一个新平台,内核死活起不来。查了三天,最后发现是arch/arm/mach-xxx/下的板级文件里,GPIO初始化顺序写错了。你说冤不冤?所以啊,这个目录你得当宝贝一样研究。
1.2 Kconfig/Makefile体系——内核的“菜单”和“菜谱”
好,目录结构看完了。接下来咱们聊聊Kconfig和Makefile。这两个东西,说白了就是内核的“菜单”和“菜谱”。
Kconfig 是菜单。你运行 make menuconfig 时看到的那些选项,都是从Kconfig文件里读出来的。每个驱动、每个功能模块,都有自己的Kconfig。
Makefile 是菜谱。它告诉编译器,哪些文件要编译,怎么编译,编译成什么。
我给大家看个实际例子。假设我们要在车载系统中添加一个SPI驱动:
// drivers/spi/Kconfig 中的一段
config SPI_MY_CAR
tristate "My Car SPI Controller"
depends on SPI
help
This is a SPI controller driver for my car project.
Say Y here if you want to support this device.
对应的Makefile是这样写的:
// drivers/spi/Makefile
obj-$(CONFIG_SPI_MY_CAR) += spi-my-car.o
你看,Kconfig里定义了 CONFIG_SPI_MY_CAR 这个配置项。Makefile里用 obj-$(CONFIG_SPI_MY_CAR) 来决定是否编译 spi-my-car.o。这套机制,说白了就是“配置驱动编译”。
tristate 表示可以编译进内核(Y)、编译成模块(M)、或者不编译(N)。车载系统里,我建议能用Y的就别用M,减少模块加载的麻烦。
1.3 内核配置裁剪方法——给内核“瘦身”
车载系统资源有限,Flash空间就那么几十MB。你不能把整个内核都塞进去,得裁剪。怎么裁?我总结了三板斧。
第一板斧:删掉不用的架构
你用的是ARM,那就把x86、MIPS、RISC-V的代码全删了。在 make menuconfig 里,进入 General setup -> Subarchitecture,只保留你需要的。
第二板斧:关掉调试选项
很多内核默认开了大量调试选项,比如 DEBUG_KERNEL、DEBUG_INFO。这些在生产环境里完全没用,还占空间。我建议全部关掉。
# 在 .config 文件中
# CONFIG_DEBUG_KERNEL is not set
# CONFIG_DEBUG_INFO is not set
# CONFIG_DYNAMIC_DEBUG is not set
第三板斧:只保留需要的驱动
车载系统用不到Wi-Fi?那就把 CONFIG_WLAN 关了。用不到蓝牙?CONFIG_BT 也关了。我曾经裁剪过一个内核,从30MB裁到了8MB,就是靠这一招。
CONFIG_PM(电源管理)给关了。结果车载系统一休眠就醒不过来。嗯,裁剪要谨慎,特别是电源管理、时钟、中断这些基础功能,千万别乱动。
给大家一个实用的裁剪流程:
- 先
make defconfig生成默认配置 - 再
make menuconfig手动裁剪 - 保存为
.config文件 - 用
make savedefconfig生成最小配置 - 把最小配置放到
arch/arm/configs/下,方便以后复用
你看,这套流程走下来,你的内核配置就清爽多了。我每次做新项目,都会把裁剪后的配置保存起来,下次直接 make xxx_defconfig 就能用,省时省力。
小结
今天咱们聊了内核源码的目录结构、Kconfig/Makefile体系,还有裁剪方法。说白了,就是让你知道内核源码长啥样,怎么配置,怎么瘦身。
下一章,我会带大家动手搭建交叉编译环境,真正开始移植内核。到时候,咱们把今天学的知识用起来。
记住,做车载Linux,内核是根基。根基不牢,地动山摇。好好消化今天的内容,有问题随时交流。
—— 老李,一个在车载Linux路上走了十年的工程师