输入输出系统

把总线、设备控制器、CPU、主存和操作系统 I/O 软件串成一条完整路径。

一句话模型

I/O 系统把外部设备的请求转换成 CPU、主存和设备控制器之间的总线事务,再由操作系统通过驱动程序、中断、DMA 和缓冲区把硬件能力包装成进程可使用的文件或设备接口。

三层递进

  1. 简单:认识总线、CPU、主存、设备控制器和外设的连接关系。
  2. 中等:追踪一次设备读请求如何经过端口、总线和内存完成数据传输。
  3. 复杂:加入程序查询、中断、DMA、缓冲、驱动和系统调用,区分组成原理与操作系统各自负责的部分。

简单图谱:总线与 I/O 硬件

总线是部件之间的共享通信通道,通常包含数据、地址和控制信号;I/O 接口或设备控制器位于总线与外设之间,负责速度匹配、状态保存和协议转换。

IoSystemSimpleMapcpuCPUbus系统总线数据 / 地址 / 控制cpu->bus命令 / 地址mem主存mem->bus数据ctrlI/O 接口 / 设备控制器数据 / 状态 / 控制端口bus->ctrl总线事务ctrl->bus数据 / 中断dev外部设备块 / 字符 / 网络ctrl->dev设备协议dev->ctrl状态 / 数据
# 输入输出系统

## 总线

- 数据总线:传输数据
- 地址总线:选择主存或 I/O 端口
- 控制总线:读写、时钟、中断、复位
- 总线事务:申请、寻址、传输、释放
- 同步定时与异步握手

## I/O 硬件

- CPU
- 主存
- I/O 接口 / 设备控制器
- 数据、状态、控制端口
- 外部设备:块设备、字符设备、网络设备

基础知识页面:总线I/O 系统

中等图谱:一次设备读请求

主干问题是:CPU 发出“读设备”请求后,数据如何从外设到达主存,并让 CPU 知道操作完成?

IoSystemRequestFlowMapprocess进程read() 请求osOS + 驱动构造 I/O 请求process->osport控制器端口控制 / 状态 / 数据os->portbus总线事务地址 + 控制 + 数据port->busdevice设备控制器 + 外设读取数据块bus->devicebuffer主存缓冲区设备数据到达device->buffer查询 / 中断 / DMAdone完成通知中断或轮询buffer->done传输结束wake唤醒进程复制到用户缓冲区done->wakewake->process返回数据

以读取磁盘一个数据块为例:

  1. 进程通过系统调用提出读请求,操作系统驱动程序把请求写入设备控制器的控制端口。
  2. CPU 或 DMA 控制器通过总线向设备控制器发送地址、读写和控制信号。
  3. 设备控制器驱动外设读取数据,暂存于数据端口或控制器缓冲区。
  4. 数据通过程序查询、中断或 DMA 传送到主存缓冲区。
  5. 操作系统更新设备状态、唤醒等待进程,并把数据返回用户缓冲区。

复杂图谱:组成原理与操作系统的协同

复杂图谱把一次 I/O 拆成三个边界:硬件总线事务、设备控制方式、操作系统软件栈。重点观察数据搬运和控制权在 CPU、DMA、设备控制器之间如何转移。

IoSystemFullMapcluster_os操作系统 I/O 软件cluster_hw组成原理 I/O 硬件app用户进程 / 系统调用independent设备独立软件命名、队列、缓冲app->independentdriver设备驱动程序寄存器与命令格式independent->driverportI/O 端口数据 / 状态 / 控制driver->port读写端口handler中断处理程序确认状态、唤醒进程handler->independent完成事件bus总线仲裁与事务地址、数据、控制port->bus发起总线事务ctrl设备控制器缓冲与设备协议bus->ctrl命令 / 数据memory主存缓冲区bus->memory程序控制 / 中断传送dmaDMA 控制器批量搬运到主存dma->handler完成中断dma->bus申请总线控制权dma->memory设备 ↔ 主存ctrl->handler中断信号ctrl->dma就绪 / 请求 DMAdevice外设ctrl->device设备操作

阅读时沿三条路径追踪:

  • 查询路径:CPU 发出命令 → 反复读取状态端口 → 设备就绪后读写数据端口。
  • 中断路径:设备就绪 → 控制器发中断 → CPU 保存现场 → 中断处理程序读取状态/数据并唤醒进程。
  • DMA 路径:CPU 初始化 DMA 描述信息 → DMA 获得总线控制权 → 设备与主存直接批量传输 → 完成中断通知 OS。

子模块图谱:I/O 控制方式

三种控制方式的共同目标都是完成“设备 ↔ 主存”的数据传输,但 CPU 参与程度不同:查询方式持续占用 CPU,中断方式在设备就绪时打断 CPU,DMA 方式把成块搬运交给 DMA 控制器。

IoControlMethodMapstart设备请求数据传输choose选择控制方式start->choosepoll程序查询CPU 循环读状态端口CPU 负责每次传送choose->poll少量数据 / 简单设备intr程序中断设备就绪后发中断CPU 执行处理程序choose->intr事件驱动 / 中等速率dmaDMACPU 初始化后DMA 批量传送choose->dma成块高速传输transfer数据到达主存缓冲区poll->transferintr->transferdma->transferfinish更新状态并唤醒进程transfer->finish

对应页面:I/O 控制方式I/O 系统

子模块图谱:操作系统 I/O 软件层次

硬件传输完成后,操作系统还要提供设备无关的抽象。用户层 I/O、设备独立软件、驱动程序和中断处理程序依次把文件/设备操作转换成具体控制器动作。

IoSoftwareStackMapuser用户层 I/Oread / write / 文件 APIvfs设备独立软件统一命名、权限、队列、缓冲user->vfs通用接口driver设备驱动程序把通用请求翻译为设备命令vfs->driver设备请求hardware设备控制器 + 总线 + 外设driver->hardware寄存器 / DMA / 命令interrupt中断处理程序确认完成、处理错误、唤醒进程interrupt->vfs返回状态 / 数据hardware->interrupt中断或完成事件

关键问题

总线和 I/O 接口分别解决什么问题?

总线解决部件之间如何共享传输通道,I/O 接口解决主机与具体设备之间的速度、格式、状态和控制差异;设备控制器通常是接口功能的具体硬件载体。

组成原理和操作系统的 I/O 边界在哪里?

组成原理关注端口、总线事务、设备控制器、中断信号和 DMA 传输;操作系统关注系统调用、驱动程序、设备分配、缓冲区、队列和进程唤醒。

为什么 DMA 仍然需要 CPU 和中断?

CPU 负责初始化 DMA 的源地址、目的地址和传输长度,DMA 只负责传输期间的数据搬运;传输结束后仍需通过中断通知操作系统更新状态和唤醒进程。

I/O 中断和异常有什么区别?

外部设备异步发出的请求属于中断,通常在指令边界响应;当前指令执行过程中检测到的非法操作或缺页属于异常,来源和返回点不同。

旁路清单

  • 总线:单总线/多总线、集中式/分布式仲裁、突发传送、总线带宽
  • I/O 端口:统一编址(MMIO)与独立编址(PMIO)
  • 控制方式:轮询开销、中断屏蔽与优先级、DMA 周期窃取
  • I/O 软件:设备独立性、驱动程序接口、中断处理、SPOOLing
  • 性能机制:缓冲、双缓冲、环形缓冲、DMA 与 Cache 一致性
  • 设备类型:块设备、字符设备、网络设备及其访问语义

对应页面:总线I/O 接口I/O 设备设备管理