本地资料I/O 系统
SCHEDULE LOCAL37 个小节覆盖真题 20092025
关联考点中断IO21DMA9IO接口3IO方式2程序查询IO方式1做相关真题 · 34 道 →
做相关真题 · 34 道选中文字可高亮或加下划线
选中文字高亮 · 下划线

I/O 系统

真题练习

本节主要掌握两点:一是 I/O 接口和端口,二是 几种 I/O 方式的细节和区别

此外,解答题还可能结合总线指标考查计算过程,因此需要理解几种 I/O 方式的细节。

输入/输出系统

以主机为中心 来看,将信息从外部设备传送到 主机 的过程称为 输入;将信息从 主机 传送到外部设备的过程称为 输出

简单架构

让我们首先来看一个早期简易 I/O 系统的架构(一般考查的也就是这种架构):

简单 I/O 系统中 CPU、主存、I/O 接口和外设经系统总线连接

在这个架构中,各部分的基本功能如下:

CPU

CPU 是整个计算机系统的控制和运算核心,负责发出控制命令(如读/写指令)以驱动外设;通过 I/O 总线访问设备控制器,进行地址寻址、数据传输和状态监测;并与内存协同,完成数据的读取、处理与存储。

外设

外设是计算机与外部世界交互的工具,例如键盘、打印机和磁盘等。它们接收来自 CPU 的输出(如打印任务),也能将物理信号(如按键动作)转换为数字信号传递给 CPU。

I/O 接口

I/O 接口是连接主机外设之间信息传输的桥梁,负责协调两者之间的同步、速度匹配和数据格式转换等问题。它在结构上包含两个部分:

  • 主机侧接口:作为 内部接口,通过系统总线与 CPU主存(内存)连接;
    • CPU ↔ 设备控制器:通过系统内部总线(如 PCI、PCIe)进行连接
  • 外设侧接口:作为 外部接口,通过 USB、串口、并口等电缆与具体 外设 连接。
    • 设备控制器 ↔ 外设:通过各种外部接口标准(如 USB、SATA、HDMI、VGA 等)进行连接

通过 I/O 接口,系统在 CPU内存外设 之间建立了一条高效的信息传输通路。这个通路大致如下:

 CPU 与内存
     ↓
  I/O 总线
     ↓
I/O 接口(设备控制器 + 接口插座)
     ↓
接口电缆(USB/SATA等)
     ↓
   外设

I/O 接口和设备控制器的关系

设备控制器更强调控制逻辑与功能,I/O 接口更强调主机和设备之间的连接与通信角色。在 408 的抽象模型中,二者常指同一块接口逻辑的不同侧面;具体硬件中,接口电路、控制器和物理连接器可能分属不同模块,不能机械地把其中一个固定说成另一个的组成部分。

现代架构

现代 I/O 硬件系统的架构更加复杂,这节不会直接考查,了解即可:

现代平台中 CPU 直连内存和部分 PCIe 设备并通过 DMI 连接 PCH 外设集线器

在现代系统中,CPU 本身集成了部分高速 I/O 控制逻辑(如 内存控制器PCIe 控制器DMI 接口等),而非核心的 I/O 控制被下放至 芯片组(PCH),也就是过去所谓的“南桥”。这将 CPU 从大量外围管理工作中解放出来,提升性能并降低功耗。

CPU 内部

  • 包含 内存控制器 和部分 PCIe 控制器
  • PCH 之间通过高速互连(如 DMI / Direct Media Interface)通信

PCH(Platform Controller Hub)

  • 管理几乎所有非高速设备(如 USB、SATA、音频、网卡等)
  • 是现代主板上的中心管理芯片,连接大量外设控制器

硬件和软件层

上文提到的是 I/O 系统的 硬件层次,除了硬件部分,I/O 系统还包括一系列的 软件组件,用以管理和调度外设资源、提供抽象接口、增强设备的可用性和通用性。主要的 软件层次 如下:

  • 用户层 I/O 软件
  • 设备独立性软件
  • 设备驱动程序
  • 中断处理程序

