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、做版本对比时,历史记录太有用了。

小技巧: 如果你在国内,访问kernel.org可能比较慢。可以用清华或中科大的镜像源,速度会快不少。比如: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。为什么?因为车载系统对稳定性要求极高,你想想看,车在路上跑着,中控突然死机了,这可不是闹着玩的。

避坑指南: 我曾经在一个项目中选了当时最新的6.0主线版本,结果发现某个GPU驱动在特定条件下会触发内核panic。查了两天才定位到是内核调度器的一个新特性导致的。从那以后,量产项目我再也不敢用非LTS版本了。

查看当前可用的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版本的第一个候选发布版,还在测试阶段,不适合量产。

个人经验: 车载项目选版本时,我一般选LTS版本中修订号较大的,比如6.1.25比6.1.0好,因为修复了更多bug。但也不要追最新,比如6.1.30刚出来,等一两周看看社区反馈再升级。

2.6 验证源码完整性

代码下载完了,怎么确认没损坏?内核仓库提供了签名验证机制。Linus Torvalds会用他的GPG密钥给每个发布版本签名。验证命令:

git tag -v v6.1.25

如果输出显示 Good signature from "Linus Torvalds ...",说明代码是完整的、未被篡改的。我在团队里强制要求每次拉取新版本都要做这个验证,特别是从镜像站下载时。

好了,这一章的内容就这些。你拿到源码、选好版本、理解了目录结构,下一步就可以开始配置和裁剪内核了。下一章我会带你实战内核配置,咱们把那些用不上的模块统统砍掉,让内核轻装上阵。