考研学习
知识点讲义计算机组成原理

第 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 指令。

优点

  1. 指令统一;
  2. 可以使用丰富的访存寻址方式;
  3. 编程方便;
  4. 可以利用存储保护机制保护 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 1

D

只有 A 比 D 高:

A B C D
0 1 1 1

C

A、D 比 C 高:

A B C D
0 1 1 0

B

A、D、C 都比 B 高:

A B C D
0 1 0 0

因此:

ISRABCD
A1111
B0100
C0110
D0111

这正是资料例 7.3 的典型屏蔽字设计。

三十三、屏蔽字题的通用算法

不要死背表。

假设处理优先级:

那么对 ISR :

比 高的置 0。

自己以及比它低的全部置 1。

所以:

高优先级 → 允许 → 0
自身及低优先级 → 屏蔽 → 1

就这么简单。

三十四、例 7.3 的执行轨迹怎么做?

硬件响应优先级:

处理优先级:

初始:

A、C、D 同时请求。

因为主程序阶段先按照响应优先级判断:

所以先:

主程序 → A

A 屏蔽全部:

1111

所以必须把 A 做完。

此时 C、D 仍在等待。

回主程序后,同时存在 C、D:

硬件响应优先级:

于是:

主程序 → C

进入 C 后屏蔽字:

0110

也就是:

  • A 可以打断;
  • D 可以打断;
  • B、C 不行。

D 此时仍有未处理请求,因此:

C → D

D 完成以后:

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:

  1. 启动设备;
  2. 去运行其他程序;
  3. 收到中断;
  4. 执行 ISR;
  5. CPU 自己完成相关数据传输。

DMA

CPU:

  1. 初始化 DMA;
  2. 去运行其他程序;
  3. DMA 自动成块传输;
  4. DMA 完成;
  5. 中断 CPU;
  6. 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 稳定得分,建议至少做到下面这些题型可以直接秒出思路:

  1. 能画出并解释 CPU—I/O 接口—外设 的连接关系;
  2. 分清数据、状态、控制端口;
  3. 分清 I/O 接口与 I/O 端口;
  4. 熟练比较统一编址与独立编址;
  5. 看到程序查询效率题会算 CPU 占用率;
  6. 能完整说出CPU 响应中断的三个条件;
  7. 看到“中断隐指令”立即写出关中断、保存断点、引出 ISR;
  8. 分清断点由硬件保存、现场通常由软件保存;
  9. 分清中断类型号、中断向量、中断向量表;
  10. 熟练做响应优先级 / 处理优先级 / 屏蔽字 / 执行轨迹;
  11. 能判断一个高速设备是否适合采用中断 I/O;
  12. 能说出 DMA 控制器中的地址计数器、长度计数器、中断机构等作用;
  13. 分清停止 CPU 访存、周期挪用、交替访存;
  14. 熟练写出 DMA 的预处理 → 数据传送 → 后处理;
  15. 牢记 DMA 数据通路是设备接口与主存之间,CPU 不在数据传输通路中;
  16. 会做 DMA 块传输 CPU 开销计算。

其中最值得反复练习的是 第 6~15 项。资料本身的历年考点追踪也高度集中在中断条件与流程、多重中断屏蔽、周期挪用、DMA 传送过程及效率分析上。

On this page