软硬件协同使得 I/O 操作既可高效运行,又具有高度的可移植性和扩展性。操作系统通过抽象和分层,使得新的设备只需添加驱动程序即可兼容原有的 I/O 系统,而不需要修改上层软件。

I/O 接口

结构

I/O 接口通过数据、状态和控制寄存器连接系统总线与外设
  • 数据缓冲:CPU 寄存器、主存 等主机部件的存取速度比外设快很多,因此为了速度匹配,可将数据提前存到 I/O 接口 中的数据缓冲区,用以中和高速系统组件和低速外部设备之间的速度差异
  • 数据格式转换:主机和外设的数据格式不同,I/O 接口 提供数据格式的相互转换,如串并转换、数模转换等
  • 控制和定时:为来自系统总线的控制信号和定时信号提供控制和定时逻辑,对内部资源及外设间动作的先后关系进行协调,并对数据通信过程进行控制
  • 错误或状态检测:提供可以保存各种状态信息的状态寄存器,CPU 通过读取这些寄存器来了解接口和外设的出错情况或状态
  • 与主机和设备通信:上述四个功能都必须通过主机与 I/O 接口之间、I/O 接口与外设之间的通信来完成。

I/O 端口

I/O 端口(Input/Output Port)不是外壳上的物理插座,而是 I/O 接口中可由 CPU 编址访问的寄存器。处理器通过端口地址读写数据、状态和控制信息,从而与键盘、鼠标、磁盘等外设通信。

CPU 通过端口地址访问 I/O 接口内的数据、状态和控制寄存器

组成部分

I/O 端口 可以根据其功能和传输的数据类型进行分类:

  • 数据端口:用于传输实际的数据。
  • 状态端口:用于传输外围设备的状态信息,例如设备是否准备好。
  • 控制端口:用于传输控制命令,例如启动或停止设备。
I/O 端口按功能分为数据端口、状态端口和控制端口

编址方式

为了方便 CPU 对于 I/O 端口的访问,需要对各个端口进行编号,每个端口对应一个端口地址。

编址方式主要有统一编址独立编址两种。

统一编址与独立编址分别共享或分离主存和 I/O 地址空间
统一编址

统一编址也叫做 内存映射 I/O(Memory-Mapped I/O, MMIO),具备如下特点:

  • I/O 设备寄存器 映射到内存地址空间,CPU 使用普通的访存指令即可访问;具体指令名称由 ISA 决定。
  • 优点是 统一寻址、指令通用性强,但可能占用部分主存地址空间。
独立编址

独立编址也叫做 端口映射 I/O(Port-Mapped I/O, PMIO),具备如下特点:

  • I/O 端口地址与 内存地址空间 分离,使用单独的 I/O 地址空间。
  • 访问需使用 ISA 提供的专用 I/O 指令,例如 x86 的 INOUT
  • 每个设备被分配一组 固定的端口号,如键盘控制器常用端口 0x600x64

下表给出了 MMIOPMIO 这两种方式的对比:

编址方式 别名 地址空间 访问方式 是否占用存储器地址空间
统一编址 内存映射 I/O(MMIO) 与主存共享地址空间 普通访存指令
独立编址 端口映射 I/O(PMIO) 独立 I/O 地址空间 专用 I/O 指令

I/O 方式

程序查询方式

程序查询方式不断轮询设备状态以判断其是否可以进行数据传输,数据从 设备 → CPU → 主存。

程序查询方式由 CPU 反复读取状态端口并经 CPU 寄存器传送数据

程序查询方式包含以下步骤:

  1. 查询:CPU 定期查询或检查 I/O 设备的状态寄存器,查看设备是否准备就绪。
  2. 判断:如果设备未就绪,CPU 在查询程序中继续轮询;如果设备就绪,则进行数据传输。纯程序查询方式通常不能在等待期间自动转去执行无关任务。
  3. 数据传输:CPU 直接与 I/O 设备交换数据,可以是读操作或写操作。
  4. 结束:数据传输完成后,CPU 继续执行其他任务,同时继续轮询 I/O 设备状态。

程序中断方式

在程序中断方式中,当 I/O 设备 准备好 进行数据传输时,会触发一个 硬件中断来通知 CPU。CPU 会暂停当前正在执行的任务,处理中断,然后恢复执行被中断的任务。

