Linux内核基础完全入门指南(理论篇)

Linux内核基础完全入门指南(理论篇)

本文基于官方课程讲义,结合Linux内核社区实际开发流程,为你系统讲解Linux内核的版本分类、开发模式、文档资源以及如何使用Git工具跟踪内核修改。学完本章,你将理解主线和稳定版内核的区别,知道去哪里查阅内核文档,并能用简单的Git命令搜索和分析内核补丁。


文章目录

一、Linux内核简介

1.1 什么是Linux内核?

Linux内核 是一个开源的、类Unix的操作系统内核,采用宏内核架构。它是整个Linux操作系统的核心,负责管理硬件资源、提供系统调用接口、调度进程、管理内存、文件系统及网络协议栈等。

简单说:没有内核,你的电脑(或嵌入式设备)就无法运行任何程序。

1.2 一点历史

  • 1991年,芬兰赫尔辛基大学的学生林纳斯·托瓦兹 (Linus Torvalds)在Usenet新闻组 comp.os.minix 上发布了一条帖子,宣布他正在为个人电脑开发一个免费的内核,这就是Linux内核的开始。
  • 最初,它只是林纳斯个人的兴趣项目,但很快吸引了全球各地的开发者加入。
  • Linux内核采用**GNU通用公共许可证第2版(GPLv2)**发布,这使得它成为开源协作的典范。任何人都可以自由获取、修改、分发,只要遵守GPL许可。
  • 如今,Linux内核已经支持从超级计算机、服务器、个人电脑到智能手机(Android底层)、嵌入式设备(路由器、机顶盒、智能电视等)几乎所有计算设备。世界前500名最强的超级计算机全部运行Linux。

Logo与人物:Linux的吉祥物是一只名叫Tux的企鹅;林纳斯·托瓦兹至今仍然是Linux内核的最终决策者和维护者。


二、Linux内核版本与官网

2.1 内核官网

官方主站:https://www.kernel.org/

这里被称为"主线社区版",是获取最权威内核源码和发布信息的唯一来源。

2.2 内核版本分类

在官网首页,你会看到几个不同类别的内核版本。理解它们的区别至关重要。

分类 英文名称 特点 维护者 用途
主线 Mainline 包含所有最新功能和新特性,是开发的主要分支。每9-10周发布一个正式版本。 林纳斯·托瓦兹 内核开发者、发烧友
稳定版 Stable 每个主线版本发布后,会形成一个stable分支。只接受bug修复,不引入新功能。通常每周或按需更新。 指定维护者(如Greg Kroah-Hartman) 普通发行版、企业预测试
长期支持版 Longterm (LTS) 从某个稳定版中挑选出来,提供长达数年(如6年)的后向移植bug修复。 指定维护者 嵌入式系统、企业产品、需要长期维护的环境
linux-next linux-next 汇集了下一个开发周期将要合并到主线的补丁,用于提前集成测试。 维护者 开发者提交新功能前进行交叉测试

举例(基于文档中的表格):

  • 6.6 版本:2023-10-29 发布,EOL 预计 2027年12月。
  • 5.15 版本:2021-10-31 发布,EOL 预计 2026年12月。

你必须记住 :嵌入式产品通常选择 Longterm(LTS) 内核,因为稳定且支持时间长。例如百问网T113开发板使用的是5.4内核,正是一个LTS版本。

2.3 版本发布周期

  • 合并窗口(Merge Window) :约 2周。在此期间,开发者可以提交新功能代码给林纳斯合并。
  • Bug修复期(Bug-fixing Period) :约 6-10周 。期间只允许修复bug,并发布多个RC版本(Release Candidate,候选版),例如 rc1、rc2...直到稳定。
  • 正式发布:当一个版本被判定足够稳定后,林纳斯会打上 tag 并宣布发布。然后下一个版本的合并窗口随即打开。

这种规律性的节奏使得Linux内核的开发既活跃又可靠。



三、内核文档与信息资源

学习内核开发离不开查阅文档。以下资源是官方和社区最重要的几个:

3.1 内核文档中心(最重要)

官网 :https://www.kernel.org/doc/html/latest/

这里包含了内核开发者手册、API文档、驱动编写指南、内核编码风格、子系统文档等。是编写内核代码时的第一参考。

文档分为几大类:

  • 与开发社区协作:如提交补丁指南、行为准则、维护者手册。
  • 内部API手册:核心API、驱动API、子系统、锁机制。
  • 开发工具与流程:测试指南、跟踪、故障注入、Rust语言支持等。

