高优先级

选择题高频考点,主要两点:1. IO 接口和端口。2. 几种 IO 方式的细节和区别

此外,在解答题中偶尔也会结合总线指标考查一些计算过程,所以需要深入了解几种 IO 方式的细节。

输入/输出系统

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

简单架构

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

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

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

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

🔹 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 接口更强调连接位置与通信角色。两者其实并不是严格等同,但在很多场景下它们是同一个物理实体的不同视角。可以将 I/O 接口视为设备控制器的一部分。

现代架构

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

在现代系统中,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 接口

结构

  • 数据缓冲:CPU 寄存器、主存 等主机部件的存取速度比外设快很多,因此为了速度匹配,可将数据提前存到 I/O 接口 中的数据缓冲区,用以中和高速系统组件和低速外部设备之间的速度差异

  • 数据格式转换:主机和外设的数据格式不同,I/O 接口 提供数据格式的相互转换,如串并转换、数模转换等

  • 控制和定时:为来自系统总线的控制信号和定时信号提供控制和定时逻辑,对内部资源及外设间动作的先后关系进行协调,并对数据通信过程进行控制

  • 错误或状态检测:提供可以保存各种状态信息的状态寄存器,CPU 通过读取这些寄存器来了解接口和外设的出错情况或状态

  • 与主机和设备通信:上述四个功能都必须通过主机与 I/O 接口之间和 I/O 接口 与 外设 之间的通信来完成

I/O 端口

I/O 端口(Input/Output Port)是计算机系统中用于处理器与外部设备(如键盘、鼠标、显示器、打印机等)之间进行 数据交换的接口。它们是硬件和软件交互的关键部分,允许处理器通过特定的地址与外设通信。

组成部分

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

  • 数据端口:用于传输实际的数据。
  • 状态端口:用于传输外围设备的状态信息,例如设备是否准备好。
  • 控制端口:用于传输控制命令,例如启动或停止设备。

编址方式

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

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

[统一编址] 

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

  • I/O 设备 直接映射到内存地址空间,CPU 使用普通的 MOV 指令即可访问设备寄存器。
  • 优点是 统一寻址、指令通用性强,但可能占用部分主存地址空间。

[独立编址] 

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

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

下表给出了 MMIO 和 PMIO 这两种方式的对比:

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

I/O 方式

程序查询方式

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

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

  1. 查询:CPU 定期查询或检查 I/O 设备的状态寄存器,查看设备是否准备就绪。

  2. 判断:如果设备未就绪,CPU 会继续执行其他任务或持续轮询;如果设备就绪,则进行数据传输。

  3. 数据传输:CPU 直接与 I/O 设备交换数据,可以是读操作或写操作。

  4. 结束:数据传输完成后,CPU 继续执行其他任务,同时继续轮询 I/O 设备状态。

注意

程序查询方式分为两种

  1. 独占查询,如果题目中讲 cpu 和 外设 之间是串行通信,说明查询方式是独占的
  2. 定时查询,该方式没有笨到一直让 CPU 处于忙等的状态,它会在两次查询间做其他事

程序中断方式

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

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

基础概念

  • 系统中断向量:系统中断向量是一个指向中断处理程序入口地址的指针,PC + PSW

  • 中断向量表(Interrupt Vector Table, IVT):

    • IVT 是一个数据结构,它将中断号映射到中断处理程序的地址。
    • 每个中断向量都包含中断处理程序的入口地址。
    • 该结构存储在 主存中
  • 中断服务程序(Interrupt Service Routine, ISR):中断处理程序是一段特殊的代码,用于响应特定的中断事件。

    • 保存被中断 程序的上下文(寄存器状态等)。
    • 处理中断事件,例如读取硬件设备的数据、响应软件错误等。
    • 恢复被中断程序的上下文,使程序能够从中断点继续执行。

CPU 可以通过 INT <中断号> 指令来执行特定的中断。当中断发生时,CPU 会根据 中断向量表基址寄存器(IVTBR)查找中断向量表的起始地址,再使用 中断号(中断类型)作为表下标找到相应的中断向量。然后,CPU 会使用中断向量中的地址,跳转到对应的中断处理程序执行。

中断处理过程

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

  1. 中断触发

    • 外设向计算机发送一个 IRQ(中断处理请求)。
  2. 中断识别

    • 处理器完成当前指令的执行,并开始中断处理过程。
    • 处理器检查确定哪个中断被触发。如果中断使能,处理器会响应这个中断信号。
  3. 中断屏蔽

    • 在执行中断服务程序之前,处理器会禁止或优先级屏蔽进一步的中断,以防止中断处理程序被其他中断打断。
      • 如果是 单级中断:直接关中断
      • 如果是 多重中断:设置中断屏蔽字,要屏蔽比当前中断优先级更低的中断
  4. 保存断点

    • 硬件 会保存当前任务的位置和状态,通常包括程序计数器(PC)、程序状态字(PSW)和其他必要的寄存器,以便中断处理完成后能够恢复。

      这里注意区别 异常、自陷和中断,只有异常需要重新执行当前指令,中断和自陷都从下一条指令开始。此时我们需要将 PC + "1"存储到堆栈区
  5. 中断服务寻址

    • 根据中断号在 中断向量表中找到中断向量。
  6. 执行中断服务程序

    • 处理器根据中断向量跳转到相应的中断服务程序(ISR),中断服务程序包含以下内容:
      • 保存现场:程序使用的通用寄存器。
      • 处理中断事件(核心业务逻辑)
      • 恢复现场:恢复之前保存的现场来恢复中断之前执行的任务。
      • 中断返回(开中断、恢复断点):执行一条专门的中断返回指令(比如 IRET 指令),该指令将程序计数器(PC)和程序状态字(PSW)等恢复到中断前的值,然后继续执行中断之前的程序。

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

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

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

