27 CPU不移动数据——但没有CPU,什么都无法移动
# 27 CPU不移动数据——但没有CPU,什么都无法移动
每次I/O操作都是CPU、内核和硬件之间的协同工作。CPU不直接传输数据,它发起数据交换、准备内存并等待完成。
这始于内存映射I/O(MMIO),设备的控制寄存器会作为物理地址暴露出来。当CPU向这些地址写入时,就是在发出命令:配置、启动、停止或请求状态。这些命令会被设备的控制器接收,控制器负责将高层指令转换为底层硬件操作。无论是USB主机控制器、SATA主机总线适配器(HBA)还是NVMe引擎,控制器都会解释这些写入操作,并在设备端管理相关操作。
MMIO事务通过系统总线(通常是PCI Express)传输。总线就像连接CPU、内存和设备的硬件通道,负责在端点之间路由命令和传输数据。
发出这些命令、准备内存和设置传输的逻辑由设备驱动程序处理,驱动程序是内核的一个组件,充当操作系统和设备之间的软件接口。驱动程序会为控制器设置DMA地址,并在内核中注册中断处理程序。
一旦命令发出,控制器就会接管。内核已经代表设备分配并映射了内存缓冲区。CPU告诉控制器这些缓冲区的位置,然后退到一旁。
此时,直接内存访问(DMA)成为主要角色。控制器使用其DMA引擎在设备本地内存和系统内存之间直接传输数据,完全绕过CPU。这使得高吞吐量设备能够高效运行,而不会因每个字节的传输而占用CPU周期。
传输完成后,控制器不会将数据推回CPU,而是引发中断——通过中断控制器路由的硬件信号,促使CPU暂停、切换上下文并调用内核级处理程序。处理程序检查状态,将缓冲区标记为已完成,并可能在中断上下文之外调度后续处理。然后,CPU恢复之前的任务。
每个部分都扮演着不同的角色:CPU发起操作,控制器执行操作,总线负责连接,DMA移动数据,中断提供通知,驱动程序进行协调,而内核将所有部分结合在一起——确保安全性、管理内存并维持协调。
从read()这样的系统调用到网络数据包的到达,这种流程始终在表面之下持续发生。
CPU不搬运数据,但没有它系统就无法工作。