I/O 接口的功能
先把名字统一了:I/O 接口 = 设备控制器 = I/O 控制器。 三个词指同一块硬件,只是不同教材的叫法。王道计组用”I/O 接口”,操作系统教材更常说”设备控制器”(OS 5.1.4),Linux 语境里说”控制器”。看到三个词中的任何一个都不要以为是新东西。
这一节要回答的是一个很朴素的问题:为什么不能把设备直接接到总线上,非要在中间插一块电路?
机制
直连为什么不行:五个不匹配
把键盘的信号线直接焊到系统总线上,会同时撞上五堵墙。 接口的五大功能就是逐一拆掉这五堵墙——功能不是背出来的,是从”不匹配”里推出来的。
| 不匹配在哪 | 具体表现 | 接口对应的功能 |
|---|---|---|
| 速度 | 主存 ns 级,键盘 s 级,相差 | 数据缓冲:设寄存器暂存,两边各按各的速度 |
| 格式 | 设备侧可能是串行位流,主机侧是并行字 | 数据格式转换:串并转换、字长匹配、电平转换 |
| 地址 | 总线上挂着几十个接口,谁该应答 | 设备选择(地址译码):只有被选中的才响应 |
| 时序与命令 | CPU 只会发”读/写”,设备要的是”寻道/启动马达” | 控制与定时:把命令字翻译成设备侧的控制时序 |
| 状态 | CPU 无从得知设备是忙、是错、还是好了 | 状态检测与报告:状态寄存器 + 中断/DMA 请求 |
五个功能,五堵墙,一一对应。 考试里问”I/O 接口的功能有哪些”,按这五条答;问”某个具体现象由接口的哪个功能解决”,反查这张表。
数据缓冲:不只是”存一下”
缓冲是接口最核心的功能,因为它同时解决了两个问题。
第一,速度匹配。 设备慢慢地把数据攒进数据缓冲寄存器,攒够一个字之后才通知 CPU 来取。CPU 与设备的交互频率因此降到了设备工作频率的几分之一。
第二,总线占用时间的解耦。 如果没有缓冲,CPU 读一个字节就要在总线上等设备准备好——总线被一个慢设备霸占。有了缓冲,一次总线事务只是从寄存器里取一个已经准备好的值,总线占用时间与设备速度无关了。
这第二点正是 6.2.1 里”分离事务”的思路在设备一侧的体现:把”慢”关在总线之外。
边界辨析:接口的缓冲 ≠ OS 的缓冲区
两者名字一样、目的相似,但层次和实现完全不同:
I/O 接口的数据缓冲寄存器 OS 的缓冲区 在哪 接口硬件里,几字节到几 KB 主存里,由 OS 分配 谁管 硬件自动 OS 软件 解决什么 主机侧与设备侧的瞬时速率差 进程与设备的平均速率差、减少中断次数 考在哪 计组 7.2 OS 5.2.2(单缓冲/双缓冲/循环缓冲) 一次 I/O 里两者都在起作用,是串联关系而不是二选一。
设备选择:接口是怎么被”叫到”的
总线上的地址线是所有接口共享的(6.1.1 的”共享”),所以每个接口都必须自己判断”这次是不是叫我”。
判断分两级:
flowchart LR A["地址线<br/>A15~A0"] --> H["高位地址<br/>A15~A4"] A --> L["低位地址<br/>A3~A0"] H --> D1["设备译码器<br/>是不是本接口?"] D1 -->|"是,片选有效"| D2["端口译码器<br/>是本接口的哪个寄存器?"] L --> D2 D2 --> R1["数据端口"] D2 --> R2["状态端口"] D2 --> R3["控制端口"] D1 -->|"否"| X["不响应<br/>数据线保持高阻"] classDef addr fill:#e3f2fd,stroke:#1565c0 classDef dec fill:#fff3e0,stroke:#e65100,stroke-width:2px classDef reg fill:#c8e6c9,stroke:#1b5e20 classDef no fill:#eceff1,stroke:#546e7a class A,H,L addr class D1,D2 dec class R1,R2,R3 reg class X no
“不响应”这一支必须落到”数据线保持高阻”上,否则总线上会出现多个驱动源——6.1.1 讲过,共享总线靠三态门保证同一时刻只有一个发送者,没被选中的接口把三态门置为高阻,就是它遵守这条约定的方式。
高位选接口、低位选端口,这个两级结构正是 7.2.4 的物理基础,也是”接口包含多个端口”这句话在电路上的样子。
控制与定时:命令字是怎么变成动作的
CPU 能做的只是往控制端口写一个二进制数。这个数叫命令字,接口内部的控制逻辑对它译码,生成设备需要的一串时序信号。
举一个具体的:CPU 向磁盘控制器的控制端口写入一个命令字,其中若干位表示”读”、若干位表示”启动”。 控制逻辑收到后,要依次驱动磁头寻道、等待旋转到位、启动读出电路、把读到的位流做串并转换填进数据缓冲寄存器——这一整串动作 CPU 一步都没参与。
所以”CPU 控制外设”这句话要打个折:CPU 只是下达了一次命令,具体控制是接口做的。
边界
| 说法 | 判断 | 理由 |
|---|---|---|
| ”I/O 接口和设备控制器是两个东西” | ❌ | 同一块硬件的两个名字 |
| ”I/O 接口就是机箱后面的插座” | ❌ | 那是物理连接器;本章的接口是电路模块 |
| ”设备驱动程序是 I/O 接口的一部分” | ❌ | 驱动是软件,接口是硬件 |
| ”有了接口的缓冲,就不需要 OS 缓冲区” | ❌ | 两者层次不同,串联使用 |
| ”每个接口只连一个设备” | ❌ | 一个接口可以带多个同类设备(如磁盘控制器带多块盘) |
| “没被选中的接口不需要做任何事” | ❌ | 必须把数据线置为高阻,这也是一个动作 |
| ”接口负责把数据送进主存” | ⚠️ | 一般不:查询和中断方式下是 CPU 搬;只有带 DMA 能力的接口才自己写主存 |
对照速查
| 五大功能 | 一句话 | 对应的硬件 |
|---|---|---|
| 数据缓冲 | 吸收速率差 | 数据缓冲寄存器 |
| 数据格式转换 | 串并、字长、电平 | 移位寄存器等 |
| 设备选择 | 判断”是不是叫我” | 地址译码器 |
| 控制与定时 | 命令字 → 设备时序 | 控制逻辑 + 控制寄存器 |
| 状态检测与报告 | 忙/就绪/出错 | 状态寄存器 + 中断请求线 |
| 三个名字 | 出处 |
|---|---|
| I/O 接口 | 王道计组 |
| 设备控制器 | 操作系统教材(OS 5.1.4) |
| I/O 控制器 | 通用叫法 |
考点
- 五大功能的枚举与反查:给现象说出对应功能。
- 接口是硬件、驱动是软件——跨 CO/OS 的高频判断题。
- “接口”一词的三种含义辨析,详见 7.2.4。
- 未被选中的接口输出高阻,接第 6 章三态门。
链接
- 🏠 返回总览:计算机组成原理第 7 章:输入/输出系统总览
- ⬅️ 上一节:7.1.3 I/O 控制方式
- ➡️ 下一节:7.2.2 I/O 接口的基本结构
- 🔗 三态门与共享:6.1.1 总线的基本概念
- 🔗 把”慢”关在总线外:6.2.1 总线事务
- 💻 OS 对应:OS 5.1.4 I/O 接口 OS 5.2.2 缓冲区管理
- 📖 名词库:第 7 章名词库