Appearance
I/O接口
2026 大纲 六(二)1 I/O 接口的功能和基本结构、六(二)2 I/O 端口及其编址。
接口里的寄存器,只有一部分对 CPU 开放
上一篇立了三个层次:设备、接口、端口。这一篇处理中间那两层的关系,而它们之间差的正好是一道可见性的门。
一个 I/O 接口内部有一大堆东西——数据缓冲寄存器、状态与控制寄存器、地址译码电路、面向具体外设的界面控制逻辑、连接器插座。其中只有寄存器那一部分对 CPU 开放,这部分才叫 I/O 端口;译码电路和界面控制逻辑 CPU 一个字都读不到,它们只是接口自己干活用的。所以"接口"与"端口"不是同义词,一个接口通常含多个端口。
接口这一整套零件也不是随便凑的。上一篇说外设与主机有速度、格式、协议三重不匹配,接口的四项职能就是逐条去消解它们:数据缓冲接住快慢两端的落差、状态检测让 CPU 知道现在能不能动手、控制和定时把"读扇区"这类命令翻译成设备动作的先后、数据格式转换把串行位流变成总线上的并行数字信号。缺任何一项,接口都接不通。
而端口一旦开放给 CPU,就要能被指令指名道姓地访问,于是引出本篇后半部分的问题:给端口编号,是另起一套地址空间,还是从主存的地址空间里划一段出来? 这两条路各有代价,也是本篇考得最密的一处。
交互可视化
一、接口的职能
外设与主机在工作速度、数据格式、控制协议上都不一致(推导见 I/O 系统概述)。接口的每一项职能,都是在消解其中一条:
| 职能 | 具体做什么 | 消解哪条不匹配 |
|---|---|---|
| 数据缓冲 | 接口内设数据缓冲寄存器,先收下再转交 | 速度:主存和 CPU 寄存器快、外设慢 |
| 错误或状态检测 | 用状态寄存器记录就绪 / 忙 / 缺纸 / 传输出错 | 速度:让 CPU 知道现在能不能动手 |
| 控制和定时 | 接收命令字与定时信号,协调内部资源与外设的动作先后 | 协议:不同设备的操作序列不同 |
| 数据格式转换 | 串-并转换的移位寄存器、电平转换、A/D 与 D/A | 格式:位流、模拟量转成总线上的并行数字信号 |
没有缓冲寄存器,快慢两端就没法交接;没有状态寄存器,CPU 只能盲发命令;没有控制逻辑,一条"读扇区"翻译不成磁头动作;没有格式转换,串行位流上不了并行总线。
二、接口的基本结构

