Skip to content

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 接口的通用结构

图 8.7 I/O 接口的通用结构

左边是 I/O 总线侧的数据线、地址线、控制线;中间是数据缓冲寄存器、状态 / 控制寄存器和 I/O 控制逻辑(含地址译码);右边是面向具体外设的界面控制逻辑与连接器插座。把连线关系单独抽出来:

        CPU 侧(I/O 总线)              I/O 接口                设备侧
                          ┌──────────────────────────┐
                     ┌───→│  数据端口(数据缓冲寄存器) │←──→ 外设数据
                     │    ├──────────────────────────┤
   数据线 ←────双向───┼───→│  命令端口(控制寄存器)    │───→ 外设控制信号
                     │    ├──────────────────────────┤
                     └───→│  状态端口(状态寄存器)    │←─── 外设状态信号
                          ├──────────────────────────┤
   地址线 ──────────────→ │  地址译码 / 设备选择电路   │
   控制线 ──────────────→ │  (读/写、时序控制逻辑)   │───→ 外设控制时序
                          └──────────────────────────┘

这张图最容易画反的是命令字和状态字的走线:CPU 下命令是把命令字当数据写进控制寄存器、查状态是把状态字当数据读回来,两者与中断类型号一样都走数据线

三根线的分工可以压成一句话:内容走数据线,选谁走地址线,何时做什么走控制线。命令字、状态字、中断类型号全都是"内容",一律走数据线;控制线上跑的是读/写、M/IO、中断响应这类时序信号。理由在结构上——数据线是接口里唯一一条双向的、按字宽成批搬运内容的通路,地址线单向且只送选择信号,控制线送的是单根的时序电平,都装不下一个字宽的命令字或类型号。

三类 I/O 端口

接口中可被 CPU 访问的寄存器统称 I/O 端口:

端口类型存放内容方向
数据端口输入 / 输出数据可读可写
状态端口就绪、忙、完成、出错等状态信息CPU 只读
命令端口CPU 发出的控制命令CPU 只写

"三类端口"是逻辑划分,不是物理寄存器的个数。 状态寄存器与控制寄存器传送方向相反(一个只读、一个只写),而且 CPU 对它们的访问在时间上通常错开(先查状态、后下命令),所以有的接口干脆把两者合二为一:同一个物理寄存器,高几位当状态位段读、低几位当控制位段写。看到"状态端口和控制端口可以合用同一个寄存器",那是对的。

另一条边界前一篇已经立过,这里再钉一次:主存地址不属于任何一类端口。查询与中断方式下 CPU 自己访存,主存地址只在 CPU 内部周转,从不出现在接口上;只有 DMA 控制器才持有它。

三、I/O 端口的编址

接口里的寄存器要能被指令指名道姓地访问,就得给它们编号。两种方案:

独立编址下,两套空间从地址码的形式上无法区分——同一个二进制数既可能是主存单元号,也可能是端口号。因此必须靠指令表明本次访问打的是哪一套:CPU 执行 IN / OUT 时产生的是 I/O 读 / I/O 写总线事务,控制线上的 M/IO 信号随之翻转,两条译码通路各认各的。

指令方向
IN AL, portI/O 端口 → 通用寄存器
OUT port, AL通用寄存器 → I/O 端口

这张表的两端都要读准:I/O 指令的另一端是端口,不是设备本体。"IN / OUT 在通用寄存器与设备之间传送数据"是错的说法——CPU 够不到设备。

还有一处误判值得单独钉住:"独立"指的是译码通路独立,不是地址值不许重叠。既然靠 M/IO 控制信号区分,同一个地址值 0x60 完全可以既是某个主存单元、又是某个 I/O 端口,硬件按控制信号走哪条译码通路,不会混淆。把独立编址理解成"两套地址值不能相同",恰好把因果关系弄反了——正因为无法从地址值上区分,才必须靠控制信号。

统一编址下,端口与主存在同一个空间的不同地址段里,靠地址范围就能区分,因而不需要专门的 I/O 指令——普通的访存指令(load / store、MOV)就能存取端口。

特性独立编址统一编址
地址空间两套,互相平行一套,分段共用
靠什么区分控制信号M/IO)+专用指令地址范围
使用指令专用 I/O 指令(IN / OUT)普通访存指令(load / store、MOV)
占用主存空间
寻址方式全部可用
典型架构Intel 处理器架构(64K 个 I/O 地址编号)多数 RISC 架构,如 RISC-V、MIPS

实际系统常两种并存:x86 既有 IN / OUT 访问的独立编址端口,也把显存等大块资源做成存储器映射。

统一编址下端口与主存怎么瓜分地址空间(想弄清"占不占主存空间"这句话落到数字上是什么样时展开)

某机地址线 20 位,采用统一编址方式,把地址空间最高的 4 KB 分配给 I/O 端口,每个端口 8 位。

地址空间总量=220 B=1 MB=1048576 B可用主存=10485764096=1044480 B=1020 KB

每个端口 8 位 = 1 B,占一个地址编号,故端口数 =4096=4K 个。

换成独立编址,这台机器的主存仍是完整的 1 MB——端口另有一套自己的地址空间。"占不占主存空间"是两种编址方式唯一的实质代价差别,其余差异都在指令与译码上。

考点速记

  1. 接口的四项职能——数据缓冲、状态检测、控制定时、格式转换——分别消解速度、协议、格式三重不匹配;接口有内部接口(连 I/O 总线)与外部接口(连电缆和外设)两副面孔。
  2. 内容走数据线,选谁走地址线,何时做走控制线;三类端口是逻辑概念,状态端口与命令端口可合用一个物理寄存器,而主存地址不属于接口内容
  3. 独立编址两套空间、靠 M/IO 控制信号加专用 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 方式总线概述

真题练习