注意

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

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

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

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



中断中硬件和软件的功能

  1. 保存断点:由 中断隐指令 自动保存(硬件 完成),保存 CPU 在中断时即将执行的指令地址,即通过寄存器 CS:IP 指向的内存地址,完成中断后可通过保存的 CS:IP 内容恢复下一条指令的执行。
  2. 保存和恢复现场:在 中断服务程序 内保存(软件 完成),中断服务程序可能会使用到 CPU 中的某些寄存器,通过保存这些寄存器的内容,确保在中断程序执行完后,CPU 可以恢复到执行中断服务程序前的状态。
  3. 恢复断点:一般是在中断服务程序中触发(RET 指令),但是由硬件执行。

中断请求

第 1 步属于 中断请求

中断判优

因为中断分两个部分,一个响应、一个处理,所以对应的优先级也分两个部分

可以通过硬件(排队器)或是软件(查询程序)来实现

判优要遵循如下原则

  • 硬件故障中断属于最高级,其次是软件中断

  • 非屏蔽中断优于可屏蔽中断(对于某些中断,如内中断,即使没有开中断也是能够被响应的)

  • DMA请求优于外中断

  • 高速设备优于低速设备

  • 输入设备优于输出设备

  • 实时设备优于普通设备

重点

中断响应

第2、3、4、5步属于 中断响应阶段 ,该阶段也叫做 中断隐指令 ,它属于硬件直接实现的一系列自动操作

其中在外设给出数据处理完成后,可以先跳出外部中断服务程序运行阶段,转头准备新的数据,剩下的程序处理交给 CPU 独自处理即可!

中断处理

第 6 步 属于 中断处理

中断处理就是 由软件执行 中断服务程序 的过程

单重中断

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

上文我们提到的 中断处理过程就是以单级中断为例的。对于单级中断,中断控制非常简单,直接使用 FLAGS 寄存器中的 IF 标志位即可:

  • IF = 1(中断使能):允许 CPU 响应中断请求(IRQ)。
  • IF = 0(中断禁止):CPU 忽略 外设或中断源发出的中断请求。

多重中断

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

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

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

中断屏蔽

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

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

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

注意

注意 中断屏蔽字是针对多级中断的,对于单级中断来说,我们在处理中断的过程中直接关中断,拒绝其他一切中断请求,所以无需中断屏蔽字。

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

[可屏蔽中断] 

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

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

[不可屏蔽中断]

注意

不可能由外设发出 ,为了保护系统的稳定性和安全性,只有在系统出现紧急事件时,才会发出不可屏蔽中断

而且 在计算机是没有响应阶段的,它直接对接中断处理

不可屏蔽中断 是指无法通过屏蔽字或屏蔽触发器阻止的中断,通常与系统关键事件相关,例如硬件故障、电源异常或严重错误。这类中断具有最高优先级,确保系统能够在紧急情况下立即响应。

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

即使是 不可屏蔽中断, 依旧要等到 CPU 处理完当前指令,才能接受到其 中断请求


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

  • [INTR]:接收 可屏蔽 中断,处理常规外设中断,如串口通信、USB 设备插拔或定时器中断。系统通过屏蔽字动态控制 INTR 的优先级和响应时机。
  • [NMI]:接收 不可屏蔽 中断,处理严重错误,如内存校验错误、电源失效等。

同时到达时的题目

不同时到达的题目

DMA 方式

DMA(Direct Memory Access,直接内存访问)是一种计算机系统的 I/O(输入/输出)方式,它允许 外部设备直接访问主内存 而无需 CPU 的干预。

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

DMA 方式就是为了解决程序中断方式的这种缺陷,它增加了 “数据传输过程与主程序并行工作” 的特点。

为了让 高速块设备 传输数据时 CPU 不被频繁中断;

常见 采用 DMA 方式的设备有: 网卡 磁盘 固态硬盘

这些设备必须配有 DMA 接口,否则使用不了 DMA 方式

DMA传送时,CPU让出总线控制权,由DMA控制器控制总线,通过“挪用”一个主存周期完成和主存之间的一次数据交换,或独占若干个主存周期完成一批数据的交换

BOK补充

DMA存取冲突

原理

DMA 让数据传送直接在 外设和内存之间 开辟一条 数据通路,使得数据传送期间不再需要占用 CPU 时间处理中断、保护断点和恢复 CPU 现场等繁琐操作。

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

这意味着在 DMA 方式下,CPU 的核心计算资源几乎不受数据传输的影响。

注意

通过 DMA 方式,外设和内存之间进行数据传输是否还需要经过 CPU?

外设写入内存时,数据“绕过了 CPU 的寄存器和执行单元”,但仍然必须“经过 CPU 芯片内部的互连与 内存控制器”来完成写入,整个过程由 CPU 授权和调度,不占用 CPU 核心计算资源。

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

| 层次 | 是否经过 | 说明 |
| -------------------------- | ---- | --------------------------- |
| CPU 的 寄存器 / 执行单元 | ❌ 否 | DMA 不用 CPU 寄存器搬数据,也不打断指令流 |
| CPU 的 互连结构(SoC Fabric) | ✅ 是 | 所有 I/O 访问在 CPU 芯片内都要通过互连 |
| CPU 的 内存控制器(IMC) | ✅ 是 | 最终访问内存必须经过内存控制器,现代 CPU 内部集成 |
| CPU 的 授权 / 控制路径 | ✅ 是 | DMA 之前需配置地址、长度、权限等控制结构 |

DMA 控制器

通常把专门用来控制总线进行DMA传送的接口硬件称为 DMA 控制器

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

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

注意

DMA 控制器和 CPU 的关系

现代 DMA 控制器一般集成在 CPU 内部,上图给出了早期计算机系统中的一种 DMA 控制器在 单总线架构的实现:独立于 CPU 之外,通过系统总线连接到外设,控制外设和内存之间的数据传输。

步骤

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

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

  1. 预处理:在进行 DMA 传输之前,CPU 需要进行初始化设置,包含源地址、目标地址、数据传输长度以及数据传输方向。

  2. DMA 请求:外设向 DMA 控制器发送 DMA 请求,并向 CPU 发送总线请求。

  3. 获取总线控制权:CPU 响应总线请求,发出总线响应信号,DMA 控制器接管总线控制权,进行 DMA 操作周期。

  4. 数据传输:DMA 控制器进行数据传输,这个过程不需要 CPU 的干预。

  5. 释放总线控制权:一旦 DMA 控制器完成数据传输,它会发出 DMA 传输完成信号(中断请求信号),通知外设设备数据已经传输完毕。同时 DMA 控制器会释放总线控制权,使 CPU 可以继续执行其他任务。

重点

注意

这里 DMA 是在 传输完信号才发送的 中断请求信号,为什么呢?

因为需要 CPU 来帮他擦屁股,传完数据后留下来的检验过程都必须让 CPU 处理!

使用总线方式

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

  1. 总线独占(Bus Mastering):

    • 在这种模式下,DMA 控制器会取得对总线的 独占控制权。在传输期间,CPU 将无法访问内存,因为总线已经被 DMA 控制器占用了。
    • 在独占期间,CPU 通常会执行不涉及内存访问的指令,如计算或寄存器操作,或者进入等待状态直到 DMA 操作完成。
  2. 周期挪用(Cycle Stealing,也叫做循环窃取):

    • 在循环窃取模式下,DMA 控制器会 逐个窃取总线周期 来进行数据传输,而不是一次性占据所有的总线周期。
    • 这意味着 CPU 在 DMA 控制器未使用总线时仍然可以访问内存。因此,DMA 和 CPU 会交替使用总线,通常不会显著影响 CPU 的操作。
  3. 分时多路复用(Time-Division Multiplexing):

    • 在分时多路复用模式下,DMA 控制器和 CPU 会在 预定的时钟周期内轮流使用总线
    • 这种方式确保了 CPU 和 DMA 控制器都可以在它们的时隙内访问内存,但都无法全时段访问。

注意

在流水线 CPU 中,流水线的长度以最复杂的操作所花的时间为准,总线周期(访存时间)通常是耗时最长的,因此通常可认为 总线周期、存储周期和流水线长度是等价的

注意

此处交替分时访问法,袁春风老师的书本上写的是每个存储周期内,但面向考试应说cpu工作周期更恰当

提问

CPU 和 DMA 控制器哪一个对于 总线访问的优先级更高

当 CPU 和 DMA 都需要访问主存时,DMA 控制器可以优先获得总线使用权

因为磁盘一旦开始读写,就必须按时完成数据传送,否则数据缓冲区中的数据会发生丢失。

做题总结

必看

可屏蔽中断 在五级流水线指令执行到第二个流水段时,这个中断会在什么时候响应 ?

假如此时的中断是 不可屏蔽中断 ,这个中断响应又是在什么时机呢 ?

指令周期

一般 不可屏蔽中断 和 可屏蔽中断 的响应时机 都在一条指令 执行周期 后的 中断周期

只有 DMA 请求总线 的响应时机是在当前 总线周期 结束后

仔细分辨

响应 DMA 请求指的是:CPU检测并决定响应 DMA请求,这件事只需要在任意机器周期结束、一个总线时钟周期结束时就可以执行

一个总线时钟周期内 = 一个机器周期 = 取指阶段的时间(确保存储字长等于指令字长)

DMA 响应是:CPU实际让出总线控制权,这件事才需要在一个完整总线事务完成、一个总线传输周期结束执行

总线传输周期 = 总线事务