图 8.7 I/O 接口的通用结构
左边是 I/O 总线侧的数据线、地址线、控制线;中间是数据缓冲寄存器、状态 / 控制寄存器和 I/O 控制逻辑(含地址译码);右边是面向具体外设的界面控制逻辑与连接器插座。把连线关系单独抽出来:
CPU 侧(I/O 总线) I/O 接口 设备侧
┌──────────────────────────┐
┌───→│ 数据端口(数据缓冲寄存器) │←──→ 外设数据
│ ├──────────────────────────┤
数据线 ←────双向───┼───→│ 命令端口(控制寄存器) │───→ 外设控制信号
│ ├──────────────────────────┤
└───→│ 状态端口(状态寄存器) │←─── 外设状态信号
├──────────────────────────┤
地址线 ──────────────→ │ 地址译码 / 设备选择电路 │
控制线 ──────────────→ │ (读/写、时序控制逻辑) │───→ 外设控制时序
└──────────────────────────┘这张图最容易画反的是命令字和状态字的走线:CPU 下命令是把命令字当数据写进控制寄存器、查状态是把状态字当数据读回来,两者与中断类型号一样都走数据线。
三根线的分工可以压成一句话:内容走数据线,选谁走地址线,何时做什么走控制线。命令字、状态字、中断类型号全都是"内容",一律走数据线;控制线上跑的是读/写、
三类 I/O 端口
接口中可被 CPU 访问的寄存器统称 I/O 端口:
| 端口类型 | 存放内容 | 方向 |
|---|---|---|
| 数据端口 | 输入 / 输出数据 | 可读可写 |
| 状态端口 | 就绪、忙、完成、出错等状态信息 | CPU 只读 |
| 命令端口 | CPU 发出的控制命令 | CPU 只写 |
"三类端口"是逻辑划分,不是物理寄存器的个数。 状态寄存器与控制寄存器传送方向相反(一个只读、一个只写),而且 CPU 对它们的访问在时间上通常错开(先查状态、后下命令),所以有的接口干脆把两者合二为一:同一个物理寄存器,高几位当状态位段读、低几位当控制位段写。看到"状态端口和控制端口可以合用同一个寄存器",那是对的。
另一条边界前一篇已经立过,这里再钉一次:主存地址不属于任何一类端口。查询与中断方式下 CPU 自己访存,主存地址只在 CPU 内部周转,从不出现在接口上;只有 DMA 控制器才持有它。
三、I/O 端口的编址
接口里的寄存器要能被指令指名道姓地访问,就得给它们编号。两种方案:
独立编址下,两套空间从地址码的形式上无法区分——同一个二进制数既可能是主存单元号,也可能是端口号。因此必须靠指令表明本次访问打的是哪一套:CPU 执行 IN / OUT 时产生的是 I/O 读 / I/O 写总线事务,控制线上的
| 指令 | 方向 |
|---|---|
IN AL, port | I/O 端口 → 通用寄存器 |
OUT port, AL | 通用寄存器 → I/O 端口 |
这张表的两端都要读准:I/O 指令的另一端是端口,不是设备本体。"IN / OUT 在通用寄存器与设备之间传送数据"是错的说法——CPU 够不到设备。
还有一处误判值得单独钉住:"独立"指的是译码通路独立,不是地址值不许重叠。既然靠 0x60 完全可以既是某个主存单元、又是某个 I/O 端口,硬件按控制信号走哪条译码通路,不会混淆。把独立编址理解成"两套地址值不能相同",恰好把因果关系弄反了——正因为无法从地址值上区分,才必须靠控制信号。
统一编址下,端口与主存在同一个空间的不同地址段里,靠地址范围就能区分,因而不需要专门的 I/O 指令——普通的访存指令(load / store、MOV)就能存取端口。
| 特性 | 独立编址 | 统一编址 |
|---|---|---|
| 地址空间 | 两套,互相平行 | 一套,分段共用 |
| 靠什么区分 | 控制信号( | 地址范围 |
| 使用指令 | 专用 I/O 指令(IN / OUT) | 普通访存指令(load / store、MOV) |
| 占用主存空间 | 否 | 是 |
| 寻址方式 | 少 | 全部可用 |
| 典型架构 | Intel 处理器架构(64K 个 I/O 地址编号) | 多数 RISC 架构,如 RISC-V、MIPS |
实际系统常两种并存:x86 既有 IN / OUT 访问的独立编址端口,也把显存等大块资源做成存储器映射。
统一编址下端口与主存怎么瓜分地址空间(想弄清"占不占主存空间"这句话落到数字上是什么样时展开)
某机地址线 20 位,采用统一编址方式,把地址空间最高的 4 KB 分配给 I/O 端口,每个端口 8 位。
每个端口 8 位 = 1 B,占一个地址编号,故端口数
换成独立编址,这台机器的主存仍是完整的 1 MB——端口另有一套自己的地址空间。"占不占主存空间"是两种编址方式唯一的实质代价差别,其余差异都在指令与译码上。
考点速记
- 接口的四项职能——数据缓冲、状态检测、控制定时、格式转换——分别消解速度、协议、格式三重不匹配;接口有内部接口(连 I/O 总线)与外部接口(连电缆和外设)两副面孔。
- 内容走数据线,选谁走地址线,何时做走控制线;三类端口是逻辑概念,状态端口与命令端口可合用一个物理寄存器,而主存地址不属于接口内容。
- 独立编址两套空间、靠
控制信号加专用 I/O 指令区分,地址值可以相同;统一编址一套空间分段共用、靠地址范围区分、不需专用指令,代价是占用主存地址空间。
这一节在真题里被考过的形式:
- 给四句关于 I/O 接口的叙述,挑出错的那一句(2014-21)。这道题一次考了本篇三处口径:状态端口与控制端口可以合用同一个寄存器(对,端口是逻辑划分);I/O 端口就是接口中 CPU 可访问的寄存器(对);独立编址下端口地址与主存地址可能相同(对,靠控制信号区分而不是靠地址值);而"统一编址时 CPU 不能用访存指令访问端口"说反了——统一编址的整个收益恰恰就在于普通访存指令可以直接用。⚠️ 前两句都带"可以""可能"这类弱断言,读的时候容易被当成陷阱排除掉,其实它们全是对的;错的那句往往是语气最硬的那句。
- 问 I/O 总线的数据线上传输哪些信息(2012-21)。答案是全选:命令字、状态字、中断类型号三样都走数据线。判据就是那句分工——它们都是"内容"。中断类型号最容易被误排除,因为它"听起来像控制信息";但它是一个要送回 CPU 的编号,只有数据线搬得动。
- 问中断 I/O 方式下 CPU 与端口之间不可能交换什么信息(2015-21)。答主存地址。打印字符走数据端口、设备状态走状态端口、控制命令走命令端口,三类端口正好覆盖其余三项;而中断方式下数据由 CPU 中转,主存地址全程只在 CPU 内部周转。这道题问的是"不可能",判据不是"哪个不常见",而是"哪个根本没有对应的端口"。
复习优先级:这一篇的三道真题全是 2 分选择题,且三道各打一处(端口的逻辑性质、三根线的分工、主存地址的边界),没有重复。把上面三条判据和两种编址方式的对照表吃透即可,编址那张表的六行每一行都可能被单独拎出来当选项。
易错:以为"三类端口"意味着三个物理寄存器。状态与控制方向相反、访问错开,常合用一个寄存器。
易错:把"独立编址"读成两套地址值不能重叠。正因为地址值无法区分,才要靠控制信号。
易错:以为统一编址下要用专用 I/O 指令。恰好相反,它不需要专用指令,这正是它的收益。
易错:把中断类型号当成控制信号。它是内容,走数据线。
易错:说 IN / OUT 在寄存器与设备之间传数据。另一端是端口,不是设备本体。
教材出处
- I/O 接口的四项职能、内部接口与外部接口:袁春风《计算机组成与系统结构》第 3 版 §8.3.3,印刷页 p283~p284
- I/O 接口的通用结构(图 8.7)、状态寄存器与控制寄存器"有的 I/O 接口中将它们合二为一":同书 §8.3.4,印刷页 p285
- I/O 端口及其编址,独立编址与统一编址(存储器映射方式):同书 §8.3.5,印刷页 p286~p287
相关知识
I/O 系统概述|程序查询方式与程序中断方式|DMA 方式|总线概述