输入输出系统
第七章_输入输出系统
*7.1 输入输出系统和 IO 控制方式
本小节思维导图如下图所示:

*7.1.1 I / O 系统的基本概念
首先我们需要知道,主机是通过 I / O 接口和 I / O 设备进行交互的,如下图所示:
现在的 I / O 接口(芯片)通常集成在南桥芯片的内部。
I / O 硬件和软件 的概念如下图所示:

*7.1.2 I / O 控制方式
对于 I / O 控制方式简介 如下图所示:
由于快速 I/O 设备使用程序中断方式会导致 CPU 利用率严重下降。因此产生了 DMA 的控制方式:
有的大型机,中型机可能会接上超多的 I/O 设备,如果都让 CPU 来管理,那么 CPU 就太累了,因此采用 通道(弱化版 CPU) 来进行 I / O 接口的统一管理:

*7.2 外部设备
常见输入设备如下图所示:
现在鼠标都是光电式。
常见的输出设备如下图所示:
显示器的常见性质:
注:现代计算机中显存除了当前显示帧的缓存,还会用于保存即将渲染的图像数据。集成显卡计算机通常分出一篇内存作为显存。
显示器的分类:
打印机:

7.3 I / O 接口
本小节思维导图如下:

7.3.1 I / O 接口的基本概念
这是 I / O 接口(也称 I / O 控制器)的实物结构,不是 I / O 设备(I / O 接口外部接口连接),也不是 I / O 端口(I / O 接口内部):

I/O 接口的主要功能如下:
- 地址译码与设备选择: 当 CPU 发出 I/O 操作请求时,会同时提供目标外设的地址码。接口对地址进行译码,产生设备选择信号,确保主机仅与指定外设通信。
- 通信联络与时序协调: 主机与外设的工作速度通常不匹配。接口通过握手信号或状态轮询机制,动态协调双方操作节奏,确保数据传输可靠有序。
- 数据缓冲: 接口设有数据缓冲寄存器,用于暂存传输数据,避免因速度不匹配导致的数据丢失。
- 信号格式转换: 主机与外设在电平标准、数据格式或信号类型上可能存在差异。接口需完成电平转换、并 / 串或串 / 并转换、模 / 数或数 / 模转换等,以实现物理兼容。
- 控制命令与状态信息传递: CPU 通过向接口的控制寄存器写入命令(如 “启动”)控制外设;外设通过状态寄存器反馈状态(如 “就绪”)。当外设需要主动通知 CPU(如数据到达)时,接口可向 CPU 发出中断请求,由 CPU 适时响应处理。
关于 I / O 接口的工作原理 如下图所示:

7.3.2 I / O 端口及其编址
I / O 端口指的是能直接被 CPU 访问的 I / O 接口中的寄存器,不是 I / O 接口连接的那些 I / O 设备!(别总想着计算机网络中的端口)
独立编址: 关于独立编址的来源是这样的:早期架构如 X86 架构中 I / O 设备中的寄存器很少,于是直接采用物理编址的方式,如 60H 表示数据寄存器,这种 60H 其实并不是什么空间的地址,而是一个编号!这个编号体系长的像空间编址体系。
你可以这么看:I / O 设备的编址体系看成一个地址空间比如 0-65535,其中不同地址对应不同寄存器编号–这就是 I / O 空间。所有 I / O 设备都共享同一个 I / O 地址空间,所以不同 I / O 接口的端口不能重名。I / O 空间并不是真的物理空间,而是一套体系!
站在 CPU 视角上看,其实有两种地址空间,内存空间(包括虚拟内存空间)和 I / O 空间,如 X86 架构的汇编语言:MOV AL,[60H] 表示访问的是主存空间;IN AL,60H 表示访问的是 I / O 设备中的寄存器。
内存空间(包括虚拟内存空间)和 I / O 空间 地址值可以相同,因为属于不同的地址空间,但是 CPU 需要通过专门的指令(如 X86 中的 IN 和 OUT)才能访问 I / O 端口,指令中的地址字段指定端口号。
统一编址: 在现代通常采用统一编址(MMIO),将 IO 设备中的寄存器映射到物理地址空间中(但是寄存器还是物理存在),CPU 使用普通访存指令即可访问这些寄存器,而不再需要专门的 IO 指令和独立 IO 空间。
统一编址和独立编址如下图所示:

