14.4 现代 x86、ARM 与 SoC 视角
8086、8259、8237 与 8251 通过独立芯片和导线把系统边界直接展示出来。现代处理器集成了许多相同职责,但本课程学到的问题依然存在:谁拥有某个地址、哪个事件请求服务、数据何时有效,以及软件必须保存什么状态?
把熟悉机制映射到现代平台
现代 x86 系统保留了独立输入输出端口地址空间,供 IN 与 OUT 等指令访问,同时也使用存储器映射设备寄存器。高级可编程中断控制器(Advanced Programmable Interrupt Controller, APIC)取代简单的 8259 模型以支持多核路由;平台 DMA 引擎或总线主控设备则在大多数高吞吐传送中取代原始 8237。
多数 ARM 系统使用存储器映射输入输出(memory-mapped I/O, MMIO):外设寄存器占用处理器存储器映射中的地址,并通过加载/存储指令访问。通用中断控制器(Generic Interrupt Controller, GIC)在各核心间路由中断。片上系统(system-on-chip, SoC)把 CPU 核心、定时器、串行控制器、DMA 引擎、存储控制器以及经常存在的 ADC/DAC 模块放在一块硅片上,并由内部互连连接。
集成改变的是实现规模,而不是约定需求。MMIO 寄存器可能具有读取即清除位,也可能禁止普通缓存。中断控制器必须选择目标核心与优先级。DMA 引擎仍需要方向、长度、所有权、完成方式和获准访问的地址。
迁移规划器要求先选择平台,再选择兼容的寄存器访问、中断路由、DMA 与定时机制。错误组合——例如在只有 GIC 的系统中使用 8259 专用 EOI 序列——会保持为可见的约定故障。
让 CPU 缓存与 DMA 对存储器达成一致
现代 CPU 通常通过缓存(cache)读写,它是近期使用存储器内容的小型高速副本。DMA 设备可能直接访问主存。在非一致性(non-coherent)路径中,这两个观察者可能暂时看到不同值:
1. CPU 只把发送缓冲区写入脏缓存行。
2. DMA 从主存读取旧字节并发送陈旧数据。
3. 或者,DMA 在主存写入接收缓冲区,而 CPU 继续读取旧缓存副本。
缓存清理(cache clean)会在设备读取前把 CPU 脏数据写回主存。缓存失效(cache invalidate)会在设备写入后丢弃 CPU 的陈旧副本。存储器屏障(memory barrier)约束操作变得可见的顺序;它本身不会复制缓存内容。一致性系统会自动完成更多可见性工作,但软件仍要遵循平台规定的所有权与顺序规则。
输入输出内存管理单元(IOMMU)可以转换并限制设备可见地址,其保护目的类似 CPU 存储器地址转换。它不会自动修复陈旧缓存数据。安全、多核并发、虚拟化与推测执行会增加约束,但诊断方法依然熟悉:识别所有者、地址、缓存副本、顺序点、完成事件和证据。
一致性实验会分别显示缓存值与主存值。学习者可以故意过早启动 DMA,再用清理、屏障、完成与失效操作修复发送和接收序列。
本课程从单个位开始,以完整且经过验证的系统结束。处理器世代会改变,但围绕表示、地址、时序、所有权、事件与证据的严谨推理能够持续迁移。