一、内核行数
Linux内核分为CPU调度、内存管理、网络和存储四大子系统,针对硬件的驱动成百上千,代码量十分庞大。
以早期的Linux 0.11内核为例,许多驱动工程师都曾通过学习相关书籍入门,完整阅读一遍大约需要1个半月时间。

最新内核代码量的统计数据显示,截至2025年11月28日,Linux内核Git源码树中的代码达到了37,020,481行。

从整体统计数据来看,Linux内核源码树包含:
- 48,633,608行(包括文档、Kconfig文件、用户空间实用程序等)
- 1,398,643次commit
- 31,042名贡献者

贡献者排行榜中,Linus Torvalds位居榜首。Linux内核从最初的1万行代码发展到如今的4000万行,是全球开发者共同贡献的成果。

如果按每天阅读1万行的速度计算,完整阅读需要4000天,约合11年多。这还是在理解所有代码逻辑且不忘却的前提下。实际上,内核代码持续更新,想要完全掌握几乎不可能。
值得注意的是,Linux内核中只有约2%的核心代码由Linus Torvalds编写,其余均由其他个人和组织贡献。除了Linus,对内核贡献最多的开发者包括David S. Miller、Mark Brown等人。
从公司贡献来看,谷歌、Intel和Red Hat位列前三。
二、内核目录文件大小
以linux-4.1.15版本为例,内核源码的规模已经相当庞大:
整个内核源码约793M:

驱动代码约占一半,约380M:

体系相关代码约134M:

网络子系统代码26M:

文件系统代码37M:

Linux内核核心代码约6.8M:

每个目录都包含大量复杂代码,完全理解任意一个都极具挑战性。
三、内核子系统
内核定义:
内核是管理软件I/O请求的核心程序,将请求转换为数据处理指令交由CPU和其他组件执行。它是操作系统的基础部分,为应用程序提供对硬件的有限、安全访问。

内核通过硬件抽象简化直接硬件操作,利用进程间通信和系统调用机制让应用进程间接控制硬件资源。

架构上分为用户空间和内核空间。GNU C库(glibc)提供系统调用接口,实现用户空间与内核的转换。内核采用分层设计:
- 最上层:系统调用接口
- 中间层:体系结构无关的内核代码
- 最下层:体系结构相关代码(BSP)

主要子系统包括:
- SCI:系统调用接口
- PM:进程管理
- VFS:虚拟文件系统
- MM:内存管理
- Network Stack:网络协议栈
- Arch:体系架构
- DD:设备驱动
1. 系统调用接口
SCI提供从用户空间到内核的函数调用机制,依赖于具体体系结构。实现位于./linux/kernel,体系相关部分在./linux/arch。
2. 进程管理
重点管理线程(进程)的执行。内核通过SCI提供创建进程(fork、exec)、停止进程(kill、exit)及进程间通信的API。
3. 内存管理
管理内存资源,采用分页机制(通常4KB)。包括可用内存管理和物理/虚拟映射硬件机制。
4. 虚拟文件系统
VFS为文件系统提供通用接口抽象,在SCI和具体文件系统间建立交换层。

VFS上层是open、close、read、write等通用API,下层是文件系统抽象。缓冲区缓存优化物理设备访问,最下层是设备驱动。
5. 网络堆栈
采用分层架构模拟网络协议:
- IP层:核心网络层
- TCP层:传输协议
- Socket层:网络子系统标准API
源代码位于./linux/net。
6. 设备驱动程序
大量代码用于驱动特定硬件设备。驱动程序子目录按设备类型划分,如Bluetooth、I2C、serial等,代码位于./linux/drivers。
下图形象展示了Linux内核的组成:

四、如何学习内核?
1. 学习主线
建议按以下主线深入研究:
- Linux驱动架构
- 网络子系统
- 内核启动过程
- 内存管理机制
- 调度器
- 进程管理
- 虚拟化技术(KVM)
- 内核实时化技术
从驱动入手是较好的起点,因为内核为外设驱动实现了标准架构(如I2C、SPI、UART)。可以从简单的字符设备开始,逐步学习模块编写和基础设备驱动开发。
2. 代码阅读工具
推荐使用Source Insight进行代码阅读:

也可选择VSCode或Vim+ctags组合。阅读代码时应注重理解设计思想,而非通篇浏览,有时需要亲手实现以加深理解。
3. 学习版本选择
建议选择3.10版本后的内核,因为支持设备树。最好搭配资料齐全的开发板学习,如正点原子系列,以避免学习障碍。
4. 提升编程能力
Linux内核代码由顶尖开发者编写,具有高内聚低耦合特点。通过阅读高质量代码,可以提升C语言编程水平和系统设计能力。
学习内核需要保持耐心和激情,从点到面逐步深入,最终掌握Linux系统精髓。