Linux 内核四大核心模块技术分析
一、概述
1. Linux 内核简介
Linux 内核是操作系统的核心,负责管理 CPU、内存、设备、文件系统等所有系统资源。如果把 Linux 比作一座城市,Shell 只是路牌,发行版只是装修风格,真正决定这座城市如何运转的,是藏在地下几乎没人看见的那一层——Linux 内核。
它不写 UI,不和用户聊天,但它决定了 CPU 给谁用、内存怎么分、硬盘什么时候读、网络包怎么飞。没有内核,Linux 连开机这个动作都完成不了。
2. 核心问题
Linux 内核需要解决的核心问题只有一个:如何让有限的硬件资源公平、高效地服务于所有进程和应用程序。
二、进程管理
1. 核心问题
在任何时刻,系统里都不止一个程序在运行:浏览器、编辑器、后台服务、系统守护进程等。但现实只有一个 CPU 或有限几个核,不可能同时跑完所有事情。
进程管理要解决的问题:CPU 给谁?什么时候给?给多久?
2. 工作原理
A. 进程状态
每启动一个程序,内核都会为它创建一个进程。每个进程都有状态:
- 运行中
- 就绪
- 睡眠
- 等待 I/O
- 结束
B. 调度器
内核里的调度器不断在进程之间切换,通过时间片、优先级、调度策略,让看起来像并行的世界成立。
现代 Linux 使用的是 CFS(Completely Fair Scheduler,完全公平调度器),核心思想非常朴素:谁欠 CPU 多,谁先补;谁用得多,谁靠后。
graph TD
A[进程调度] --> B{选择下一个进程}
B --> C[就绪队列]
C --> D[计算虚拟运行时间]
D --> E[选择 vruntime 最小的进程]
E --> F[分配 CPU 时间片]
F --> G[进程执行]
G --> H{时间片用完?}
H -->|是| I[更新 vruntime]
I --> J[放回就绪队列]
J --> B
H -->|否| G3. 解决的问题
- 多任务系统为什么不卡死
- 后台程序不会饿死前台应用
- 高负载时系统依然可控
没有进程管理,Linux 只能一次跑一个程序,直接退化成上世纪计算机。
三、内存管理
1. 核心问题
如果说 CPU 是权力,内存就是资源,而资源永远不够用。
Linux 内存管理模块面对的核心问题只有一个:程序要的内存,比物理内存多,怎么办?
2. 工作原理
A. 虚拟内存
Linux 并不让程序直接接触物理内存,而是引入了虚拟内存的概念:
- 每个进程看到的,都是一整块连续、独立的地址空间
- 实际上,这些地址会被映射到真正的物理内存页
- 不常用的内存页,会被换出到磁盘(Swap)
- 需要时再换回来,程序毫无察觉
B. 页表管理
内核负责维护页表,将虚拟地址映射到物理地址。
C. 内存回收
使用 LRU(Least Recently Used)等算法回收不常用的内存页。
D. 安全隔离
防止进程互相踩内存,确保每个进程只能访问自己的地址空间。
graph LR
A[进程A 虚拟地址空间] -->|页表映射| B[物理内存页1]
A -->|页表映射| C[物理内存页2]
D[进程B 虚拟地址空间] -->|页表映射| E[物理内存页3]
D -->|页表映射| F[物理内存页4]
C -->|换出| G[Swap 分区]
F -->|换出| G3. 解决的问题
- 程序不用关心内存布局
- 单个程序不容易拖垮整个系统
- 系统能在内存紧张时优雅降级
内存管理让 Linux 学会了精打细算加障眼法。
四、文件系统
1. 核心问题
文件系统模块负责把杂乱无章的硬盘块,变成你能理解的文件、目录、权限、挂载点。
在 Linux 世界里,有一句著名的话:Everything is a file。这不是文艺,而是内核设计哲学。
2. 工作原理
A. VFS(虚拟文件系统)
内核提供统一的 VFS 层,不同文件系统(ext4、xfs、btrfs、NFS)挂在 VFS 下面。用户操作文件时,走的是统一接口,具体怎么读写由底层文件系统自己实现。
这也是为什么 Linux 可以同时挂载:
- 本地硬盘
- U 盘
- 网络文件系统
- /proc 这种根本不存在于磁盘上的文件
graph TD
User[用户空间应用] -->|open/read/write| VFS[VFS 虚拟文件系统]
VFS -->|ext4 操作| Ext4[ext4 文件系统]
VFS -->|xfs 操作| XFS[xfs 文件系统]
VFS -->|nfs 操作| NFS[NFS 网络文件系统]
VFS -->|proc 操作| Proc[proc 伪文件系统]
Ext4 --> Disk[本地硬盘]
XFS --> Disk
NFS --> Network[网络存储]
Proc --> Memory[内存数据]3. 解决的问题
- 存储介质差异被完全屏蔽
- 权限与安全统一管理
- 工具链可以高度复用
没有文件系统模块, Linux 只是会算数的铁疙瘩。
五、设备与 I/O 管理
1. 核心问题
硬件世界是混乱的:不同厂商、不同接口、不同协议、不同中断方式。而软件世界需要的是统一、稳定、可预期。
这中间的脏活累活,全由内核的设备与 I/O 管理模块包了。
2. 工作原理
A. 驱动程序
每种硬件由对应的驱动程序控制。驱动向内核注册自己,内核向上暴露统一接口(read / write / ioctl)。
B. 中断、DMA、缓冲区
中断、DMA、缓冲区等底层操作,全在内核内部消化。
C. 统一接口
这也是为什么:
- 键盘、网卡、硬盘,看起来操作方式差不多
- 程序不用关心硬件型号
- 热插拔设备可以即插即用
graph TD
App[应用程序] -->|系统调用| Sys[系统调用接口]
Sys -->|read/write/ioctl| VFS[VFS 层]
VFS -->|字符设备| CharDev[字符设备驱动]
VFS -->|块设备| BlockDev[块设备驱动]
VFS -->|网络设备| NetDev[网络设备驱动]
CharDev -->|控制| HW1[键盘/鼠标/串口]
BlockDev -->|控制| HW2[硬盘/SSD]
NetDev -->|控制| HW3[网卡]
HW1 -->|中断| IRQ[中断处理]
HW2 -->|DMA| DMA[DMA 传输]
HW3 -->|中断| IRQ3. 解决的问题
- 硬件差异对应用透明
- 系统稳定性显著提高
- 驱动可以独立演进,不拖垮内核核心逻辑
没有设备管理,Linux 只能活在模拟器里。
六、总体架构
Linux 内核并不神秘,它只是把四件事做到极致:
- 进程管理:让 CPU 公平高效地服务所有程序
- 内存管理:让有限内存支撑无限野心
- 文件系统:让存储世界有秩序、有规则
- 设备与 I/O 管理:让混乱硬件变得可控、可编程
graph TB
User[用户空间应用] -->|系统调用| Kernel[Linux 内核]
Kernel --> PM[进程管理]
Kernel --> MM[内存管理]
Kernel --> FS[文件系统]
Kernel --> IO[设备与 I/O 管理]
PM --> CPU[CPU]
MM --> RAM[物理内存]
MM --> Swap[Swap 分区]
FS --> Storage[存储设备]
IO --> Devices[硬件设备]你每天敲的每一条命令、跑的每一个 AI 服务、部署的每一个容器,最终都绕不开这四个模块在背后默默加班。