输入输出系统
一句话模型
I/O 系统把外部设备的请求转换成 CPU、主存和设备控制器之间的总线事务,再由操作系统通过驱动程序、中断、DMA 和缓冲区把硬件能力包装成进程可使用的文件或设备接口。
三层递进
- 简单:认识总线、CPU、主存、设备控制器和外设的连接关系。
- 中等:追踪一次设备读请求如何经过端口、总线和内存完成数据传输。
- 复杂:加入程序查询、中断、DMA、缓冲、驱动和系统调用,区分组成原理与操作系统各自负责的部分。
简单图谱:总线与 I/O 硬件
总线是部件之间的共享通信通道,通常包含数据、地址和控制信号;I/O 接口或设备控制器位于总线与外设之间,负责速度匹配、状态保存和协议转换。
# 输入输出系统
## 总线
- 数据总线:传输数据
- 地址总线:选择主存或 I/O 端口
- 控制总线:读写、时钟、中断、复位
- 总线事务:申请、寻址、传输、释放
- 同步定时与异步握手
## I/O 硬件
- CPU
- 主存
- I/O 接口 / 设备控制器
- 数据、状态、控制端口
- 外部设备:块设备、字符设备、网络设备
中等图谱:一次设备读请求
主干问题是:CPU 发出“读设备”请求后,数据如何从外设到达主存,并让 CPU 知道操作完成?
以读取磁盘一个数据块为例:
- 进程通过系统调用提出读请求,操作系统驱动程序把请求写入设备控制器的控制端口。
- CPU 或 DMA 控制器通过总线向设备控制器发送地址、读写和控制信号。
- 设备控制器驱动外设读取数据,暂存于数据端口或控制器缓冲区。
- 数据通过程序查询、中断或 DMA 传送到主存缓冲区。
- 操作系统更新设备状态、唤醒等待进程,并把数据返回用户缓冲区。
复杂图谱:组成原理与操作系统的协同
复杂图谱把一次 I/O 拆成三个边界:硬件总线事务、设备控制方式、操作系统软件栈。重点观察数据搬运和控制权在 CPU、DMA、设备控制器之间如何转移。
阅读时沿三条路径追踪:
- 查询路径:CPU 发出命令 → 反复读取状态端口 → 设备就绪后读写数据端口。
- 中断路径:设备就绪 → 控制器发中断 → CPU 保存现场 → 中断处理程序读取状态/数据并唤醒进程。
- DMA 路径:CPU 初始化 DMA 描述信息 → DMA 获得总线控制权 → 设备与主存直接批量传输 → 完成中断通知 OS。
子模块图谱:I/O 控制方式
三种控制方式的共同目标都是完成“设备 ↔ 主存”的数据传输,但 CPU 参与程度不同:查询方式持续占用 CPU,中断方式在设备就绪时打断 CPU,DMA 方式把成块搬运交给 DMA 控制器。
子模块图谱:操作系统 I/O 软件层次
硬件传输完成后,操作系统还要提供设备无关的抽象。用户层 I/O、设备独立软件、驱动程序和中断处理程序依次把文件/设备操作转换成具体控制器动作。
关键问题
总线和 I/O 接口分别解决什么问题?
总线解决部件之间如何共享传输通道,I/O 接口解决主机与具体设备之间的速度、格式、状态和控制差异;设备控制器通常是接口功能的具体硬件载体。
组成原理和操作系统的 I/O 边界在哪里?
组成原理关注端口、总线事务、设备控制器、中断信号和 DMA 传输;操作系统关注系统调用、驱动程序、设备分配、缓冲区、队列和进程唤醒。
为什么 DMA 仍然需要 CPU 和中断?
CPU 负责初始化 DMA 的源地址、目的地址和传输长度,DMA 只负责传输期间的数据搬运;传输结束后仍需通过中断通知操作系统更新状态和唤醒进程。
I/O 中断和异常有什么区别?
外部设备异步发出的请求属于中断,通常在指令边界响应;当前指令执行过程中检测到的非法操作或缺页属于异常,来源和返回点不同。
旁路清单
- 总线:单总线/多总线、集中式/分布式仲裁、突发传送、总线带宽
- I/O 端口:统一编址(MMIO)与独立编址(PMIO)
- 控制方式:轮询开销、中断屏蔽与优先级、DMA 周期窃取
- I/O 软件:设备独立性、驱动程序接口、中断处理、SPOOLing
- 性能机制:缓冲、双缓冲、环形缓冲、DMA 与 Cache 一致性
- 设备类型:块设备、字符设备、网络设备及其访问语义