I/O 接口的类型
这一节和 6.1.2 总线的分类是同一种题型,也适用同一种解法:四种分类不是并列的四张清单,而是四个互相独立的维度。 任何一个具体接口都要在这四个维度上各占一格。
| 维度 | 问的是 | 取值 |
|---|---|---|
| 数据传送方式 | 设备侧一次传几位 | 串行 / 并行 |
| 主机访问方式 | CPU 用哪种控制方式与它打交道 | 程序查询 / 中断 / DMA |
| 功能可变性 | 能不能用软件改变它的工作方式 | 可编程 / 不可编程 |
| 通用性 | 为一类设备还是为一台设备设计 | 通用 / 专用 |
用这张表做题的方法:题目描述一个接口,逐维度打勾,四个格子填完,任何”下列关于该接口说法正确的是”都能直接判。
机制
维度一:串行接口与并行接口——“串”在哪一侧
这是本节唯一真正容易错的地方。
判据是设备侧,不是主机侧。 串行接口指的是接口与外设之间一次传 1 位;接口与 CPU 之间永远是并行的——因为系统总线的数据线本来就是并行的,CPU 一次读的是一个字。
flowchart LR CPU["CPU"] <-->|"并行<br/>一次一个字"| IF["串行接口"] IF <-->|"串行<br/>一次 1 位"| DEV["外设"] IF -.-> NOTE["接口内部做<br/>串↔并转换<br/>(移位寄存器)"] classDef c fill:#e3f2fd,stroke:#1565c0 classDef i fill:#fff3e0,stroke:#e65100,stroke-width:3px classDef d fill:#c8e6c9,stroke:#1b5e20 classDef n fill:#f3e5f5,stroke:#6a1b9a,stroke-dasharray:4 3 class CPU c class IF i class DEV d class NOTE n
所以”串行接口”这个名字描述的是它的右半边。 它的左半边和并行接口没有任何区别——CPU 看不出来自己连的是串口还是并口,只有接口内部的移位寄存器知道。
串并转换正是 7.2.1 五大功能里”数据格式转换”的典型实例。
接上第 6 章:6.1.2 讲过”并行加宽 vs 串行加快”——并行靠多根线堆带宽,撞在 skew 和串扰上;串行靠拉高频率,撞在信号完整性上。接口层面的取舍完全一样:
| 并行接口 | 串行接口 | |
|---|---|---|
| 数据线 | 多根 | 1 根(或 1 对差分) |
| 距离 | 短(skew 限制) | 长 |
| 成本 | 线缆贵 | 便宜 |
| 典型 | 早期打印机口、IDE | USB、SATA、串口 |
| 现代趋势 | 被取代 | 主流 |
“并行一定比串行快”是错的,理由和第 6 章一样:并行的位宽优势会被时钟频率的劣势吃掉。
异步串行通信:起始位怎么通知“一帧开始”
空闲时为逻辑 1,起始位为逻辑 0;接收方检测到 1 → 0 的跳变,识别一帧的开始,再按双方约定的波特率采样。帧格式为:起始位 → 数据位 → 可选校验位 → 停止位,停止位为逻辑 1。这里靠起止位实现字符同步,与异步总线的请求 / 应答握手不同。
维度二:按主机访问方式分
| 类型 | 接口里必须有什么 |
|---|---|
| 程序查询接口 | 数据端口 + 状态端口 + 控制端口 |
| 中断接口 | 再加 INTR / MASK 触发器 + 中断请求线 |
| DMA 接口 | 再加 DMA 请求线 / 响应线,以及地址和计数寄存器 |
这是一条包含链,不是三个平行选项——中断接口是查询接口加东西,DMA 接口是再加东西。硬件成本递增,正对应 7.1.3 那条演化线。
一个实用推论:一块支持 DMA 的网卡,照样能用查询方式驱动(它有状态端口)。接口的能力是上限,实际用哪种方式由软件决定。 题目问”某接口支持 DMA,能否用中断方式”,答案是能。
维度三:可编程与不可编程
| 可编程接口 | 不可编程接口 | |
|---|---|---|
| 工作方式 | 由 CPU 写命令字设定 | 硬件连线固定 |
| 灵活性 | 一块芯片支持多种模式 | 一种 |
| 例子 | 8255(可编程并行接口)、8251(可编程串行接口) | 简单的锁存/缓冲芯片 |
“可编程”的含义要说准:不是指接口里能跑程序,而是指它的工作模式可以被 CPU 写入的命令字改变——比如 8255 的三个端口谁做输入、谁做输出,是靠往控制端口写一个方式字决定的。
这与 5.4.3 的”微程序控制器可通过改写控制存储器改变指令功能”是同一种思路的不同层级:把硬连线的决定推迟到运行时,用一次写寄存器来代替一次改电路。
维度四:通用与专用
- 通用接口:可连多种设备,如 8255 可以接键盘、也可以接打印机。
- 专用接口:为某一类设备定制,如显卡接口、磁盘控制器。
这个维度与”可编程”高度相关但不等价:通用接口通常可编程(否则没法适配多种设备),但专用接口也可以是可编程的(磁盘控制器有大量可设置的参数)。两个维度独立,不要合并。
边界
| 说法 | 判断 | 理由 |
|---|---|---|
| ”串行接口与 CPU 之间也是一位一位传” | ❌ | 主机侧永远并行,串在设备侧 |
| ”并行接口一定比串行接口快” | ❌ | 现代高速接口几乎都是串行,见 6.1.2 |
| ”支持 DMA 的接口不能用中断方式” | ❌ | 接口能力是上限,实际方式由软件选 |
| ”可编程接口内部运行程序” | ❌ | 是工作方式可由命令字设定 |
| ”通用接口都是可编程的,专用接口都不是” | ❌ | 两个维度独立 |
| ”串行接口不需要缓冲寄存器” | ❌ | 更需要:要把 8 次 1 位攒成 1 字节 |
对照速查
四维度速填表:
| 维度 | 本接口是 |
|---|---|
| 数据传送 | 串行 □ 并行 □ |
| 访问方式 | 查询 □ 中断 □ DMA □ |
| 可编程性 | 可编程 □ 不可编程 □ |
| 通用性 | 通用 □ 专用 □ |
| 记忆抓手 | 内容 |
|---|---|
| ”串”在设备侧 | 主机侧永远并行 |
| 三种访问方式是包含链 | 查询 ⊂ 中断 ⊂ DMA(硬件递增) |
| “可编程”= 命令字可改工作模式 | 不是接口里跑程序 |
考点
- 串行接口的”串”在哪一侧——本节第一失分点。
- 四个维度相互独立,不能用一个维度的取值推断另一个。
- 接口能力与实际控制方式的区别。
- 8255 / 8251 作为可编程接口的例子(只需认名字与类别)。
链接
- 🏠 返回总览:计算机组成原理第 7 章:输入/输出系统总览
- ⬅️ 上一节:7.2.2 I/O 接口的基本结构
- ➡️ 下一节:7.2.4 I/O 端口及其编址
- 🔗 同一种”多维度”解法:6.1.2 总线的分类
- 🔗 并行 vs 串行的物理原因:6.1.5 总线的性能指标
- 📖 名词库:第 7 章名词库