相比于轮询方式,CPU 在执行程序中断之前不需要一直检查 I/O 设备的状态,这提升了效率。

程序中断方式在设备准备阶段让 CPU 执行主程序并在请求到来后转入 ISR

基础概念

  • 中断向量:指向中断处理程序入口地址的信息。
  • 中断向量表(Interrupt Vector Table,IVT):
    • IVT 是一个数据结构,它将中断号映射到中断处理程序的地址。
    • 每个中断向量都包含中断处理程序的入口地址。
  • 中断服务程序(Interrupt Service Routine,ISR):响应特定中断事件的一段代码。
    • 保存被中断程序的上下文(寄存器状态等)。
    • 处理中断事件,例如读取硬件设备的数据、响应软件错误等。
    • 恢复被中断程序的上下文,使程序能够从中断点继续执行。
中断类型号经向量表索引得到 ISR 入口地址并转移执行

以支持向量中断的抽象 CPU 为例,中断发生时,CPU 根据中断向量表基址和 中断号(中断类型)找到相应的中断向量,再跳转到对应的处理程序。具体表基址机制由架构规定,例如某些体系结构使用专用基址寄存器;8086 实模式向量表则位于固定物理地址。INT <中断号> 是软件主动触发自陷的指令,不是外设发出的硬件中断请求,但二者可以复用向量分派机制。

中断处理过程

外设 IRQ 经中断判优、断点保存、向量寻址、ISR 和中断返回的完整过程

上图给出了一个详细的计算机中断处理过程的图例。不同计算机的中断处理过程不同,考察该知识点的题目也经常没有统一的标准。这里说明一个比较详细全面的过程,可以帮助大家应付绝大多数相关考题:

  1. 中断触发
    • 外设向计算机发送一个 IRQ(中断请求)。
  2. 中断识别
    • 处理器完成当前指令的执行,并开始中断处理过程。
    • 处理器检查确定哪个中断被触发。如果中断使能,处理器会响应这个中断信号。
  3. 中断屏蔽
    • 在执行中断服务程序之前,处理器会禁止或优先级屏蔽进一步的中断,以防止中断处理程序被其他中断打断。
      • 如果是 单级中断:直接关闭可屏蔽中断响应;
      • 如果是 多重中断:设置中断屏蔽字,通常屏蔽当前及更低优先级的中断。
  4. 保存断点
    • 硬件 保存返回地址和程序状态字(PSW)等架构规定的最小状态;通用寄存器通常由中断服务程序按需保存。
  5. 中断服务寻址
    • 根据中断号在中断向量表中找到中断向量。
  6. 执行中断服务程序
    • 处理器根据中断向量跳转到相应的中断服务程序(ISR),中断服务程序包含以下内容:
      • 保存现场:程序使用的通用寄存器。
      • 处理中断事件(核心业务逻辑)
      • 恢复现场:恢复之前保存的现场来恢复中断之前执行的任务。
      • 中断返回(开中断、恢复断点):执行一条专门的中断返回指令(比如 IRET 指令),该指令将程序计数器(PC)和程序状态字(PSW)等恢复到中断前的值,然后继续执行中断之前的程序。
执行轨迹

外设 IRQ 如何进入 ISR 并返回原程序

逐步区分中断判优、屏蔽、硬件保存断点、向量寻址和软件保存现场等职责。

01

外设提出 IRQ外设把中断请求送给处理器或中断控制器;当前指令仍按体系结构规定完成。

对于中断处理过程,大家需要注意两点:

  • 断点 和 现场 的区别。
  • 哪些步骤是硬件完成的,哪些步骤是软件完成的。

下图给出了软硬件在中断处理过程中的职责,与上述过程相对应:

硬件完成中断响应和断点保存,软件 ISR 完成现场保存、处理与恢复

保护断点和保护现场的区别

首先是 断点 和 现场 两个词的语义差别,一般来讲,断点 就是进程在中断之前执行的位置和状态,这包含程序计数器(PC)、程序状态字(PSW / FLAGS),可能还有堆栈指针(SP)等信息。

