第 7 章 输入/输出系统
408 计算机组成原理第 7 章 输入/输出系统复习讲义,涵盖核心概念、重点考点与典型题型。
Last updated on
一、第 7 章到底在研究什么?
可以把整个第 7 章压缩成两个问题:
问题 1:CPU 怎么和千奇百怪的外设连接? → I/O 接口解决。
问题 2:CPU 要以什么方式控制外设传数据? → 程序查询、中断、DMA 解决。
所以整章知识树是:
第7章 输入/输出系统
│
├─ 7.1 I/O系统基本概念
│ ├─ 输入/输出
│ ├─ 外部设备
│ └─ I/O硬件、I/O软件
│
├─ 7.2 I/O接口 ★★★
│ ├─ I/O接口功能
│ ├─ 数据/状态/控制寄存器
│ ├─ I/O端口
│ └─ 统一编址 / 独立编址
│
└─ 7.3 I/O方式 ★★★★★
├─ 程序查询方式
├─ 程序中断方式 ★★★★★
│ ├─ 中断请求
│ ├─ 中断判优
│ ├─ 中断响应条件
│ ├─ 中断隐指令
│ ├─ 中断向量
│ ├─ 中断服务程序
│ ├─ 单重/多重中断
│ └─ 中断屏蔽字
│
└─ DMA方式 ★★★★★
├─ DMA控制器
├─ 周期挪用等方式
├─ DMA传送过程
└─ 性能计算建议复习优先级:
第一梯队:中断、DMA
第二梯队:I/O 接口和端口编址
第三梯队:程序查询方式
了解即可:具体外设的工作特点。
二、7.1 I/O 系统基本概念
1. 什么叫输入和输出?
一定以主机为参照物。
- 外设 → 主机:输入
- 主机 → 外设:输出
例如:
键盘 → CPU/主存
属于输入
CPU/主存 → 显示器
属于输出不要从人的角度判断。
三、为什么需要 I/O 接口?
这是理解第 7 章最关键的第一步。
CPU 和内存都是高速、规则的数字部件,但外设差异巨大,例如:
- 有的设备很快,有的非常慢;
- 有的是串行数据,有的是并行数据;
- 数据位宽不同;
- 工作状态不同;
- 控制信号不同;
- 电气特性也不同。
显然不能要求 CPU 针对每台外设设计完全不同的连接方法。
因此在:
CPU / 主存
│
│ 系统/I/O总线
▼
I/O接口
│
▼
外设之间加入一个适配层——I/O 接口。
可以把它理解成“翻译员 + 缓冲区 + 控制器”。
资料中的典型连接关系就是:
四、7.2 I/O 接口
1. I/O 接口的核心功能
不需要机械背一大串,理解成五类即可。
(1)设备选择
CPU 必须告诉系统:
“我现在访问的是哪个设备?”
所以接口必须能够对 CPU 给出的地址进行译码。
(2)数据缓冲
CPU 很快,外设通常比较慢。
例如 CPU 一瞬间给打印机发送一个字,而打印机可能还没有准备好。
于是:
CPU
↓
数据缓冲寄存器
↓
外设慢慢取反过来输入也是一样:
外设
↓
数据缓冲寄存器
↓
CPU读取因此数据缓冲寄存器的本质是:
速度匹配。
(3)数据格式转换
例如:
- 串行 ↔ 并行;
- 数据宽度转换;
- 不同设备格式之间转换。
所以主机侧数据宽度与设备侧数据宽度不要求相等。
(4)传送控制命令
CPU 可能告诉设备:
- 启动;
- 停止;
- 复位;
- 读;
- 写。
这些命令一般写入控制寄存器。
(5)报告设备状态
设备也要告诉 CPU:
- Ready;
- Busy;
- Error;
- 数据已准备好;
- 缺纸等。
这些信息通常放在状态寄存器。
五、I/O 接口内部最重要的三个寄存器
资料中将接口内部核心寄存器归纳为三类。
| 寄存器 | 存什么 | CPU通常怎样访问 |
|---|---|---|
| 数据缓冲寄存器 | 真正传输的数据 | 读/写 |
| 状态寄存器 | Ready、Busy、Error 等 | 读 |
| 控制寄存器 | 启动、停止、读写命令等 | 写 |
最重要的理解是:
CPU ──数据──► 数据寄存器
CPU ──命令──► 控制寄存器
CPU ◄─状态── 状态寄存器一个非常容易考的细节
状态寄存器和控制寄存器甚至可以共用一个地址。
为什么?
因为:
- CPU 对状态寄存器主要是读;
- CPU 对控制寄存器主要是写。
访问方向不同。
因此可以设计成:
读地址 X → 状态寄存器
写地址 X → 控制寄存器也就是说:
一个端口地址不一定只能对应一个物理寄存器。
六、I/O 接口中三类总线分别传什么?
这是典型选择题考点。
资料总结为:
数据线
不只是传“用户数据”。
还可能传:
- I/O 数据;
- 状态信息;
- 控制信息;
- 中断类型号。
所以遇到:
“数据线上只能传数据。”
这是错误的。
地址线
负责:
指定 CPU 当前访问接口中的哪个端口。
例如:
0x100 → 数据端口
0x104 → 状态端口
0x108 → 控制端口控制线
传:
- 读/写信号;
- 中断请求;
- 中断响应;
- 总线请求;
- 总线响应;
- 握手信号等。
因此:
中断请求通常走控制线。
而:
中断类型号可以走数据线。
这个组合特别容易混。
七、I/O 接口和 I/O 端口不是一个东西
这是本章非常高频的概念陷阱。
I/O 接口
是整个硬件逻辑模块。
例如:
┌──────── I/O接口 ────────┐
│ 数据寄存器 │
│ 状态寄存器 │
│ 控制寄存器 │
│ 地址译码 │
│ 控制逻辑 │
└─────────────────────────┘I/O 端口
是:
I/O 接口内部能够被 CPU 直接访问的寄存器。
因此:
I/O接口
│
├─ 数据端口
├─ 状态端口
└─ 控制端口所以:
一个 I/O 接口通常可以拥有多个 I/O 端口。
通常每个可独立寻址的 I/O 端口都有自己的端口地址。资料的模拟题也专门考查这一点。
八、I/O 端口的两种编址方式 ★★★★
这是必会选择题。
1. 统一编址
又称:
存储器映射 I/O(Memory-Mapped I/O)
核心思想:
I/O 端口和主存统一放进同一个地址空间。
假设 CPU 有地址:
0000H ~ FFFFH可以规定:
0000H ~ EFFFH → 主存
F000H ~ FFFFH → I/O端口CPU 看地址范围判断访问谁。
指令
因为 I/O 端口被“伪装”成内存地址,所以普通访存指令就能访问。
例如逻辑上:
LOAD
STORE即可。
不需要专用 IN/OUT 指令。
优点
- 指令统一;
- 可以使用丰富的访存寻址方式;
- 编程方便;
- 可以利用存储保护机制保护 I/O 空间。
缺点
占用一部分主存地址空间。
一个经典陷阱
“统一编址根据指令类型区分访问主存还是 I/O。”
错误。
实际上:
根据地址范围区分。
因为使用的是同一套访存指令。资料中的模拟题就直接针对这个陷阱。
九、独立编址
也称 I/O 映射方式。
I/O 地址空间和主存地址空间完全分离。
例如:
内存地址:
00000000H ~ FFFFFFFFH
I/O地址:
0000H ~ FFFFH两个地址空间可以出现“相同数值”,但表示不同对象。
必须有专门 I/O 指令
例如:
IN
OUT所以:
资料也明确指出,独立编址时普通访存指令不能访问 I/O 空间,需专用输入/输出指令。
两者对比
| 项目 | 统一编址 | 独立编址 |
|---|---|---|
| 地址空间 | I/O与主存共用 | 相互独立 |
| 是否占主存地址 | 是 | 否 |
| 指令 | 普通访存指令 | IN/OUT 等专用指令 |
| 寻址方式 | 丰富 | 通常较少 |
| 判断访问对象 | 看地址 | 看I/O指令/控制信号 |
| 编程 | 简单 | 相对复杂 |
记忆:
统一:地址统一,指令统一。
独立:地址独立,指令也独立。
十、7.3 三种 I/O 方式——整章核心
本质上在研究一个问题:
外设传数据时,CPU 到底参与多少?
随着技术发展:
程序查询
CPU什么都干
↓
程序中断
CPU不用等,但还要搬数据
↓
DMA
连搬数据都交给DMA因此 CPU 负担:
十一、程序查询方式
又称轮询、Polling。
工作过程
假设从键盘读数据:
CPU启动键盘
↓
读取状态寄存器
↓
Ready?
┌─否────────┐
│ │
└──继续查询──┘
↓ 是
读取数据寄存器
↓
处理数据伪代码就是:
start_device();
while (status != READY) {
// 一直查
}
data = IO_DATA;十二、为什么程序查询效率低?
最核心的问题:
CPU 忙等。
外设可能需要:
CPU 一条指令可能只有:
量级。
但 CPU 却不断做:
好了没?
好了没?
好了没?
好了没?
……在等待过程中无法有效执行其他程序。
所以:
- CPU 和外设基本串行;
- CPU 时间大量浪费。
资料总结程序查询方式优点是硬件简单,缺点是 CPU 查询、等待开销大。
十三、程序查询方式的计算题
一般套路非常固定。
如果:
- 每秒查询 次;
- 每次查询耗费 个时钟周期;
- CPU 主频为 。
CPU 花在查询上的周期:
所以 CPU 时间占比:
如果要求百分比:
核心原则:
都转换成“每秒占多少 CPU 时钟周期”。
十四、程序中断方式 ★★★★★
这是整章第一大重点。
程序查询的问题是:
CPU 不知道设备什么时候准备好,所以只能一直问。
中断则反过来:
CPU 不问了。 设备准备好了以后主动叫 CPU。
十五、中断的直观过程
假设磁盘开始 I/O:
CPU启动磁盘
↓
CPU继续运行程序
↓ 磁盘自己工作
CPU继续运行 ────────────────►
↓
完成
↓
发中断请求
↓
CPU暂停当前程序
↓
执行中断服务程序
↓
处理I/O
↓
返回原程序于是:
CPU 和设备可以并行工作。
资料也将“实现 CPU 与 I/O 设备并行工作”作为中断的重要作用。
十六、中断方式是不是 CPU 完全不负责数据传输?
不是。
这是 DMA 和中断最重要的区别之一。
中断方式下:
数据通常仍由 CPU 在中断服务程序中搬运。
例如:
设备
↓
I/O数据寄存器
↓
CPU寄存器
↓
主存也就是说:
CPU 只是:
不用一直等待设备。
而 DMA 才是真正:
十七、中断请求
能产生中断的设备或事件称为:
中断源。
每个中断源通常有一个中断请求标志。
例如:
IR0 = 1 → 设备0请求中断
IR1 = 0 → 设备1无请求
IR2 = 1 → 设备2请求中断十八、可屏蔽中断和不可屏蔽中断
资料区分:
- INTR:可屏蔽中断;
- NMI:不可屏蔽中断。
可屏蔽中断
当 CPU 处于关中断状态时,可以不响应。
例如一般 I/O 请求。
不可屏蔽中断
通常代表非常严重的问题。
不受普通中断允许标志控制。
所以优先级通常更高。
十九、中断响应优先级 ★★★★
多个设备可能同时发中断:
A请求
B请求
C请求CPU 不可能同时服务三者。
于是必须:
判优。
硬件决定一个:
这就是:
中断响应优先级。
资料强调:
响应优先级一般由硬件线路或查询顺序决定,是固定的。
常见原则:
- 不可屏蔽 > 可屏蔽;
- 高速设备 > 低速设备;
- 输入设备 > 输出设备;
- 实时设备 > 普通设备。
二十、CPU 响应 I/O 中断必须满足什么条件? ★★★★★
资料明确列了三点。
条件 1:存在有效中断请求
没有设备请求,自然无中断。
条件 2:CPU 处于开中断状态
一般要求:
不可屏蔽中断等例外。
条件 3:当前指令已经执行结束
普通外部 I/O 中断不会:
一条指令做到一半突然切掉。
通常是:
执行指令 I1
↓ 完成
检测中断
↓
响应中断而不是:
I1执行一半
→ I/O中断这个一定和“异常”区分。
二十一、中断与异常的检测时机
简化理解:
中断
来自 CPU 外部,通常:
指令执行完成后检测。
异常
与当前指令执行有关,因此可以在:
执行当前指令过程中发现。
例如除零、缺页等。
这是第 5 章和第 7 章交叉考点。
二十二、中断响应到底由谁完成?
这是考试最爱问的地方。
中断分成两大阶段:
中断响应
↓
硬件自动完成
中断处理
↓
中断服务程序软件完成一定分清。
二十三、中断隐指令 ★★★★★
CPU 决定响应中断后,硬件自动完成的一系列动作叫:
中断隐指令。
注意:
它不是 ISA 中真正能写出来的一条机器指令。
只是对一系列硬件动作的统称。
资料将核心动作总结为三项:
1 关中断
为什么第一步必须关?
假设 CPU:
正在保存PC突然又来第二个中断。
此时现场还没保存完整,系统就乱了。
因此必须先:
2 保存断点
断点就是:
中断处理完以后应该回哪里。
普通 I/O 中断发生在一条指令完成后,所以保存的通常是:
3 引出中断服务程序
CPU 要知道:
到底是哪台设备中断了,我应该执行哪个中断服务程序?
于是取得中断服务程序入口地址并:
所以:
这一条建议直接背下来。
二十四、“断点”和“现场”不是同一个东西
这是超级经典易错点。
断点
主要指:
- PC;
- 必要的 PSW 等。
作用:
回原程序。
通常由:
硬件保存。
现场
指:
- 通用寄存器;
- 其他可能被 ISR 修改的寄存器;
- 屏蔽字等。
作用:
恢复 CPU 原先的计算状态。
一般由:
中断服务程序软件保存。
因此:
资料也专门强调了这一差别。
二十五、中断类型号、中断向量、中断向量表 ★★★★★
这三个名称特别容易混。
假设键盘:
中断类型号 = 8这只是:
编号。
系统有一张表:
类型号0 → ISR0地址
类型号1 → ISR1地址
……
类型号8 → 键盘ISR地址这张表就是:
中断向量表。
其中:
键盘ISR地址就是:
中断向量。
因此关系是:
资料中对此流程有明确说明。
二十六、中断请求信号和中断类型号走的线不一样
典型选择题:
中断请求
属于控制信息:
中断类型号
属于编码信息:
不要看到“中断”两个字就全选控制线。
二十七、完整中断处理流程 ★★★★★
支持多重中断时,可以完整记成:
硬件:
① 关中断
② 保存断点
③ 引出ISR
软件:
④ 保存现场和原屏蔽字
⑤ 设置新屏蔽字、开中断
⑥ 执行ISR主体
⑦ 关中断
⑧ 恢复现场和屏蔽字
⑨ 开中断并中断返回资料将前三步归入中断隐指令,后续由中断服务程序完成。
最重要的考试结论:
二十八、为什么 ISR 中间还要重新开中断?
为了:
允许更高优先级中断打断当前 ISR。
这就是:
多重中断 / 中断嵌套。
二十九、单重中断 vs 多重中断
单重中断
CPU 在 ISR 中:
不响应新的普通中断。
主程序
↓
ISR A
↓
返回主程序多重中断
ISR 还可能被更高优先级中断打断:
主程序
↓
ISR A
↓
ISR B
↓
ISR C
↑
返回 B
↑
返回 A
↑
返回主程序断点必须层层压栈:
主程序断点
A的断点
B的断点然后:
后进先出。
这其实就是栈。
资料也用这一结构解释多重中断。
三十、最容易混的两个优先级 ★★★★★
1. 响应优先级
问:
多个中断同时出现,CPU 先响应谁?
通常由:
硬件决定。
例如:
一般不能通过普通屏蔽字直接改变硬件判优次序。
2. 处理优先级
问:
CPU 正在处理 A 时,B 能不能打断 A?
由:
中断屏蔽字控制。
可以软件调整。
所以:
资料专门指出二者必须区分。
三十一、中断屏蔽字 ★★★★★
一般规定:
假设:
A B C D某 ISR 的屏蔽字:
0 1 1 0意思:
- A:允许;
- B:禁止;
- C:禁止;
- D:允许。
三十二、屏蔽字到底怎么构造?
这是有“算法”的。
如果要求处理优先级:
核心规则:
一个 ISR 执行期间,只允许处理优先级比自己更高的中断打断自己。
并且通常还:
屏蔽自己。
A
A 最高,没有谁能打断:
A B C D
1 1 1 1D
只有 A 比 D 高:
A B C D
0 1 1 1C
A、D 比 C 高:
A B C D
0 1 1 0B
A、D、C 都比 B 高:
A B C D
0 1 0 0因此:
| ISR | A | B | C | D |
|---|---|---|---|---|
| A | 1 | 1 | 1 | 1 |
| B | 0 | 1 | 0 | 0 |
| C | 0 | 1 | 1 | 0 |
| D | 0 | 1 | 1 | 1 |
这正是资料例 7.3 的典型屏蔽字设计。
三十三、屏蔽字题的通用算法
不要死背表。
假设处理优先级:
那么对 ISR :
比 高的置 0。
自己以及比它低的全部置 1。
所以:
高优先级 → 允许 → 0
自身及低优先级 → 屏蔽 → 1就这么简单。
三十四、例 7.3 的执行轨迹怎么做?
硬件响应优先级:
处理优先级:
初始:
A、C、D 同时请求。
因为主程序阶段先按照响应优先级判断:
所以先:
主程序 → AA 屏蔽全部:
1111所以必须把 A 做完。
此时 C、D 仍在等待。
回主程序后,同时存在 C、D:
硬件响应优先级:
于是:
主程序 → C进入 C 后屏蔽字:
0110也就是:
- A 可以打断;
- D 可以打断;
- B、C 不行。
D 此时仍有未处理请求,因此:
C → DD 完成以后:
D → C如果 B 在 C 服务期间提出请求,由于 C 的屏蔽字中:
所以 B 暂时不能打断 C,只能等待。
最终:
主程序
↓
A
↓
主程序
↓
C
↓
D
↓
C
↓
主程序
↓
B
↓
主程序屏蔽字大题最稳妥的分析顺序是:
先看有没有被屏蔽 → 再看硬件响应优先级。
三十五、中断 I/O 的性能计算 ★★★★
资料给了一个很典型的例 7.2。
条件:
- CPU 主频 ;
- 每次中断总开销 400 个时钟周期;
- 数据端口 32 位;
- 外设数据率 。
CPU 处理中断一次需要多久?
因此:
设备多久产生一份 32 位数据?
32 位:
所以:
得到:
但是:
意思是:
CPU 还没处理完上一次中断,下一批数据已经到了。
于是可能丢数据。
因此:
这种高速设备不适合每 32 位中断一次。
三十六、中断方式可承受最大数据率的通式
如果:
- 每次中断传 字节;
- 每次中断需要 个周期;
- 主频 。
CPU 一次中断耗时:
设备产生 字节耗时:
至少要满足:
因此:
得到:
这类题看到“能否采用中断方式”,基本就比较这两个时间。
三十七、为什么还需要 DMA?
中断解决了:
CPU 不必等。
但没解决:
CPU 仍然要亲自搬每个字。
高速设备例如持续大量传数据时,会出现:
设备准备一个字
↓
中断
↓
CPU搬一个字
设备再准备
↓
中断
↓
CPU再搬
……CPU 会被中断淹没。
因此进一步提出:
DMA。
三十八、DMA 是什么? ★★★★★
DMA:
Direct Memory Access,直接存储器访问。
核心:
直接传数据。
数据不用由 CPU 一字一字搬运。
资料明确指出 DMA 尤其适合高速设备的大批量数据传输。
三十九、DMA 的真正数据通路
非常容易出选择题。
不是:
外设 → DMA → CPU → 主存而是:
设备接口
│
│
DMA控制
│
▼
主存即数据传输通路位于:
资料的题库中 2024 年真题式题目也直接考查这一点。
四十、DMA 是不是完全不需要 CPU?
不是。
DMA 是:
传输过程中 CPU 不逐字参与。
CPU 仍然需要做:
开始前
给 DMA 控制器设置:
- 主存起始地址;
- 传送长度;
- 传送方向;
- 设备地址等。
结束后
DMA 通常通过:
中断
告诉 CPU:
“这块传完了。”
所以:
四十一、DMA 控制器内部结构 ★★★★
资料列出的核心结构如下。
1. 主存地址计数器
回答:
下一次传主存哪个位置?
初值:
传一个字后:
不断自动变化。
2. 传送长度计数器
回答:
还剩多少数据?
假设原来:
传一个字:
直到:
表示完成。
3. 数据缓冲寄存器
作为数据暂存区域。
4. DMA 请求触发器
设备准备好以后:
置 DMA 请求。
5. 控制/状态逻辑
负责:
- 传送方向;
- 总线申请;
- 地址更新;
- 控制信号生成等。
6. 中断机构
一整块传输结束:
给 CPU 发中断。
注意:
不是每个字都发中断。
否则就失去 DMA 的意义了。
四十二、DMA 为什么必须能取得总线控制权?
CPU 平时访问主存:
CPU
↓ 地址/控制
主存DMA 现在也要直接访问主存:
DMA
↓ 地址/控制
主存因此 DMA 必须能:
- 给地址总线送地址;
- 发存储器读写信号;
- 使用数据总线。
所以它必须暂时成为:
总线主设备。
流程:
外设 → DMA请求
↓
DMA控制器 → CPU申请总线
↓
CPU让出总线
↓
DMA控制器取得总线
↓
DMA传输
↓
归还总线四十三、DMA 和 CPU 怎么抢主存? ★★★★★
资料介绍三种方式。
方式 1:停止 CPU 访存
最简单粗暴。
DMA 一来:
CPU:你用吧。
DMA:整块传完。
CPU:我再继续。优点:
控制简单。
缺点:
CPU 很可能大量空闲。
适合高速成组传输。
四十四、方式 2:周期挪用 ★★★★★
也常叫:
周期窃取、Cycle Stealing。
这是 DMA 高频考点,资料标出了 2012、2020、2022 等相关考查。
核心不是:
DMA 长时间霸占主存。
而是:
DMA 每传一个数据字,借走一个主存周期。
例如:
CPU访存
CPU运算
DMA偷一个周期
CPU访存
CPU运算
DMA再偷一个周期三种具体情况
CPU 当前没访存
DMA 直接用。
CPU 当前正在访存
一般先让 CPU 把当前存储周期完成。
然后 DMA 用。
CPU 与 DMA 同时请求
通常:
DMA 优先。
因为高速外设若不及时接收,数据可能丢失。
四十五、为什么叫“挪用”而不是“中断”?
因为 CPU 不一定真正执行了一次完整:
保存PC
进入ISR
恢复PC它只是:
暂时拿不到主存。
CPU 的内部运算阶段可能仍能继续。
所以:
两者完全不是一个概念。
四十六、周期挪用次数怎么计算?
如果:
- 一次 DMA 周期传输一个字;
- 共传 个字。
通常需要:
如果题目说一次总线事务可以传多个字,则根据题目重新计算。
所以关键是:
挪用次数看主存访问/总线传送次数,而不是 DMA 块数。
四十七、方式 3:DMA 与 CPU 交替访存
假设 CPU 工作周期:
而主存周期:
可以拆成:
一个周期:
┌──────┬──────┐
│ DMA │ CPU │
└──────┴──────┘即:
这样:
固定轮流使用主存。
就不需要每次申请总线。
优点:
- 速度快;
- 无总线申请/释放开销。
缺点:
- 硬件复杂。
资料给出了这种典型适用条件。
四十八、DMA 完整传送过程 ★★★★★
资料明确分为三个阶段,并标记 DMA 传送流程为重点考点。
阶段 1:预处理
CPU 完成。
CPU 给 DMA 控制器:
主存起始地址
设备地址
传送方向
传送数据个数然后:
启动设备。
CPU 自己继续运行其他程序。
阶段 2:数据传送
外设准备好:
外设
↓ DMA Request
DMA控制器
↓ Bus Request
CPU
↓ Bus Grant
DMA取得总线接着:
设备 ↔ 主存自动传输。
每完成一次:
地址计数器++
长度计数器--直到:
阶段 3:后处理
DMA 控制器发现整块结束:
DMA → CPU 中断请求CPU 执行中断服务程序:
- 检查传输结果;
- 检查错误;
- 做后续处理。
所以:
DMA 中也有中断。
但中断只是:
收尾通知。
不是负责整块数据的实际搬运。
四十九、中断与 DMA 的关系——最重要易错点之一
很多题会说:
“DMA 完全不使用中断。”
错误。
正确:
数据传送
DMA 自己完成。
整块完成
DMA 可中断 CPU。
因此:
而不是:
资料的模拟题也明确指出 DMA 接口中的中断机构主要负责传输结束及异常通知。
五十、DMA 性能计算 ★★★★
资料例 7.4:
- 设备:
- DMA 块:
所以每秒 DMA 次数:
一次 DMA 前后处理:
CPU 每秒花费:
CPU 每秒共有:
周期。
所以占比:
因此:
五十一、DMA CPU 开销的通用公式
如果:
- 设备速率 B/s;
- DMA 块大小 B;
- 每块 CPU 初始化+收尾开销 cycles;
- CPU 主频 。
每秒 DMA 块数:
CPU 周期占用:
所以:
若求百分比:
这个公式非常值得掌握。
五十二、为什么 DMA 一般按“大块”传更高效?
看上式:
当:
则:
原因很简单。
假设传 1 MB:
每 4B 中断/初始化一次
次数巨大。
每 1000B DMA 一次
次数大幅减少。
初始化和收尾开销被摊薄。
所以 DMA 特别适合:
高速、大块、连续数据。
五十三、三种 I/O 方式终极对比 ★★★★★
| 特点 | 程序查询 | 程序中断 | DMA |
|---|---|---|---|
| CPU 是否等待设备 | 是 | 否 | 否 |
| CPU 是否执行数据搬运 | 是 | 是 | 通常否 |
| 数据传送单位 | 字/字节 | 字/字节 | 数据块 |
| 是否忙等 | 是 | 否 | 否 |
| CPU负担 | 最大 | 中等 | 最小 |
| 硬件复杂度 | 最低 | 中等 | 最高 |
| CPU与外设并行 | 差 | 可以 | 可以 |
| 高速大块传输 | 不适合 | 较差 | 最适合 |
| 是否可能使用中断 | 否/不依赖 | 是 | 块结束时可以 |
记忆:
查询:CPU 等着搬。
中断:CPU 不等,但还得搬。
DMA:CPU 不等,也基本不用搬。
五十四、程序中断和 DMA 的深入区别
这一组很容易出多选判断。
中断
CPU:
- 启动设备;
- 去运行其他程序;
- 收到中断;
- 执行 ISR;
- CPU 自己完成相关数据传输。
DMA
CPU:
- 初始化 DMA;
- 去运行其他程序;
- DMA 自动成块传输;
- DMA 完成;
- 中断 CPU;
- CPU 收尾。
所以 DMA 的改进本质是:
五十五、中断请求与 DMA 请求又有什么区别?
中断请求
意思:
“CPU,请执行我的中断服务程序。”
CPU 响应之后:
指令流发生切换。
DMA 请求
意思:
“DMA,我现在有数据,请申请总线。”
最终主要目的是:
获取主存访问权。
CPU 未必需要马上执行 ISR。
因此:
五十六、本章非常容易错的 12 个判断
建议你复习时重点检查这些。
1.
“CPU 可以直接访问外设本体。”
通常错误。
CPU 通常通过:
访问设备。
2.
“I/O 接口和 I/O 端口是一个概念。”
错误。
3.
“一个 I/O 接口只能有一个 I/O 地址。”
错误。
一个接口可能有多个端口,所以:
可以有多个地址。
4.
“统一编址需要 IN/OUT。”
错误。
统一编址通常:
普通访存指令即可。
5.
“独立编址使用普通访存指令。”
错误。
通常:
6.
“中断发生后 CPU 可以在任意时刻打断当前 I/O 以外普通指令。”
错误。
普通 I/O 中断一般:
当前指令执行结束后响应。
7.
“中断隐指令由中断服务程序执行。”
错误。
8.
“保存所有通用寄存器都是中断隐指令完成。”
一般错误。
通常:
- 断点等 → 硬件;
- 通用寄存器现场 → 软件。
9.
“中断屏蔽字可以改变硬件响应优先级。”
严格来说不能这样表述。
它主要改变:
10.
“DMA 期间所有数据都经过 CPU。”
错误。
核心就是:
11.
“DMA 不需要中断。”
错误。
DMA 结束:
常通过中断通知 CPU。
12.
“周期挪用就是把 CPU 停到整块数据全部传完。”
错误。
这是:
停止 CPU 访存方式。
周期挪用通常只是:
每次挪用一个或少量主存周期。
五十七、408 做题时看到什么关键词想到什么
看到:
“CPU 不断检测设备状态”
立即:
“设备准备好后主动通知 CPU”
立即:
“主存和外设直接交换成批数据”
立即:
“每传一个字占用一个存储周期”
立即:
“共享主存地址空间”
立即:
“IN / OUT”
立即:
“保存断点、关中断、转 ISR”
立即:
“谁能打断谁”
立即想到:
“多个请求同时出现先响应谁”
立即想到:
五十八、本章最重要的几条公式
查询方式 CPU 占用率
中断一次耗时
设备产生一份数据的时间
能稳定处理中断通常至少要求:
中断最大理论数据率
DMA 每秒块数
DMA CPU 开销比例
五十九、最后建立一幅“整章动态图”
把整个第 7 章想成如下发展过程,就不容易混了。
第一阶段:程序查询
CPU ──问──► 外设
CPU ◄─没好──
CPU ──问──► 外设
CPU ◄─好了──
CPU ──搬数据──► 主存问题:
CPU 浪费时间等待。
第二阶段:程序中断
CPU启动设备
↓
CPU执行其他程序
外设工作……
↓
外设完成
↓
中断CPU
↓
CPU进入ISR
↓
CPU搬数据解决:
CPU 不用等待。
剩余问题:
CPU 仍要一字一字搬数据。
第三阶段:DMA
CPU初始化DMA
↓
CPU继续执行程序
DMA取得总线
外设 ═══════════════ 主存
大块传送
↓
完成
↓
中断CPU收尾进一步解决:
CPU 连数据搬运也基本不用参与。
所以整章真正的主线其实就是:
发展趋势是:
CPU 参与程度越来越低,而 I/O 硬件自主性越来越强。
六十、考前应达到的掌握程度
第 7 章如果要达到 408 稳定得分,建议至少做到下面这些题型可以直接秒出思路:
- 能画出并解释 CPU—I/O 接口—外设 的连接关系;
- 分清数据、状态、控制端口;
- 分清 I/O 接口与 I/O 端口;
- 熟练比较统一编址与独立编址;
- 看到程序查询效率题会算 CPU 占用率;
- 能完整说出CPU 响应中断的三个条件;
- 看到“中断隐指令”立即写出关中断、保存断点、引出 ISR;
- 分清断点由硬件保存、现场通常由软件保存;
- 分清中断类型号、中断向量、中断向量表;
- 熟练做响应优先级 / 处理优先级 / 屏蔽字 / 执行轨迹;
- 能判断一个高速设备是否适合采用中断 I/O;
- 能说出 DMA 控制器中的地址计数器、长度计数器、中断机构等作用;
- 分清停止 CPU 访存、周期挪用、交替访存;
- 熟练写出 DMA 的预处理 → 数据传送 → 后处理;
- 牢记 DMA 数据通路是设备接口与主存之间,CPU 不在数据传输通路中;
- 会做 DMA 块传输 CPU 开销计算。
其中最值得反复练习的是 第 6~15 项。资料本身的历年考点追踪也高度集中在中断条件与流程、多重中断屏蔽、周期挪用、DMA 传送过程及效率分析上。