输入/输出系统
前六章讲的是主机内部:数据怎么表示(第 2 章)、放在哪(第 3 章)、用什么指令操作(第 4 章)、谁来执行(第 5 章)、靠什么互连(第 6 章)。这一章第一次把视线移到主机之外。
移出去之后,一切前提都变了。主存的响应时间以纳秒计,键盘的响应时间以秒计,两者相差
这一章要解决的是同一个问题的三个侧面:
| 问题 | 解法 | 在哪一节 |
|---|---|---|
| 差异这么大,怎么连上 | 中间插一块硬件做适配——I/O 接口 | 7.2.1~7.2.3 |
| 连上之后,CPU 怎么找到它 | 给接口里的寄存器编地址——I/O 端口 | 7.2.4 |
| 找到了,怎么知道它什么时候好 | 查询 / 中断 / DMA——I/O 控制方式 | 7.3 |
第三个问题是本章的重心,也是全章唯一有真正难度的地方。 前两个是”怎么接线”,第三个是”怎么同步”——而同步是整个计算机系统里反复出现的难题(6.2.2 的总线定时是它在硬件层的形态)。
机制
「输入」和「输出」的参照系是主机
方向以主机为原点:数据流入主机叫输入,流出主机叫输出。
这条看似废话的定义在两个地方会救命:
- 磁盘既是输入设备也是输出设备——读盘时数据流入主机是输入,写盘时流出是输出。所以磁盘归在”外存”而不是”输入设备”或”输出设备”,7.1.2 的分类表里它单列一类。
- “CPU 输出到主存”不叫输出。主存在主机内部,CPU 与主存之间的传送是访存,不是 I/O。I/O 这个词只用于跨越主机边界的传送。
I/O 系统由硬件和软件两部分组成
硬件部分(本章的重点):
| 部件 | 职责 | 归属 |
|---|---|---|
| 外部设备 | 完成物理上的输入或输出 | 主机外 |
| I/O 接口(设备控制器) | 两侧协议转换、缓冲、状态与命令的存放 | 主机与外设的分界处 |
| I/O 总线 | 接口挂在上面,与 CPU、主存通信 | 主机内 |
| DMA 控制器 / 通道 | 代替 CPU 承担成块搬运 | 主机内 |
软件部分(属于操作系统,见 OS 5.1.3 I/O 软件层次):
- I/O 指令:CPU 指令系统里用于访问 I/O 端口的那部分(4.1.5 的四类指令之一)。
- 通道指令:通道程序里的指令,与 CPU 指令系统不是同一套。
- 设备驱动程序、中断处理程序:软件。
边界辨析:I/O 指令与通道指令
两者都叫”指令”,但执行者不同、来源不同。
I/O 指令 通道指令 谁执行 CPU 通道(专用 I/O 处理器) 属于谁的指令系统 CPU 的指令系统(是其中一类) 通道自己的指令系统,与 CPU 无关 放在哪 和普通程序一起在主存里 通道程序,也在主存里,由通道取指执行 谁启动它 程序顺序执行到它 CPU 用一条 I/O 指令启动通道,之后通道自己取指 CPU 执行一条 I/O 指令 → 通道开始执行一串通道指令——这是两层,不是一层。408 里通道只作了解,但”通道指令不属于 CPU 指令系统”这句话是可以直接考的。
接口是主机与外设的分界线
整章的空间感建立在一条线上:
flowchart LR subgraph HOST["主机"] direction LR CPU["CPU"] MEM["主存"] BUS["系统总线"] CPU --- BUS MEM --- BUS end subgraph IF["I/O 接口<br/>(设备控制器)"] REG["数据端口<br/>状态端口<br/>控制端口"] LOGIC["控制逻辑<br/>格式转换"] end subgraph DEV["外部设备"] D1["键盘"] D2["显示器"] D3["磁盘"] end BUS <-->|"标准总线协议<br/>地址/数据/控制"| IF IF <-->|"设备专用信号<br/>每种设备都不同"| DEV classDef host fill:#e3f2fd,stroke:#1565c0 classDef iface fill:#fff3e0,stroke:#e65100,stroke-width:3px classDef dev fill:#f1f8e9,stroke:#33691e class CPU,MEM,BUS host class REG,LOGIC iface class D1,D2,D3 dev
这张图上有一处必须记牢:接口的左侧是统一的、标准化的;右侧是五花八门的。 接口存在的全部理由就是把右边的杂乱挡在外面,让 CPU 只面对左边的统一协议。
接口在总线上的身份是从设备(6.1.1)——CPU 发地址选中它,它响应。只有 DMA 控制器例外,它在传送期间会申请总线控制权、成为主设备,这一点留到 7.3.3。
CPU 从不直接访问外设
这是本章最容易被选择题抓的一句话。 CPU 能做的只有两件事:
- 读/写接口里的端口寄存器(一次总线事务)。
- 接收接口发来的中断请求。
至于”把字符打印到纸上""从磁道读出扇区”这些动作,全部由接口去驱动设备完成。CPU 与设备之间没有任何直接的电气通路。
所以”CPU 直接与外设交换数据”这类说法一律错。准确的表述是:CPU 与 I/O 端口交换数据,端口再与设备交换数据。
边界
| 说法 | 判断 | 理由 |
|---|---|---|
| ”输入设备和输出设备把所有外设分完了” | ❌ | 外存(磁盘、SSD)既输入又输出,单列一类 |
| ”CPU 把结果写入主存属于输出” | ❌ | 主存在主机内,不跨主机边界就不是 I/O |
| ”通道指令是 CPU 指令系统的一部分” | ❌ | 通道有自己的指令系统 |
| ”I/O 指令是 CPU 指令系统的一部分” | ✅ | 属于4.1.5 四类指令中的输入/输出类 |
| ”CPU 可以直接访问外部设备” | ❌ | 只能访问接口中的端口 |
疑问点:整个 7.1 在教材目录里带
*,还要不要认真看要看,但看的方式不同。
王道 2026 目录里 7.1 及其三个三级节全部带
*(“教材原文标注的选学或降低要求内容”),而 7.2、7.3 不带。这个标记传达的信息是**“不会出计算大题,但概念判断题照出”**。对照第 6 章的经验:6.1.4 常见总线标准同样带
*,结果本章唯一需要死记的东西(PCIe、USB、SATA 的定位)就在那一节。带星号的节往往是”记忆型考点集中区”——不难,但记不住就白丢分。7.1 的正确读法:三节里只有 7.1.2 的显示器参数计算(VRAM 容量、显示带宽)真的会算,其余部分是建立框架和术语。而 7.1.3 虽然带
*,它的内容与不带星号的 7.3 完全重叠——7.1.3 是纲,7.3 是目。所以 7.1.3 事实上是必考内容,只是它的分值记在 7.3 名下。
对照速查
| 概念 | 一句话 |
|---|---|
| I/O 系统 | 外设 + 接口 + 总线 + I/O 软件的总和 |
| 输入 / 输出 | 以主机为参照,流入为输入 |
| I/O 接口 | 主机与外设的分界硬件,两侧协议不同 |
| I/O 指令 | CPU 执行,属 CPU 指令系统 |
| 通道指令 | 通道执行,独立指令系统 |
| 接口的总线身份 | 从设备(DMA 控制器传送时除外) |
考点
- “CPU 直接访问外设”型判断题——一律错,中间必有接口。
- 输入/输出的方向判定,尤其是磁盘的双重身份。
- I/O 指令与通道指令的归属。
- I/O 系统组成的软硬件划分:驱动程序是软件,控制器是硬件。
链接
- 🏠 返回总览:计算机组成原理第 7 章:输入/输出系统总览
- ➡️ 下一节:7.1.2 外部设备
- 🔧 接口细节:7.2.1 I/O 接口的功能
- 🔗 主/从设备判据:6.1.1 总线的基本概念
- 🔗 指令分类:4.1.5 指令的分类
- 💻 OS 对应:OS 5.1.3 I/O 软件层次结构
- 📖 名词库:第 7 章名词库