一、第 7 章到底在研究什么?二、7.1 I/O 系统基本概念1. 什么叫输入和输出?三、为什么需要 I/O 接口?四、7.2 I/O 接口1. I/O 接口的核心功能(1)设备选择(2)数据缓冲(3)数据格式转换(4)传送控制命令(5)报告设备状态五、I/O 接口内部最重要的三个寄存器一个非常容易考的细节六、I/O 接口中三类总线分别传什么?数据线地址线控制线七、I/O 接口和 I/O 端口不是一个东西I/O 接口I/O 端口八、I/O 端口的两种编址方式 ★★★★1. 统一编址指令优点缺点一个经典陷阱九、独立编址必须有专门 I/O 指令两者对比十、7.3 三种 I/O 方式——整章核心十一、程序查询方式工作过程十二、为什么程序查询效率低?十三、程序查询方式的计算题十四、程序中断方式 ★★★★★十五、中断的直观过程十六、中断方式是不是 CPU 完全不负责数据传输?十七、中断请求十八、可屏蔽中断和不可屏蔽中断可屏蔽中断不可屏蔽中断十九、中断响应优先级 ★★★★二十、CPU 响应 I/O 中断必须满足什么条件? ★★★★★条件 1:存在有效中断请求条件 2:CPU 处于开中断状态条件 3:当前指令已经执行结束二十一、中断与异常的检测时机中断异常二十二、中断响应到底由谁完成?二十三、中断隐指令 ★★★★★1 关中断2 保存断点3 引出中断服务程序二十四、“断点”和“现场”不是同一个东西断点现场二十五、中断类型号、中断向量、中断向量表 ★★★★★二十六、中断请求信号和中断类型号走的线不一样中断请求中断类型号二十七、完整中断处理流程 ★★★★★二十八、为什么 ISR 中间还要重新开中断?二十九、单重中断 vs 多重中断单重中断多重中断三十、最容易混的两个优先级 ★★★★★1. 响应优先级2. 处理优先级三十一、中断屏蔽字 ★★★★★三十二、屏蔽字到底怎么构造?ADCB三十三、屏蔽字题的通用算法三十四、例 7.3 的执行轨迹怎么做?三十五、中断 I/O 的性能计算 ★★★★CPU 处理中断一次需要多久?设备多久产生一份 32 位数据?三十六、中断方式可承受最大数据率的通式三十七、为什么还需要 DMA?三十八、DMA 是什么? ★★★★★三十九、DMA 的真正数据通路四十、DMA 是不是完全不需要 CPU?开始前结束后四十一、DMA 控制器内部结构 ★★★★1. 主存地址计数器2. 传送长度计数器3. 数据缓冲寄存器4. DMA 请求触发器5. 控制/状态逻辑6. 中断机构四十二、DMA 为什么必须能取得总线控制权?四十三、DMA 和 CPU 怎么抢主存? ★★★★★方式 1:停止 CPU 访存四十四、方式 2:周期挪用 ★★★★★三种具体情况CPU 当前没访存CPU 当前正在访存CPU 与 DMA 同时请求四十五、为什么叫“挪用”而不是“中断”?四十六、周期挪用次数怎么计算?四十七、方式 3:DMA 与 CPU 交替访存四十八、DMA 完整传送过程 ★★★★★阶段 1:预处理阶段 2:数据传送阶段 3:后处理四十九、中断与 DMA 的关系——最重要易错点之一数据传送整块完成五十、DMA 性能计算 ★★★★五十一、DMA CPU 开销的通用公式五十二、为什么 DMA 一般按“大块”传更高效?每 4B 中断/初始化一次每 1000B DMA 一次五十三、三种 I/O 方式终极对比 ★★★★★五十四、程序中断和 DMA 的深入区别中断DMA五十五、中断请求与 DMA 请求又有什么区别?中断请求DMA 请求五十六、本章非常容易错的 12 个判断1.2.3.4.5.6.7.8.9.10.11.12.五十七、408 做题时看到什么关键词想到什么“CPU 不断检测设备状态”“设备准备好后主动通知 CPU”“主存和外设直接交换成批数据”“每传一个字占用一个存储周期”“共享主存地址空间”“IN / OUT”“保存断点、关中断、转 ISR”“谁能打断谁”“多个请求同时出现先响应谁”五十八、本章最重要的几条公式查询方式 CPU 占用率中断一次耗时设备产生一份数据的时间中断最大理论数据率DMA 每秒块数DMA CPU 开销比例五十九、最后建立一幅“整章动态图”第一阶段:程序查询第二阶段:程序中断第三阶段:DMA六十、考前应达到的掌握程度