Day 5:深入理解 Linux 内核结构(夯实基础训练)
B站相应的视屏教程:
📌 Day 5:深入理解 Linux 内核结构
Linux 内核作为一个复杂的操作系统内核,其源代码规模庞大、模块众多,初学者容易迷失在文件与概念之中。为了更高效、系统地理解 Linux 内核的整体架构,我们将采用一个 四层模型,从宏观到微观地解析内核结构,帮助你建立清晰的认知框架。
一、为什么要了解内核结构?
- 编写驱动需要了解子系统的调用链
- 调试问题时需要准确定位模块位置
- 内核移植与裁剪依赖整体结构感知
- 应对高质量面试需具备宏观系统视角
掌握内核结构,是从“会用”到“精通”的关键一步。
二、推荐的四层内核结构理解模型
层级 | 逻辑名称 | 功能描述 | 对应源码路径 | 示例 |
---|---|---|---|---|
1 | 核心层(Kernel Core) | 提供基本能力:调度、内存管理、系统调用、锁等 | kernel/ 、mm/ 、ipc/ 、lib/ | kernel/sched/ (调度)、mm/memory.c (内存) |
2 | 子系统层(Subsystem) | 网络、文件系统、图形、音频等大功能模块 | net/ 、fs/ 、sound/ 、drivers/gpu/ | net/core/ 、fs/ext4/ |
3 | 驱动层(Device Drivers) | 与具体硬件设备交互,完成设备初始化、控制 | drivers/ 各模块目录 | drivers/gpu/imx/lcdif/ |
4 | 架构层(Architecture) | 适配不同 CPU 平台,提供启动、中断、MMU 支持 | arch/arm64/ 、arch/x86/ | arch/arm64/kernel/head.S |
✅ 此模型具有层次分明、逻辑清晰、与源码结构高度一致的优点,建议背熟掌握。
三、逐层详解内核结构
1. 核心层(Kernel Core)
这是 Linux 内核的“中枢神经系统”,为所有模块提供基础能力:
- 进程调度(Scheduler):决定哪个进程何时运行。位于
kernel/sched/
- 内存管理(MM):负责页表、分配器、内存回收,路径
mm/
- 系统调用(Syscall):提供用户态与内核态之间的接口,位于
kernel/
和arch/xxx/
- 锁机制(Spinlock、Mutex 等):实现并发控制,路径
kernel/locking/
- 基础库函数(Lib):路径
lib/
,比如字符串处理、数据结构操作等
📌 示例:mm/memory.c
处理页的分配与回收,是理解物理内存管理的核心文件。
2. 子系统层(Subsystem)
子系统是内核中提供完整功能的一类模块,如:
- 文件系统(VFS & 具体实现):虚拟文件系统接口 + ext4/fat 等,路径
fs/
- 网络子系统:分层清晰,包括 socket 层、协议栈(TCP/IP)等,路径
net/
- 图形系统(DRM/KMS):路径
drivers/gpu/
,如 i.MX 的 LCDIF 子模块 - 声音系统(ALSA):路径
sound/
- 安全子系统(LSM、SELinux):路径
security/
📌 示例:fs/ext4/
是 ext4 文件系统实现,对应 ext4 格式分区的挂载与管理。
3. 驱动层(Device Drivers)
驱动层是 Linux 内核最贴近硬件的一层,种类繁多,包括:
- 字符设备驱动、块设备驱动、网络设备驱动
- 各类总线控制器:I2C、SPI、USB、PCI、MMC 等
- 图形、摄像头、声卡、显示器、WiFi 等具体设备驱动
路径统一在 drivers/
下,按类型再细分目录。
📌 示例:drivers/gpu/imx/lcdif/
是 NXP 平台的 LCD 控制器驱动,提供 framebuffer 输出、时序设置、格式配置等。
4. 架构层(Architecture)
这一层用于支持不同的 CPU 架构,包括:
- 启动流程、汇编入口、异常中断向量表
- MMU 映射、页表初始化
- 中断控制器、定时器初始化等
路径:arch/arm64/
、arch/x86/
、arch/riscv/
等
📌 示例:arch/arm64/kernel/head.S
是 ARM64 架构下的汇编启动入口。
此外还有:
arch/arm64/boot/
包含启动镜像格式代码arch/arm64/mm/
包含页表、内存区域初始化
四、与平台设备驱动关系
平台设备驱动(platform_driver
)典型地处于 驱动层 与 子系统层 之间:
- 驱动层负责注册
platform_driver
- 设备树中定义设备节点,内核自动构造
platform_device
- 匹配后调用
probe()
绑定资源(寄存器、clock、irq)
这体现出 Linux 内核模块之间解耦、自动注册、可扩展的架构设计理念。
五、从源码层面认识结构
Linux 内核源码的顶层目录结构本身也反映了这种分层思想:
linux/
├── arch/ # 架构层
├── drivers/ # 驱动层
├── fs/ # 子系统:文件系统
├── net/ # 子系统:网络协议栈
├── sound/ # 子系统:音频
├── kernel/ # 核心层:调度、信号、fork
├── mm/ # 核心层:内存管理
├── lib/ # 核心层:内核库函数
六、该如何深入学习内核结构?
- 搭配源码阅读工具:如 LXR、cscope、VSCode + ctags
- 参考文档:如 Kernel Doc 官网、LWN、Kernel Newbies
- 动手实验驱动开发:从 platform_driver、字符设备驱动开始
- 分析子系统工作流:如从用户态写文件,到文件系统层、页缓存、块层的调用栈
- 掌握构建系统:了解
Kconfig
与Makefile
,理解编译组织结构
七、面试应答建议
当被问到“如何理解 Linux 内核的组成”时,可以回答:
“Linux 内核结构可以从逻辑上分为四层:核心层、子系统层、驱动层、架构层。核心层提供调度、内存、系统调用等基本能力;子系统提供完整功能模块如文件系统、网络协议;驱动层与硬件交互;架构层负责适配不同平台。这种结构清晰、分工明确,也与内核源码目录高度一致。”
八、总结
理解内核结构,是深入 Linux 世界的“第一道门槛”。你不必一开始就掌握每一层的细节,但必须清楚它们的存在与责任划分。
🌱 牢记:只有站得高,才能看得清。
下一篇 Day 6,将继续探索 Linux 内核中某个关键子系统(如设备模型、内存页回收、进程状态转换等),敬请期待。