1、内核源码初探:Linux内核版本演进、获取内核源码、内核源码目录结构解析、阅读源码的准备工作。

各位同学,咱们今天正式开干。

说实话,每次讲内核裁剪,我都有点小激动。因为这是真正让你掌控系统的第一步。你想想看,一个跑在你设备上的Linux,到底哪些代码在干活?哪些是多余的?搞清楚了这些,你才能动手去“剪”。

这一章,咱们不急着写代码,先做点“侦查工作”。

1.1 Linux内核版本演进:从0.01到6.x

Linux内核的版本号,看着像一串数字,其实背后有门道。

我记得刚入行那会儿,还在折腾2.6.x的内核。那时候改个驱动,编译一次得抽根烟等着。现在6.x的内核,编译速度虽然快了,但代码量也翻了不知道多少倍。

版本号怎么读?我一般这么看:

  • 主版本号:大版本更新,架构级变化。比如2.6到3.0,引入了设备树。
  • 次版本号:功能更新,API可能变。比如5.10到5.15。
  • 修订版本号:bug修复,安全补丁。这个最稳,直接升就行。

这里有个小规律:

版本区间 特点 我个人的印象
0.01 - 1.0 原型阶段,单核,简陋 那时候Linus还是个学生
2.4 - 2.6 稳定性爆发,企业级应用 我最早接触的就是2.6.18
3.x - 4.x 设备树、ARM架构大统一 嵌入式开发的分水岭
5.x - 6.x Rust支持、实时性增强 现在做项目首选5.10 LTS
我的建议:做产品选型,优先选LTS(长期支持)版本。比如5.10、5.15、6.1。别追新,稳定压倒一切。

1.2 获取内核源码:从哪下?怎么下?

源码去哪搞?其实就两个地方最靠谱。

第一个,kernel.org。这是官方大本营,所有正式版、RC版都在这里。我习惯直接wget下载,然后解压。

第二个,各大发行版的源码仓库。比如Ubuntu的apt-get source,RedHat的SRPM。这些源码打了发行版的补丁,更贴近你的实际环境。

举个例子,我常用的下载方式:

# 从kernel.org下载5.10.200
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.200.tar.xz
tar -xf linux-5.10.200.tar.xz

# 或者用git克隆(推荐,方便切换版本)
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux
git checkout v5.10.200
注意:我曾经在某个项目里,直接从第三方网站下了个“优化版”内核。结果编译出来,系统跑起来各种诡异。后来一查,里面被人塞了后门。所以,源码一定要从官方渠道获取,别图省事。

1.3 内核源码目录结构解析:别被吓到

第一次打开内核源码目录,你可能会懵。几百个文件夹,几千个文件。别慌,其实核心目录就那么几个。

我画了一张图,帮你理清脉络:

Linux 源码根目录 核心子系统 arch/ - 架构相关代码 kernel/ - 核心调度、进程 mm/ - 内存管理 fs/ - 文件系统 驱动与网络 drivers/ - 设备驱动 net/ - 网络协议栈 sound/ - 音频子系统 构建与工具 scripts/ - 构建脚本 tools/ - 用户态工具 Documentation/ - 文档 Kconfig / Makefile 贯穿所有目录的配置与构建系统

这张图里,我重点标出了几个你必须要熟悉的目录:

  • arch/:不同CPU架构的代码。ARM、x86、RISC-V都在这里。裁剪时,你只需要保留目标架构。
  • drivers/:这是最大的目录,也是裁剪的重点。里面成千上万的驱动,大部分你用不上。
  • fs/:文件系统实现。ext4、btrfs、vfat都在这里。嵌入式设备通常只需要一两种。
  • net/:网络协议栈。如果你做的是物联网设备,可能只需要IPv4和6LoWPAN。
核心思路:内核裁剪,说白了就是“删”。把arch/里无关的架构删掉,把drivers/里用不到的驱动删掉,把fs/里不需要的文件系统删掉。剩下的,就是你的定制内核。

1.4 阅读源码的准备工作:工欲善其事

源码拿到了,目录结构也懂了。接下来怎么读?

我个人的习惯是,先搭好环境。别急着用眼睛硬看,工具能帮你省不少时间。

必备工具清单:

  1. Vim/Emacs + cscope/ctags:代码跳转必备。我习惯用Vim + cscope,看函数定义、查找引用,一键搞定。
  2. Source Insight:Windows下的神器。如果你在Windows上开发,这个比IDE好用。
  3. grep + find:命令行搜索。有时候查个宏定义,grep -r 比啥都快。

举个例子,我想看看schedule()函数在哪定义的:

# 先生成索引
cd linux-5.10.200
make cscope
make tags

# 然后搜索
cscope -d -f cscope.out
# 在cscope界面输入:schedule
# 或者直接用grep
grep -rn "asmlinkage.*schedule" kernel/
一个小技巧:读内核源码,别从头读到尾。先挑一个你最感兴趣的子系统,比如进程调度、内存管理。从入口函数开始,顺着调用链往下看。遇到不懂的宏或结构体,再跳过去查。这样效率最高。

嗯,准备工作就这些。说白了,就是“源码 + 工具 + 耐心”。

下一章,咱们开始动手配置内核。到时候你会看到,Kconfig和Makefile是怎么配合工作的。


公众号:蓝海资料掘金营,微信deep3321