现场 大多数情况下与 上下文(context)具有相同的含义,不过现场是更加口语化的词。一般来讲,现场这一概念是包含断点的(即断点是 现场或上下文 的子集)。但是在很多考察中断的题目中,倾向于把 现场 和 断点 这个词区分开来,也就是说 现场 仅代表通用寄存器的内容。

所以大家要灵活应变,还是理解中断的核心机制,才能应付出题人的模棱两可。

中断中硬件和软件的功能

  • 保存断点:由 中断隐指令 自动完成(硬件),保存体系结构规定的返回地址和状态。在 8086 语境中可表现为保存 CS:IP 和 FLAGS;其他架构使用各自的 PC/PSW 表示。
  • 保存和恢复现场:在 中断服务程序 内保存(软件 完成),中断服务程序可能会使用到 CPU 中的某些寄存器,通过保存这些寄存器的内容,确保在中断程序执行完后,CPU 可以恢复到执行中断服务程序前的状态。
  • 恢复断点:由中断服务程序执行专用中断返回指令触发,例如 x86 的 IRET;处理器硬件据此恢复断点和状态。

单级中断

若 CPU 在执行中断服务程序的过程中,又 出现了新的更高优先级 的中断请求,而 CPU 对新的中断请求 不予响应,则这种中断称为单重中断。

上文的中断处理过程以单级中断为例。对于单级中断,中断控制可以通过 FLAGS 寄存器中的 IF 标志位实现:

  • IF = 1(中断使能):允许 CPU 响应中断请求(IRQ)。
  • IF = 0(中断禁止):CPU 暂不响应可屏蔽外部中断;不可屏蔽中断不受 IF 控制。

多重中断

多重中断,也称为中断嵌套,是指在 CPU 执行中断服务程序的过程中,若出现新的 更高优先级的中断请求,CPU 能够 暂停 当前的中断服务程序,转而 处理新的中断请求。这种机制允许系统更高效地响应高优先级事件。

多重中断中高优先级请求打断低优先级 ISR 并形成嵌套现场

要实现多重中断,CPU 必须满足以下条件:

  • 开中断设置:在中断服务程序中,需提前设置开中断指令,以允许更高优先级的中断请求被响应。如果中断服务程序中未开启中断,则新的中断请求将被延迟处理。
  • 优先级机制:高优先级的中断源有权打断低优先级的中断源。系统中通常通过硬件或软件定义中断优先级,以确保关键任务优先得到处理。

中断屏蔽

中断屏蔽技术用于 动态调整中断处理的优先级。每个中断源对应一个 屏蔽触发器,触发器的 值为 1 表示屏蔽该中断源的请求, 值为 0 表示允许该中断源正常申请。所有屏蔽触发器组合形成一个屏蔽字,存储在屏蔽字触发器中,用于控制中断请求的接受与否。

中断屏蔽字的每一位控制对应中断源是否允许请求

如上图所示,屏蔽字的每一位对应一个中断源,控制在执行某个中断服务程序时 是否屏蔽其他中断源的请求

例如,若中断源 B 的优先级高于 C 和 D,则在处理 B 的中断时,需屏蔽 B、C、D 的中断请求,屏蔽字可能设置为 0100。这种机制确保高优先级中断的执行不被低优先级中断干扰,同时允许更高优先级的中断嵌套。

注意:中断屏蔽字主要用于多级中断的选择性屏蔽。单级中断常在处理中断时整体关闭可屏蔽中断响应,因而不需要利用屏蔽字实现嵌套优先级;NMI 等不可屏蔽来源仍另行处理。

根据是否可以被屏蔽,中断分为 可屏蔽中断(Maskable Interrupt)和 不可屏蔽中断(Non-Maskable Interrupt, NMI):

可屏蔽中断

可屏蔽中断 是指可以通过设置屏蔽触发器或屏蔽字来暂时阻止其请求的中断。这类中断通常与非紧急事件相关,例如外部设备的数据传输请求。

系统可以通过屏蔽字动态调整哪些可屏蔽中断可以触发,以优化中断处理的优先级和系统资源分配。例如,在执行高优先级任务时,可以屏蔽低优先级的可屏蔽中断,以避免不必要的上下文切换。