7.4 异常与中断机制
7.4.1 异常与中断的基本概念
异常(也称内中断) 是指 CPU 在执行指令过程中,由其内部检测到的同步事件,例如除零错误、非法操作码、页缺失等。这类事件由当前指令直接引发,具有确定性和可重现性。在处理第 i 条指令时发生异常,立刻响应,若事件可恢复(除数为 0就不可恢复),恢复后重新执行第 i 条指令。
中断(也称外中断) 则是由外部设备(如 I/O 控制器)发起的异步事件,用于通知 CPU 外设状态发生变化(如数据就绪或传输完成)。中断的发生与当前指令无关,具有随机性。外中断仅在第 i 条指令完整执行结束后才被检测,中断需要从第 i + 1 条指令开始继续执行。
如图所示:
需要了解一个特殊的标记 – 关中断(IF标志位),如图所示:

7.4.2 异常和中断的分类
异常的分类:
| 类型 | 含义 | 典型例子 |
|---|---|---|
| 故障(Fault) | 执行当前指令时发现问题,通常可以被处理后重新执行该指令 | 缺页、除数为0等 |
| 陷阱(Trap) | 执行当前指令后产生,通常是有意设置的 | 系统调用、调试陷阱 |
| 终止(Abort) | 发生严重错误,通常无法恢复 | 硬件故障、严重存储器错误 |
中断的分类:
| 类型 | 含义 | 特点 |
|---|---|---|
| 可屏蔽中断 | CPU可以通过关中断/屏蔽中断暂时不响应 | 一般用于普通外部设备 |
| 不可屏蔽中断 | CPU不能通过普通的关中断操作来禁止 | 一般用于非常紧急、严重的外部事件 |
终止异常和外中断都属于硬件中断。
7.4.3 中断的工作流程
7.4.3.1 中断请求
中断源 是指能够向 CPU 发出中断请求的设备或事件。一台计算机允许多个中断源同时存在,且各中断源发出请求的时间具有随机性。为记录并区分不同的中断请求,中断系统为每个中断源设置一个 中断请求标记触发器:当其状态为 “1” 时,表示该中断源有中断请求。这些触发器可组成中断请求标记寄存器,该寄存器可集中置于 CPU 内部,也可分散在各个中断源中。
中断请求标记如图所示:
注意:通过 INTR 信号线 发出的都是 可屏蔽中断,通过 NMI 信号线 发出的是 不可屏蔽中断。

7.4.3.2 中断响应与中断处理
首先区分什么叫做中断响应,什么叫做中断处理,什么叫做中断响应优先级,什么叫做中断处理优先级:
- 中断响应优先级: 指多个中断请求 同时 到来时,CPU 先响应哪个中断。
- 中断处理优先级:指 CPU 已经在处理 某个中断时,另一个中断来了,能不能打断当前中断。
- 中断响应: 在 408 中就是中断隐指令对应的过程。
- 中断处理: 在 408 中就是中断处理程序对应的过程。
中断响应优先级判断 如下:
- 硬件故障中断属于最高级,其次是软件中断;
- 非屏蔽中断优于可屏蔽中断;
- DMA请求优于I/O设备传送的中断请求
- 高速设备优于低速设备;
- 输入设备优于输出设备;
- 实时设备优于普通设备。
中断响应优先级判断电路如下图所示(不考,便于理解):
注意:中断请求寄存器 + 判优逻辑电路 才是 排队器,别混了。其次,中断响应优先级判断方式 通常是硬件方式或中断查询程序。
中断响应与中断处理:
CPU 对选中的中断进行 中断响应 ,其中硬件自动完成一系列操作,这部分通常称为中断隐指令对应的操作过程。
随后转入 中断服务程序(由软件完成)。中断服务程序过程被称作 中断处理。
中断处理过程如下图所示,需要记忆,可能会考有哪些过程(下图的中断处理过程是广义的中断处理过程,包含中断处理与中断响应):
中断隐指令:
- 关中断。
- 保存断点:将 程序计数器(PC) 和 程序状态字(PSW)(有些架构保存 PSW 由中断服务程序完成) 保存至栈或专用寄存器。
- 引出中断服务程序:通过识别中断源,将对应的中断服务程序入口地址送入程序计数器 PC ,识别方法主要有 硬件向量法(涉及到下方中断向量的知识)和软件查询法。
中断向量:
在向量中断中,每个中断源被分配一个唯一的中断类型号,该类型号对应一个中断服务程序的入口地址,此地址称为 中断向量。系统将所有中断向量集中存放在内存的特定区域,该区域称为 中断向量表。