初学者:刚开始不需要全部阅读,但要知道通过这里可以找到几乎所有内核功能的官方解释。

3.2 Wiki 站点

官网 :https://wiki.kernel.org/

这里包含各子系统的独立维基,例如:

  • rt - 实时性相关
  • ext4 - ext4文件系统
  • wireless - 无线网络
  • i2c - I2C总线
  • btrfs - Btrfs文件系统
  • git - Git SCM相关工作流

了解即可:需要深入研究某个子系统时再访问。

3.3 各版本新功能追踪

官网 :https://kernelnewbies.org/LinuxChanges

这个网站以清晰易懂的方式总结了每一个内核版本的主要新特性。例如:

  • Linux 5.13 引入了 Landlock 安全模块、Clang CFI 支持、随机化栈偏移等。
  • 它还会列出架构更新、驱动改进、文件系统变更等。

推荐:如果你想知道某个内核版本相比上一个版本多了什么,可以来这里查阅。

3.4 LWN.net 内核专栏

官网 :https://lwn.net/Kernel/

LWN(Linux Weekly News)是内核开发者必读的资源。它每周都会发布深入的内核发展讨论、合并窗口摘要、技术分析文章。

进阶:入门初期可以不看,但如果你想跟踪最新内核开发动态,LWN是最好的。


四、补丁管理:Patchwork

网站 :https://patchwork.kernel.org/

Patchwork 是一个用于跟踪邮件列表中的补丁的 web 工具。内核开发的大部分讨论和补丁提交都发生在邮件列表(如 linux-kernel@vger.kernel.org)。Patchwork 将这些补丁分类、标记状态(未审核、已应用、被拒等),方便维护者管理。

了解即可:普通开发者可能不直接使用,但如果你提交补丁,你可能会被要求查看 Patchwork 上的状态。


五、使用Git工具阅读理解Linux内核代码

作为内核开发者或嵌入式驱动工程师,你经常需要查看内核历史提交,理解某段代码为什么这样写,或者查找某个bug是如何被修复的。Git 是最重要的工具。

5.1 克隆内核仓库

bash

复制代码
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux

(注意:完整内核仓库非常大,首次下载可能需要很长时间。也可以只使用 --depth 1 浅克隆。)

5.2 根据提交信息关键字搜索:git log --grep

假如你想了解与 imx6ull 相关的所有提交,可以运行:

bash

复制代码
git log --grep='imx6ull' --oneline

输出示例:

text

复制代码
d3c064d29dfb Merge tag 'soc-fixes-5.14-2' ...
828db68f4ff1 ARM: dts: colibri-imx6ull: limit SDIO clock to 25MHz
e4817a1b6b77 ARM: dts: imx6ull: fix ubi filesystem mount failed
...

这让你快速定位到相关的commit id(如 e4817a1b6b77)。

5.3 查看某次合并提交的详细修改:git show -m

合并提交(Merge commit)通常有两个父节点,-m 选项可以显示合并带来的实际代码变化。

bash

复制代码
git show -m 119c85055d86

文档中演示了该命令输出一个关于 powerpc IOMMU 的修复补丁。

5.4 查看具体某个修复补丁的细节:git log -p -1 <commit-id>

例如,针对 e4817a1b6b77(imx6ull ubi 文件系统挂载失败问题),运行:

bash

复制代码
git log -p -1 e4817a1b6b77

输出内容:

  • 作者、日期、提交说明(commit message)。
  • 问题描述:旧内核使用4bit ECC,新内核如果没有设置 fsl,use-minimum-ecc 会导致文件系统挂载时出现 ECC 错误。
  • 代码修改:在设备树文件中增加了 fsl,use-minimum-ecc; 属性。

这就是内核开发者日常工作的基本流程:搜索相关提交 → 阅读提交说明 → 查看代码修改 → 理解问题与解决方案。

你必须掌握 :git log --grep、git show 和 git log -p。它们是你在内核源码中寻找答案的利器。


六、Linux内核开发模式总结(补充)

从文档中的示意图可以提炼出:

  • 林纳斯开发流程:Mainline 合并窗口 2 周 → 稳定化 6-10 周 → 发布正式版。
  • Bug-fix 版本:在稳定版分支上持续发布(如 5.4.1, 5.4.2 ...)。
  • Longterm 分支:从某个稳定版分支分叉出来,长期维护。

七、必须掌握 vs 了解即可

✅ 必须掌握(面试/工作中高频)

  1. 内核官网 kernel.org 的作用 ,以及 mainline、stable、longterm 三者的区别。
  2. Linux内核的许可证:GPL v2,以及它对开源衍生代码的要求。
  3. 版本发布周期:合并窗口约2周,bug修复期约6-10周,RC版本。
  4. 从哪里查找内核官方文档 :kernel.org/doc/html/latest/。
  5. 使用 git log --grep 搜索特定关键词 ,git log -p -1 查看具体补丁。
  6. 理解设备树(dts)修改是如何修复内核bug的(如imx6ull ubi修复示例)。

🔍 了解即可(能看懂、不要求独立复现)

  1. Kernelnewbies 网站每个版本新特性的详细列表。
  2. LWN.net 上的深度讨论文章。
  3. Patchwork 工具的具体操作。
  4. 各子系统的独立 wiki 页面内容(如 ext4、btrfs 等)。
  5. linux-next 分支的具体运作机制。

八、面试官提问环节

第1问:Linux内核主线和稳定版有什么区别?在嵌入式开发中应该选择哪个版本?

参考答案:

  • 主线(Mainline):包含最新功能,每9-10周发布一个新版本,适合开发和实验。
  • 稳定版(Stable):从主线版本分支出来,只修复bug,不增加新功能,稳定性更高。
  • 嵌入式产品开发通常选用 长期支持版(Longterm) 内核,例如5.4、5.10、5.15等,因为它们提供长达数年的bug修复和安全更新,适合产品生命周期。

第2问:Linux内核的合并窗口是什么?为什么需要它?

参考答案:

  • 合并窗口是每次新版本开发周期开始后的约2周时间。在此期间,内核维护者(林纳斯·托瓦兹)允许开发者提交新功能代码。
  • 合并窗口结束后进入稳定期(bug修复期),期间不再接受新功能,只允许提交bug修复补丁。
  • 这种机制保证了内核在发布正式版前能有足够的时间进行测试和稳定化。

第3问:如何查找与某个芯片(例如imx6ull)相关的内核提交记录?

参考答案 :

使用 git log --grep='imx6ull' --oneline 可以在内核仓库中搜索提交信息中包含"imx6ull"的所有提交。通过 git log -p -1 <commit-id> 可以查看某次提交的详细修改内容。这种方法是内核开发者和驱动工程师定位问题、学习代码的常用手段。


第4问:Linux内核文档中心包含哪些主要内容?举例说明。

参考答案:

  • 内核文档中心位于 https://www.kernel.org/doc/html/latest/。
  • 内容包括:
    • 开发流程:如何提交补丁、代码规范、维护者手册。
    • 内部API:核心API、驱动API、锁定机制等。
    • 测试与调试:跟踪、故障注入、KUnit等。
  • 例如,如果你想编写一个I2C驱动,可以查阅"Driver APIs" → "I2C"部分。

第5问:什么是RC版本?内核发布前通常有几个RC版本?

参考答案 :

RC(Release Candidate)是"候选发布版"。在合并窗口结束后,内核进入bug修复期,林纳斯每隔约一周发布一个RC版本(rc1、rc2...)。通常会有6-8个RC版本,当RC版本被认为足够稳定时,就会成为正式发布版本(如5.15正式版)。


九、最后的话

本章你了解了Linux内核的基本信息、版本分类、开发节奏以及最重要的文档和Git工具使用方法。作为嵌入式Linux开发者,你不需要立即深入内核源码的行行代码,但必须知道:

  • 你使用的内核属于哪个版本(longterm? 主线?)
  • 去哪里查官方文档(而不是乱搜)
  • 如何使用Git追踪历史修改

这样当遇到驱动问题或需要移植新功能时,你就能站在前人的肩膀上快速定位。

下一步建议 :在虚拟机中克隆一个Linux内核仓库,实际执行 git log --grep='imx6ull' --oneline,并查看其中一两个提交的详情。动手做一次比只看理论强十倍。

相关推荐
律宏阔7 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔7 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴7 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千7 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei377 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei377 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei377 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh7 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
GeW7 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
百万蹄蹄向前冲7 小时前
双端同步!云服务器装最新Node.js v26.10全过程追踪
服务器·人工智能·node.js