不可屏蔽中断

不可屏蔽中断 是指无法通过普通屏蔽字或屏蔽触发器阻止的中断,通常与系统关键事件相关,例如硬件故障、电源异常或严重错误。它具有很高优先级,但仍在体系结构规定的安全边界响应,不等于任意时刻“立即”打断。

由于其不可屏蔽的特性,NMI 的设计旨在保证系统的可靠性和安全性,但需要谨慎使用,因为它们会强制打断当前任务,包括其他中断服务程序。


在硬件设计中,可屏蔽中断和不可屏蔽中断通过 不同的信号线 连接到 CPU 的 引脚 上。以 x86 架构为例,NMI 信号通过特定的 NMI 引脚输入,而 INTR 信号由可编程中断控制器(如 8259A)管理,分别管理不同类型的中断:

x86 外部中断引脚以 INTR 接收可屏蔽请求、NMI 接收不可屏蔽请求
  • INTR:接收 可屏蔽 中断,处理常规外设中断,如串口通信、设备事件或定时器中断。系统通过中断控制器和屏蔽字控制优先级与响应时机。
  • NMI:接收 不可屏蔽 中断,处理严重错误,如内存校验错误、电源失效等。

DMA 方式

DMA(Direct Memory Access,直接内存访问)是一种计算机系统的 I/O 方式,它允许 DMA 控制器在外设和主存之间直接传送数据,无需 CPU 逐字搬运。

有了上面的 程序中断方式,虽然在 一定程度上 实现了 CPU 和外设的并行工作,但并不完全并行。CPU 只是在外设的数据准备阶段可以去执行其他程序而不需要原地等待,在执行中断服务程序传输数据时仍要全程参与。因此如果是高速 I/O 设备,CPU 仍要频繁的暂停现行程序去处理中断。

DMA 方式减少了程序中断方式逐字传送的开销,使 数据传输过程与主程序可在一定程度上并行工作;二者仍可能争用总线、主存和 Cache 等资源。

原理

DMA 让数据在外设和主存之间直接传送,使传送期间不再需要 CPU 执行单字搬运、反复处理中断、保存断点和恢复 CPU 现场等操作。

在 DMA 方式中,CPU 只参与预处理(CPU 通过初始化程序来设置 DMA 控制器的各参数寄存器的初始值,如内存首地址、字计数值等)和后处理过程(传送完成后 CPU 会进行数据校验等工作)。通常适用于以块读写的设备。

DMA 不占用 CPU 执行单元逐字搬运数据,但会消耗互连和内存带宽,并可能引起 Cache 一致性维护,因此不能说 CPU 性能完全不受影响。

外设和内存之间的数据是否还经过 CPU?

外设写入内存时,数据绕过 CPU 核心的寄存器和执行单元。在现代 SoC 或集成内存控制器平台中,数据可能经过片上互连与内存控制器;在其他结构中,DMA 控制器也可能位于芯片组或设备侧。CPU 负责预先配置和授权,但不逐字执行传送指令。

比如我们通过下表对该过程进行 更加精细化的分解 🔍 :

层次 是否经过 说明
CPU 核心的寄存器/执行单元 DMA 不用 CPU 通用寄存器逐字搬运数据
系统互连 DMA 与 CPU、主存之间需要通过平台互连交换事务
内存控制器 最终访问 DRAM 必须由内存控制器完成,其物理位置由平台决定
CPU 的授权/控制路径 DMA 前需配置地址、长度、方向和权限等控制结构

DMA 控制器

DMA 控制器由地址寄存器、数据缓冲、计数器、控制状态寄存器和 I/O 控制逻辑组成

DMA 控制器由以下若干组件构成:

  • 主机 - 控制器接口
    • DR(数据寄存器):暂存从设备到内存或从内存到设备的数据。
    • MAR(内存地址寄存器):暂存数据在内存中的地址。
    • DC(数据计数器):表示剩余要读/写的字节数。
    • CR(命令/状态寄存器):用来存放 CPU 发来的 I/O 命令,或设备的状态信息。
  • I/O 控制逻辑
  • 块设备 - 控制器接口

