输入/输出系统

前六章讲的是主机内部:数据怎么表示(第 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 能做的只有两件事:

  1. 读/写接口里的端口寄存器(一次总线事务)。
  2. 接收接口发来的中断请求。

至于”把字符打印到纸上""从磁道读出扇区”这些动作,全部由接口去驱动设备完成。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 系统组成的软硬件划分:驱动程序是软件,控制器是硬件。

链接