2、Linux内核源码获取与版本管理:Git仓库克隆、内核版本选择、源码目录结构解析
好,咱们正式开始动手了。这一章我带你搞定内核源码的获取和版本管理。说白了,就是先把内核代码拿到手,然后知道怎么挑版本、怎么看目录结构。我在车载项目里见过太多人栽在版本选择上——选了个不合适的版本,后面驱动移植改到崩溃。所以这块咱们得认真对待。
2.1 从Git仓库克隆内核源码
获取内核源码,最正统的方式就是Git克隆。我个人习惯直接从Linus Torvalds维护的主线仓库拉取,地址是:
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
这条命令会下载完整的历史记录,大概2-3GB。嗯,这里要注意,如果你网络不太好,可以加个 --depth=1 参数,只拉取最新版本:
git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
我在项目初期调试时,经常用浅克隆,速度快很多。但到了正式开发阶段,我建议还是拉全量历史,因为后面查bug、做版本对比时,历史记录太有用了。
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git
2.2 内核版本选择策略
版本选择这事儿,说白了就是找平衡。太新的版本不稳定,太旧的版本功能缺失。我在车载项目中总结了一套选择逻辑:
| 版本类型 | 特点 | 适用场景 |
|---|---|---|
| LTS(长期支持) | 维护周期长(6年+),bug修复稳定 | 量产车项目,强烈推荐 |
| 主线最新 | 功能最新,但可能有未发现的bug | 原型验证、新硬件支持 |
| 稳定版(-stable) | 基于主线,定期发布修复 | 开发阶段,比主线稳妥 |
我个人建议:车载项目首选LTS版本。比如当前推荐的LTS是6.1.x或5.15.x。为什么?因为车载系统对稳定性要求极高,你想想看,车在路上跑着,中控突然死机了,这可不是闹着玩的。
查看当前可用的LTS版本,可以访问 https://www.kernel.org/,页面上的黄色标记就是LTS版本。或者用Git命令:
git tag -l | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -20
这条命令会列出最近的稳定版本标签。
2.3 切换和管理内核版本
拿到源码后,怎么切换到指定版本?用Git的checkout命令:
git checkout v6.1.25
如果你需要基于某个版本创建自己的分支:
git checkout -b my_car_branch v6.1.25
这样你就可以在自己的分支上做修改,同时还能随时拉取主线的新补丁。我在车载项目中,通常会在LTS版本上建立一个 vendor/ 分支,专门存放我们自己的驱动和配置修改。
2.4 源码目录结构解析
内核源码目录乍一看很吓人,文件夹一大堆。但其实核心目录就那么几个。我带你走一遍:
| 目录 | 作用 | 车载开发关注点 |
|---|---|---|
| arch/ | 架构相关代码,如arm64、x86 | 重点关注arch/arm64/,车载SoC基本都是ARM64 |
| drivers/ | 设备驱动,最大目录 | drivers/gpu/、drivers/media/、drivers/i2c/等 |
| include/ | 头文件,定义内核API | include/linux/、include/uapi/linux/ |
| kernel/ | 核心调度、进程管理 | 一般不改,但要理解 |
| Documentation/ | 文档,开发者的圣经 | 强烈建议多翻翻 |
| scripts/ | 编译、配置脚本 | 配置内核时会用到 |
| net/ | 网络协议栈 | 车载以太网、CAN通信相关 |
嗯,这里我要特别强调一下 drivers/ 目录。它下面有上百个子目录,每个对应一类设备。车载中控最常打交道的几个:
- drivers/gpu/drm/ — 显示驱动,中控屏幕显示全靠它
- drivers/media/ — 摄像头、视频输入,倒车影像、环视系统
- drivers/input/ — 触摸屏、按键输入
- drivers/i2c/ — I2C总线驱动,很多传感器都挂在这上面
- drivers/spi/ — SPI总线驱动,部分显示屏和音频芯片用
举个例子,如果你要调试中控屏的显示问题,大概率要钻进 drivers/gpu/drm/ 目录。我在一个项目中遇到过屏幕闪烁的问题,最后定位到是DRM驱动中某个时序参数配置不对,改了一行代码就解决了。
2.5 理解内核版本号的含义
内核版本号不是随便写的,它有一套规则。比如 6.1.25:
- 6 — 主版本号,重大架构变化
- 1 — 次版本号,奇数表示开发版,偶数表示稳定版
- 25 — 修订号,bug修复和小的更新
所以 6.1.25 表示:主版本6,次版本1(稳定版),第25次修订。你想想看,如果看到 6.2-rc1,那就是6.2版本的第一个候选发布版,还在测试阶段,不适合量产。
2.6 验证源码完整性
代码下载完了,怎么确认没损坏?内核仓库提供了签名验证机制。Linus Torvalds会用他的GPG密钥给每个发布版本签名。验证命令:
git tag -v v6.1.25
如果输出显示 Good signature from "Linus Torvalds ...",说明代码是完整的、未被篡改的。我在团队里强制要求每次拉取新版本都要做这个验证,特别是从镜像站下载时。
好了,这一章的内容就这些。你拿到源码、选好版本、理解了目录结构,下一步就可以开始配置和裁剪内核了。下一章我会带你实战内核配置,咱们把那些用不上的模块统统砍掉,让内核轻装上阵。