第一章 内核源码获取与版本管理

做嵌入式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 知识结构总览

我把这一章的核心逻辑画了张图,方便你理解:

内核源码获取与版本管理知识结构 源码来源 版本选择 目录结构 官网下载 Git克隆 LTS版本 主线版本 arch/ drivers/ 浅克隆 --depth 1 6年维护周期 设备树绑定文档 核心原则 1. 产品项目优先选择LTS版本,不要追新 2. 使用Git浅克隆加速首次下载,后续再补全历史 3. 熟悉arch/和drivers/目录,这是嵌入式开发的主战场

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版做产品。