第一章 内核源码获取与版本管理
做嵌入式Linux开发,第一件事就是拿到内核源码。这事儿听起来简单,但里面坑不少。我见过太多新手直接从网上下个压缩包就开始改,结果编译不过、设备树不匹配,折腾半天才发现是版本搞错了。
这一章,咱们就把源码获取和版本管理这件事彻底讲透。
1.1 从哪里拿源码?
官方渠道就两个:Linux内核官网和Git仓库。
| 渠道 | 地址 | 适用场景 |
|---|---|---|
| 官网压缩包 | https://www.kernel.org |
快速下载固定版本,不参与开发 |
| Git仓库 | https://git.kernel.org |
跟踪主线、打补丁、做定制开发 |
我个人习惯用Git仓库。为什么?因为你能看到每次提交的修改记录,出了问题可以git bisect定位。官网压缩包说白了就是个快照,没有历史信息。
小技巧: 国内访问kernel.org有时很慢。我一般用清华或中科大的镜像站,速度能快10倍。比如:
https://mirrors.tuna.tsinghua.edu.cn/kernel/
1.2 Git仓库克隆的正确姿势
克隆整个内核仓库?别干傻事。完整仓库有4GB+,光下载就要半小时。
正确的做法是:
# 浅克隆,只拉最新一次提交
git clone --depth 1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
# 如果你需要某个特定版本
git clone --depth 1 --branch v6.1 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
--depth 1这个参数救过我很多次。有一次在客户现场,网络差得要命,全量克隆根本跑不完。用浅克隆,几分钟就搞定了。
注意: 浅克隆不能做
git log回溯,也不能切换其他分支。如果你要做内核开发,建议还是全量克隆一次,后面用git fetch增量更新。
1.3 LTS版本怎么选?
LTS(Long Term Support)版本是产品级项目的首选。内核社区每2-3年发布一个LTS版本,维护周期长达6年。
我整理了一份常用LTS版本对比:
| 版本 | 发布年份 | 维护截止 | 推荐场景 |
|---|---|---|---|
| 5.10 | 2020 | 2026 | 工业控制、物联网 |
| 5.15 | 2021 | 2027 | 消费电子、路由器 |
| 6.1 | 2022 | 2028 | 新项目首选 |
| 6.6 | 2023 | 2029 | 最新硬件支持 |
选版本有个原则:不要追新。我曾经在一个项目里用了当时最新的6.2,结果某个驱动在6.2.1之后才稳定,白白浪费了两周调试时间。做产品,稳定压倒一切。
我的建议: 2024年做新项目,首选6.1 LTS。驱动支持全,社区活跃,文档丰富。除非你的芯片必须用6.6以上的驱动,否则别冒险。
1.4 源码目录结构解析
内核源码目录乍一看很吓人,几十个文件夹。其实核心结构就这几块:
linux/
├── arch/ # 架构相关代码(ARM、x86、RISC-V等)
├── block/ # 块设备层
├── crypto/ # 加密算法
├── drivers/ # 设备驱动(最大目录)
├── fs/ # 文件系统
├── include/ # 头文件
├── init/ # 内核初始化
├── ipc/ # 进程间通信
├── kernel/ # 核心调度、进程管理
├── lib/ # 通用库函数
├── mm/ # 内存管理
├── net/ # 网络协议栈
├── scripts/ # 编译脚本、工具
├── sound/ # 音频子系统
├── usr/ # initramfs生成
└── Documentation/ # 内核文档
你想想看,一个做嵌入式的人,最常打交道的是哪几个?
- arch/:你的CPU架构相关代码。ARM就进
arch/arm/,RISC-V就进arch/riscv/。 - drivers/:驱动开发的主战场。我80%的时间都泡在这里面。
- Documentation/:别忽略它。很多设备树绑定的说明都在这里,比网上搜的靠谱。
嗯,这里要注意:drivers/下面还有二级分类,比如drivers/i2c/、drivers/spi/、drivers/net/。找驱动的时候,先想清楚你的设备属于哪一类总线。
1.5 知识结构总览
我把这一章的核心逻辑画了张图,方便你理解:
1.6 避坑指南
最后分享几个我踩过的坑:
- 版本号看全:
5.10.120和5.10是两个东西。小版本号代表补丁级别,差一个数字可能就修复了关键bug。 - 别用root操作:我刚开始学内核时,直接用root解压、编译,结果把系统搞崩了。现在我都用普通用户,编译输出放
~/build/目录。 - Documentation/是宝藏:很多人遇到问题就上网搜,其实内核自带的文档比网上90%的博客都准确。尤其是设备树绑定,
Documentation/devicetree/bindings/下面写得清清楚楚。
曾经我犯过的错: 有一次我直接从kernel.org下载了5.15.1,没注意那是rc版本。编译倒是过了,但跑起来各种panic。后来才意识到,稳定版应该是5.15.x(x≥1的正式发布版)。记住:不要用rc版做产品。