硬件基础:CPU、内存层级、中断与 DMA
操作系统的全部行为都建立在几类硬件原语之上:CPU 的寄存器与特权级、分层的存储体系、以及中断与 DMA 这两种"让设备通知 CPU"的机制。
一句话定义
操作系统的全部行为都建立在几类硬件原语之上:CPU 的寄存器与特权级、分层的存储体系、以及中断与 DMA 这两种"让设备通知 CPU"的机制。
为什么重要
不懂硬件就只能在"应用层猜测"。上下文切换为什么有成本(kp-006)、页表为什么需要 TLB(kp-017)、I/O 为什么要缓冲(kp-027),答案全在硬件事实里:寄存器只有一小把、内存访问比寄存器慢百倍、磁盘比内存慢万倍、设备不会主动说话除非给它中断线。
前置知识
kp-001 的分层观。
核心概念
- PC(程序计数器)与通用寄存器:CPU 正在执行哪条指令、正在操作哪些数据——上下文切换保存与恢复的对象就是它们。
- 内存层级:寄存器 → L1/L2/L3 缓存 → 主存 → 磁盘,越往下越大越慢,速度差跨越 5~7 个数量级。
- 总线:CPU、内存、设备之间传输数据的公共通道。
- 中断控制器:接收设备信号、打断 CPU 当前执行的硬件。
- DMA 控制器:允许设备不经 CPU 直接与内存搬运数据的硬件。
- MMU 与时钟:地址翻译部件(kp-017 主角)与产生周期性时钟中断的定时器。
原理与机制
内存层级决定了"数据放哪里"是操作系统最重要的权衡之一。典型数量级:
| 层级 | 典型延迟 | 容量 |
|---|---|---|
| 寄存器 | 0.3 ns | 几百字节 |
| L1 缓存 | 1 ns | 几十 KB |
| 主存 (DRAM) | 100 ns | 数十 GB |
| SSD | 100 微秒 | TB 级 |
| HDD 寻道 | 10 ms | TB 级 |
中断流程:设备就绪 → 发信号给中断控制器 → 控制器打断 CPU → CPU 保存现场、跳转到内核中断处理程序 → 处理完后恢复现场继续原任务。这套机制让 CPU 不必傻等设备,是"并发地服务多个设备"的硬件前提。DMA 则更进一步:内核设置好源地址、目标地址、长度后放手,DMA 控制器自己搬数据,搬完才发一次中断,期间 CPU 可以跑别的进程。
图示
PIO (CPU 搬运): 设备 --> CPU --> 内存 CPU 全程被占用
DMA (设备直搬): 设备 --> DMA控制器 --> 内存 CPU 空闲,完成后收一次中断
直观类比
中断像快递柜取件码:你不站在门口等快递(轮询),而是收到短信(中断)再去处理。DMA 像雇了个搬运工:你(CPU)告诉他地址和数量后就可以去干别的,搬完他喊你一声。
实例或案例
在 Linux 上可复现的观察:
lscpu # 核数、缓存层级、NUMA 拓扑
getconf -a | grep CACHE # 各级缓存行大小与容量
cat /proc/interrupts # 各设备中断计数(需 root 可读,macOS 无此文件,可用 ioreg 辅助)
用 time 感受层级差异:随机访问 1GB 数组比顺序访问慢数倍,正是缓存局部性在起作用(相关量化见 kp-031)。
常见误区
- 认为内存访问是"均匀且便宜"的:缓存未命中一次的代价可抵上百条指令,很多"性能玄学"其实是缓存行为。
- 认为 CPU 一直在为 I/O 忙碌:有了中断和 DMA,I/O 期间 CPU 大多时间在跑别的进程。
- 把"多核"理解为多颗独立 CPU 共享一切:实际每个核有私有缓存,缓存一致性协议(如 MESI)是理解无锁编程(kp-015)的前提。
与其他知识点的关系
kp-003 用特权级机制解释系统调用;kp-006 的切换成本、kp-017 的 TLB、kp-026 的 I/O 控制方式,全部回溯到本节的硬件事实。
延伸阅读
《深入理解计算机系统》第 1、2、6 章(存储器层次结构)。
自测题
- 为什么操作系统需要时钟中断?
答:没有它,一个死循环进程会永远占住 CPU;时钟中断给了内核周期性夺回控制权、实施抢占式调度的机会。
- DMA 解决什么问题?
答:把批量数据搬运从 CPU 手里接走,让 CPU 在 I/O 期间可以去执行其他进程,只在传输完成时收一次中断。
- 主存与 L1 缓存的延迟差大约多少个数量级?
答:约两个数量级(1 ns 对 100 ns),这正是缓存与局部性优化如此重要的原因。