IO System And Controllers
I/O 系统从哪里开始
I/O 系统处理的是主机与外部设备之间的信息交换。这里的外部设备不只是键盘、鼠标、显示器,也包括磁盘、SSD、网卡等能输入、输出或双向交换数据的设备。
从硬件视角看,一次 I/O 通常不会让 CPU 直接控制设备的机械部件或物理介质。CPU 面对的是 I/O 控制器,也叫 I/O 接口或设备控制器。控制器再去驱动具体设备。
这层中介很关键:CPU 能执行指令、访问寄存器、发出总线控制信号,但它不适合直接处理键盘按键、电机转动、磁头定位、网卡收发等设备细节。控制器把设备的复杂性收拢成 CPU 可以读写的寄存器和状态。
I/O 设备分类
按功能分:
| 类型 | 作用 | 例子 |
|---|---|---|
| 输入设备 | 把外部信息送入计算机 | 键盘、鼠标、扫描仪 |
| 输出设备 | 把计算机信息送到外部 | 显示器、打印机 |
| 存储设备 | 长期保存数据,可读可写 | 磁盘、SSD、U 盘 |
| 通信设备 | 与其他系统交换数据 | 网卡、调制解调器 |
按信息交换单位分:
| 类型 | 基本单位 | 特点 |
|---|---|---|
| 字符设备 | 字符或字节 | 传输速率通常较低,不按块随机寻址,常配合中断驱动 |
| 块设备 | 数据块 | 可寻址,可随机读写某一块,传输速率较高,常配合 DMA |
字符设备和块设备的区别会影响后面的控制方式:字符设备每次数据量小,频繁中断还能接受;块设备一次传输大量连续数据,更适合让 DMA 或通道接管传输过程。
I/O 控制器
I/O 控制器是 CPU 与设备之间的电子部件。它一侧连接系统总线,另一侧连接一个或多个设备。
从主机一侧看,控制器通过数据线、地址线和控制线与 CPU、主存相连。这一侧也称内部接口,它接入的是系统内部的并行总线环境。系统总线的地址、数据、控制三类信号见 系统总线。
从设备一侧看,控制器通过外部接口连接具体设备。外部设备不一定按主机总线的格式工作,数据可能是串行传输,也可能有设备自己的控制时序。因此 I/O 控制器常要完成串并转换、格式转换和速度匹配。
控制器通常包含三类寄存器:
| 寄存器 | CPU 如何使用 | 典型内容 |
|---|---|---|
| 数据寄存器 | CPU 读入或写出数据 | 输入时暂存设备送来的数据;输出时暂存 CPU 要送给设备的数据 |
| 状态寄存器 | CPU 查询设备状态 | 忙、空闲、就绪、完成、出错、中断请求等状态位 |
| 控制寄存器 | CPU 下达控制命令 | 读、写、启动、复位、中断允许、传输方向等命令或参数 |
一个 I/O 控制器可能连接多个设备;同一种寄存器也可能有多个,例如每个设备各有自己的状态寄存器和控制寄存器。CPU 必须能通过地址区分“要访问哪个控制器的哪个寄存器”。
| 功能 | 说明 |
|---|---|
| 设备选择 | 根据地址线或设备号判断 CPU 当前访问的是哪个端口、哪个设备 |
| 数据缓冲 | 用数据寄存器暂存数据,缓和主机与设备之间的速度差异 |
| 命令接收与译码 | 接收 CPU 写入控制寄存器的命令,再转换成设备能执行的控制信号 |
| 状态反馈与中断请求 | 用状态寄存器或状态触发器记录忙、就绪、出错等状态;必要时向 CPU 提出中断请求 |
实际接口中还可能设置完成触发器、工作触发器、中断请求触发器和屏蔽触发器。它们分别用来记录设备是否完成、是否正在工作、是否提出中断请求,以及该中断请求是否允许送给 CPU。
因此,I/O 控制器不是单纯的“连线转换器”。它既负责主机侧的端口访问,又负责设备侧的控制、状态收集和数据暂存。若控制器用中断方式通知 CPU,后续响应流程进入 异常与中断处理。
I/O 端口
控制器中的寄存器对 CPU 来说就是可访问的端口。所谓 I/O 端口,就是 I/O 控制器里能被 CPU 读写的寄存器地址。
一次典型输入过程可以看成:
- 设备把输入数据送入控制器的数据寄存器。
- 控制器修改状态寄存器,例如置为“就绪”。
- CPU 通过查询或中断得知数据可取。
- CPU 从数据寄存器读出数据。
- 数据先进入 CPU 寄存器,再由 CPU 写入主存。
输出过程方向相反:CPU 把数据写入控制器的数据寄存器,再由控制器驱动设备完成输出。
统一编址与独立编址
CPU 必须能定位 I/O 端口。常见方式有两类:统一编址和独立编址。
| 编址方式 | 端口地址空间 | CPU 如何访问 | 优点 | 代价 |
|---|---|---|---|---|
| 统一编址,也称内存映射 I/O | I/O 端口占用主存地址空间的一部分 | 用普通访存指令访问端口 | 指令形式统一,编程方便 | 占用部分主存地址范围,访问时要区分普通存储单元和 I/O 端口 |
| 独立编址,也称 I/O 映射 I/O | I/O 端口有独立地址空间 | 用专门 I/O 指令访问端口 | 不占用主存地址空间,端口语义清楚 | 指令系统要提供专门 I/O 指令,指令中通常要说明端口或设备 |
I/O 指令与通道指令
I/O 指令是 CPU 指令系统的一部分,用来让 CPU 对 I/O 控制器或通道发出命令。它通常需要表达两类信息:
- 对哪个控制器、设备或端口操作;
- 做什么操作,例如读、写、启动、查询状态。
在有通道的系统中,CPU 不再逐项管理大量设备操作,而是执行 I/O 指令启动通道。通道再执行主存中的通道程序。通道程序由一串通道指令组成,描述要访问哪些设备、传多少数据、数据放在主存哪里、传输方向是什么。
CPU 指令和通道指令的区别:
| 对比项 | I/O 指令 | 通道指令 |
|---|---|---|
| 执行者 | CPU | 通道 |
| 作用 | 启动控制器或通道,发出 I/O 命令 | 由通道执行,控制一组具体 I/O 操作 |
| 所在位置 | 指令流中 | 通道程序中,通常预先放在主存 |
| 目标 | 减少 CPU 对 I/O 的直接管理 | 进一步让通道代替 CPU 管理多个控制器和设备 |