DMA 控制器和 CPU 的关系

DMA 控制器可以集成在 SoC、芯片组或具体 I/O 设备中,也可以作为独立控制器。早期单总线模型常把 DMA 控制器画在 CPU 之外,通过系统总线连接外设和主存;无论物理位置如何,它都必须在取得相应总线或内存访问权限后才能传送数据。

步骤

DMA 方式与中断 I/O 方式一样,也是采用“请求 - 响应”的方式,只是中断 I/O 方式请求的是 处理器的时间,DMA 方式请求的是 总线控制权。如下图,为进程 P1 在磁盘和主存之间进行数据交换的过程示意图:

进程发起磁盘 DMA 后由控制器取得总线、在外设和主存间传送并最终中断通知 CPU

DMA 进行 I/O 传输包含如下过程:

  1. 预处理:在进行 DMA 传输之前,CPU 需要进行初始化设置,包含源地址、目标地址、数据传输长度以及数据传输方向。
  2. DMA 请求:外设向 DMA 控制器发出传送请求,DMA 控制器再向总线仲裁逻辑申请总线或主存访问权。
  3. 获取总线控制权:仲裁逻辑响应请求后,DMA 控制器在获准的周期内成为总线主设备,进行 DMA 操作。
  4. 数据传输:DMA 控制器进行数据传输,这个过程不需要 CPU 的干预。
  5. 结束与后处理:DMA 控制器更新状态并释放总线控制权,通常通过中断通知 CPU 整块传输完成;CPU 再检查结果、处理错误或启动后续操作。
执行轨迹

一次块 DMA 传输中 CPU 与控制器如何分工

从 CPU 预处理开始,逐步查看设备请求、总线授权、成块传送、完成中断和后处理。

01

CPU 完成预处理CPU 配置源地址、目标地址、长度、方向和权限,然后可继续执行主程序;数据尚未传送。

使用总线方式

在 DMA 方式中,DMA 接口和 CPU 共享主存,因此它们同时访问主存时,会出现总线的争用问题,为了实现主存的分时复用,有以下三种方法:

  1. 总线独占(停止 CPU 访存或成组传送)
    • 在这种模式下,DMA 控制器会取得对总线的 独占控制权。在传输期间,CPU 将无法访问内存,因为总线已经被 DMA 控制器占用了。
    • 在独占期间,CPU 通常会执行不涉及内存访问的指令,如计算或寄存器操作,或者进入等待状态直到 DMA 操作完成。
  2. 周期挪用(Cycle Stealing,也叫周期窃取):
    • 在循环窃取模式下,DMA 控制器会 逐个窃取总线周期 来进行数据传输,而不是一次性占据所有的总线周期。
    • CPU 在 DMA 未占用总线的周期仍可访问内存,但被挪用的周期会延迟 CPU 访存。
  3. DMA 与 CPU 交替访存(分时多路复用)
    • 在分时多路复用模式下,DMA 控制器和 CPU 会在 预定的时钟周期内轮流使用总线
    • 这种方式确保了 CPU 和 DMA 控制器都可以在它们的时隙内访问内存,但都无法全时段访问。
DMA 总线独占、周期挪用和与 CPU 交替访存三种时序对比

CPU 和 DMA 控制器的总线优先级

在教材的典型模型中,当 CPU 和 DMA 同时需要访问主存时,DMA 控制器通常优先获得总线使用权

因为高速外设一旦开始传送,必须及时取走或送入数据,否则有限缓冲区可能溢出或下溢。实际系统仍由总线仲裁策略、实时性与服务质量要求决定优先级,并非所有 DMA 请求都无条件高于 CPU。

三种 I/O 方式的责任划分与时序判断

程序查询、中断和 DMA 的根本差别不在于“有没有 I/O 接口”,而在于 CPU 介入数据搬运的频率。三者都通过接口寄存器同设备控制器交互,但控制流和数据流不同:

方式 CPU 在等待期间做什么 每个数据单元谁搬运 适合的情形
程序查询 反复读取状态寄存器,忙等直到就绪 CPU 执行读端口、写内存等指令 设备很快或传送量很小
程序中断 可执行其他程序,设备就绪后转入服务程序 通常仍由 CPU 在中断服务程序中搬运 设备速度中等、事件不太频繁
DMA 只在开始配置和结束处理时介入 DMA 控制器在设备与主存之间成块搬运 大量、连续的高速数据传送

因此,中断方式减少的是等待时间,不必然减少 CPU 对每个字节或字的搬运指令;DMA 才把成块数据通路从 CPU 指令流中移开。DMA 的“直接”是指外设和主存之间的数据不经 CPU 的通用寄存器,不是指完全绕过 I/O 接口、主存总线或 CPU 的初始化控制。

中断与 DMA 的完整责任链

CPU 发起 DMA 时会把源/目的地址、传送方向、传送长度和控制位写入 DMA 控制器。控制器获得总线后重复“读一侧、写另一侧、地址递增、计数递减”;计数归零或设备报告结束后,再向 CPU 发出完成中断。地址寄存器和计数寄存器的变化由 DMA 控制器维护,CPU 只需在中断处理时确认完成状态、处理缓冲区或启动下一次传送。

响应普通可屏蔽中断时,硬件首先在规定的指令边界接受请求,保存能恢复执行所必需的断点和处理机状态的一部分,并按中断向量找到服务程序入口;服务程序保存其余可能被破坏的通用寄存器、处理设备原因,恢复现场后执行中断返回。断点是“回到哪里继续执行”的地址语义,现场是“恢复后如何保持原程序状态”的寄存器与状态字语义,二者不能互换。

多重中断下,优先级和屏蔽位决定当前处理程序是否允许被更高优先级请求打断。通常先保护现场、再开放合适的中断级别,避免在尚未保存寄存器时嵌套导致状态破坏。周期挪用并不表示 CPU 每个周期都停机:被挪用的访存周期会延迟 CPU 的存储器访问,CPU 在某些阶段仍可能进行寄存器运算或执行不需争用主存总线的工作。

接口寄存器把设备时序变成可编程状态

典型 I/O 接口至少把设备相关信息分为数据、状态和控制三类寄存器。数据寄存器暂存输入或输出的数据单元;状态寄存器给出就绪、忙、完成或错误等标志;控制寄存器保存命令、传送方向和中断允许等设置。CPU 对接口的操作顺序通常是“配置控制信息—检查或等待状态—读写数据—确认完成或错误”,接口内部再把这些抽象寄存器动作转换为具体设备信号。

端口独立编址和存储器映射 I/O 的主要差别在地址空间与指令编码:前者用专门 I/O 指令和端口号,后者把设备寄存器放入统一地址空间并用普通读写指令访问。两种方式都不是把设备控制器省掉,也都可能通过中断或 DMA 协同传输。判断题若看到“内存地址”,还要看是否明确说成主存单元;统一编址中的一个地址可能对应设备寄存器而非 DRAM。

接口缓冲区的存在用于协调 CPU、总线和设备的速度差异,却不是无限队列。程序查询若过慢会让输入缓冲溢出;输出设备若尚忙就接受新数据也可能覆盖旧数据。中断、DMA 和握手信号的共同目标,是在不丢失数据的前提下让快速部件不必永久等待最慢部件。

读、写与完成信号要按数据方向理解

CPU 从输入设备读取时,设备控制器先把数据放入接口的数据寄存器并置就绪状态,CPU 或 DMA 再把该数据取走;CPU 向输出设备写入时,接口接收数据后通常置忙,设备完成消耗后才重新置就绪。状态位的含义由设备定义,但“数据已经到接口”和“设备已经完成物理动作”可能是两个不同事件,例如磁盘控制器已接受命令并不等于扇区已经传输完成。

因此,DMA 完成中断通常表示本次内存与接口缓冲区之间的块传送已结束;设备级的最终完成、错误或下一块请求还需查看相应状态寄存器。解题时把数据流方向、发起方、缓冲位置和完成通知分别标出,便能避免把 CPU 写设备、设备写主存、DMA 读写方向混成同一个箭头。