中断处理优先级判断(中断屏蔽技术): 中断处理优先级判断用于多重中断,很明显,中断处理优先级判断是决定不同中断服务程序的完成顺序(注意:中断屏蔽仅在 CPU 执行中断服务程序期间生效)。是指在处理中断 A 的过程中,新的中断 B 到来。中断 A 能不能被打断。如图所示:
通过一个题来具体看中断处理优先级判断会怎么考察:

7.5 I / O 方式
7.5.1 程序查询方式
程序查询方式的工作流程如下:
根据查询策略的不同,程序查询方式能够分为两类:
- 独占查询: CPU 100% 的时间都在查询 I / O 状态,完全串行。(所以在上面小节看见的那张图其实是独占查询方式)
- 定时查询: 在保证数据不丢失的情况下,每个一段时间 CPU 就查询一次 I / O 状态,查询的间隔内 CPU 可以执行其他程序。
用一个例题来了解程序查询方式:

7.5.2 程序中断方式
程序中断方式显而易见,即 I/O 设备通过 I/O 接口向 CPU 发送中断请求,CPU 响应中断后暂停当前程序的执行,转去执行中断服务程序,处理完毕后再返回原程序继续执行。
这里通过一个题目来熟悉这部分内容的考察方式:

7.5.3 DMA 方式
本节思维导图如下图所示:

7.5.3.1 DMA 控制器(DMA 接口)
首先明确一点,DMA 接口并不是代替了 I / O 接口,而是 与 I / O 接口并行,外设发送数据 -> I / O 接口 -> DMA 接口。
在 DMA 方式中,对数据传送过程进行控制的硬件称为 DMA 控制器(DMA 接口)。整个 DMA 传输流程如下:
- 首先,存储地址、传输计数等信息通常在 DMA 请求发生之前,就已经由 CPU/操作系统 配置好了。
- 当 I/O 设备需要进行数据传送时,通过 DMA 控制器向 CPU 提出 DMA 请求,CPU 响应后即让出系统总线,由 DMA 控制器接管总线并执行数据传送。
- 传输完成后,DMA 通过发送中断请求的方式向 CPU 报告数据传输完成,并释放总线控制权;CPU 响应中断后,可根据需要重新配置 DMA,以进行下一次传输。
注意:DMA 请求是总线请求,而不是中断请求哈(书上没说但可以就这么记)。
DMA 控制器的结构 如下图所示:
其主要功能如下:
- 接收外设发出的 DMA 请求,并向 CPU 发出总线请求信号。
- 在 CPU 发出总线响应信号后,DMA 控制器接管总线控制权,进入 DMA 操作周期。
- 确定数据传送的主存起始地址及长度,并自动更新主存地址计数器和传送长度计数器。
- 指定数据在主存与外设间的传送方向,发出读 / 写等控制信号,完成数据传送。
- 在 DMA 操作结束后,向 CPU 报告传送完成。
7.5.3.2 DMA 传送过程
在了解完 DMA 的功能和物理结构之后,通过动态的过程来了解 DMA 传送过程,如下图所示:

7.5.3.2 DMA 传送方式与传送过程
在三总线结构中,主存分别与 DMA 和 系统总线有连接,在 I / O 外设通过 DMA 控制器向 CPU 发出 DMA 请求总线传输时,可能会和 CPU 使用总线发生冲突,那么怎么规划 CPU 和 DMA 访存顺序?具体有如下三种方式:
- 停止 CPU 访存:DMA 需要传输时,CPU 暂停访存,让 DMA 独占总线进行数据传送;传送完成后 CPU 恢复访存。
- DMA 与 CPU 交替访存:把 一个存储周期分成两个时间段,一个给 DMA,一个给 CPU,两者交替访问主存。
- 周期挪用(周期窃取):DMA 需要访问主存时,挪用 CPU 的一个 存储周期。DMA 传送一个数据后释放总线,CPU 再继续工作;DMA 再需要时再次挪用。DMA 一次传送的数据量由 DMA 控制器和系统的数据通路等具体设计决定。
如下图所示:
而在 单总线结构 中,DMA 与 CPU 共享同一总线,DMA 访存必须通过总线请求与仲裁机制获得控制权。不会出现同时访存的情况,也就不会出现上述三种控制方式。
7.5.3.3 DMA 的特点
如下图所示,看看就好:

7.5.4 程序中断 VS DMA
最后做一个程序中断方式和 DMA 方式的对比,如下图所示:
