第十二章 DMA方式
12.1 DMA概述
12.1.1 DMA的基本概念
定义: DMA(Direct Memory Access,直接存储器访问)是一种I/O控制方式,允许I/O设备在无需CPU干预的情况下,直接与主存进行高速数据传输。DMA方式下,数据传输在设备控制器和内存之间直接进行,仅在传输开始和结束时需要CPU参与。
产生背景:
程序查询方式的局限: - CPU效率低下,大量时间用于轮询设备状态 - 高速设备容易丢失数据
中断方式的局限: - 每次传输都需要中断CPU - 中断处理开销大(保存现场、恢复现场) - 不适合大批量数据传输
DMA的优势: - 批量数据传输无需CPU干预 - 传输速率高,仅受限于内存速度 - CPU可以并行执行其他任务
12.1.2 DMA的主要特点
直接性: 数据在I/O设备和内存之间直接传输,不经过CPU寄存器。
成批性: 一次DMA传输可以传送一个数据块(多个字节或字)。
并行性: DMA传输期间,CPU可以继续执行程序(不使用内存时)。
快速性: 响应速度快,不需要执行指令,只需硬件控制。
专用性: 需要专用硬件DMA控制器(DMAC)管理传输过程。
12.1.3 DMA的适用场合
适用设备类型: - 磁盘驱动器(硬盘、软盘) - 高速数据采集系统 - 图形显示适配器 - 网络接口卡 - 高速通信接口
适用数据传输场景: - 磁盘与内存之间的整块数据交换 - 高速外设的数据采集 - 内存到内存的数据移动 - 显示刷新数据传送
12.2 DMA控制器的结构
12.2.1 DMA控制器的基本组成
内存地址寄存器(AR/MAR): 存放要访问的内存单元地址。在传输过程中自动递增或递减,指向下一个内存单元。
字计数器(WC): 存放要传输的数据字数。每传输一个数据自动减1,当计数器为零时表示传输完成。
数据缓冲寄存器(DBR): 暂存从设备到内存或从内存到设备的数据,解决速度匹配问题。
控制/状态寄存器(CSR): 存放控制命令和设备状态信息,如传输方向、传输模式、中断使能等。
DMA请求触发器: 接收设备的DMA请求信号,向CPU申请总线控制权。
控制逻辑电路: 产生DMA操作所需的各种控制信号,管理DMA传输过程。
地址译码电路: 识别CPU发来的命令,选择DMA控制器内部寄存器。
12.2.2 DMA控制器的连接方式
单总线分离型: ``` CPU ───┬─── 主存
│
系统总线
│
DMA控制器 ─── I/O设备
```
特点:DMA控制器与CPU共享系统总线,需要仲裁总线使用权。
单总线集成型: DMA控制器集成在I/O接口中。 ``` CPU ─── 主存
↑
系统总线
↑
I/O接口(含DMA控制器)── I/O设备
```
选择型DMA控制器: 物理上可以连接多个设备,但逻辑上只允许一个设备使用,即一次只能服务一个设备。
多路型DMA控制器: 可以同时管理多个设备进行DMA传输,各设备以字节或字为单位交叉传输。
12.2.3 典型DMA控制器芯片
Intel 8237A: 经典的DMA控制器芯片,主要特性: - 4个独立的DMA通道 - 每个通道有64KB寻址能力和64K字计数 - 支持内存到内存传输 - 支持块传送、请求传送、单字节传送三种模式 - 支持优先级仲裁(固定/循环)
内部结构: ``` ┌─────────────────────────────────┐ │ 定时和控制逻辑 │ 命令控制单元 │ ├─────────────────────────────────┤ │ 通道0 │ 通道1 │ 通道2 │ 通道3 │ │ AR/WC │ AR/WC │ AR/WC │ AR/WC │ ├─────────────────────────────────┤ │ 优先级编码器 │ 数据和地址缓冲 │ └─────────────────────────────────┘ ```
寄存器组: - 基地址寄存器和当前地址寄存器 - 基字计数器和当前字计数器 - 命令寄存器、模式寄存器、屏蔽寄存器、状态寄存器
12.3 DMA工作流程
12.3.1 DMA传输的三个阶段
阶段一:预处理(初始化)
CPU执行初始化程序,向DMA控制器写入控制信息: 1. 设置内存起始地址 → 地址寄存器 2. 设置传输数据个数 → 字计数器 3. 设置传输方向(读/写) 4. 设置控制命令(传送模式、中断使能等) 5. 启动I/O设备
阶段二:数据传送
DMA控制器接管总线,控制数据传送: 1. 设备就绪,发出DMA请求(DREQ) 2. DMA控制器向CPU发出总线请求(HRQ/HOLD) 3. CPU响应,释放总线控制(HLDA) 4. DMA控制器接管总线 5. 执行数据传送(内存↔设备) 6. 地址寄存器增量,字计数器减量 7. 重复5-6直到字计数器为0
阶段三:后处理
DMA传输完成后: 1. DMA控制器释放总线 2. 向CPU发出中断请求 3. CPU响应中断,执行中断服务程序 4. 校验数据正确性 5. 决定是否继续传输 6. 恢复现场,返回主程序
12.3.2 DMA传送时序
DMA读时序(设备→内存): ``` 时钟 ─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐
└─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └
HRQ ───────────┐ ┌────── (请求) └─────────────────────┘ HLDA ──────────────┐ ┌──────── (响应) └───────────────┘ 地址 ────┤ 有效地址 ├────────────────────────
无效 有效
IOR# ───────────────┐ ┌──────────── (读) └─────────┘ MEMW# ──────────────────┐ ┌─────────────── (写) └───┘ 数据 ──────────────────┤数据├─── ```
时序说明: 1. T1周期:DMA控制器发送地址到地址总线 2. T2周期:发送IOR#信号,设备将数据放到数据总线 3. T3周期:发送MEMW#信号,数据写入内存 4. T4周期:结束当前传送周期
12.3.3 DMA传送模式
单字节传送模式(Cycle Stealing):
特点: - 每次DMA请求只传送一个字节 - 传送完后释放总线 - 效率较低但CPU响应及时
时序: ``` CPU执行 ─┬─────┬─────┬─────┬─────┬─────┬───
│ DMA │CPU │ DMA │CPU │ DMA │
└──┬──┘ └──┬──┘ └──┬──┘
设备请求 ↑ ↑ ↑ ```
块传送模式(Burst Mode):
特点: - 一次DMA请求连续传送整个数据块 - 传送期间CPU放弃总线控制权 - 效率高但CPU等待时间长
请求传送模式(Demand Mode):
特点: - 只要DMA请求有效就持续传送 - 请求无效时暂停,恢复后继续 - 适合不规则数据传输
级联模式(Cascade Mode):
特点: - 多个DMA控制器级联,扩展通道数 - 主控制器将从控制器作为设备对待 - 可以管理更多I/O设备
12.4 DMA与系统总线
12.4.1 总线控制权转移
DMA请求与响应:
DMA请求(DREQ): I/O设备向DMA控制器发出请求,表示需要数据传输。
总线请求(HRQ/HOLD): DMA控制器向CPU发出请求,申请总线控制权。
总线响应(HLDA): CPU响应DMA请求,释放总线控制权,通知DMA控制器。
控制权转移过程: ``` I/O设备 ──DREQ──→ DMA控制器 ──HRQ──→ CPU
↓
I/O设备 ←─DACK─── DMA控制器 ←─HLDA─── CPU释放总线 ```
DMA应答(DACK): DMA控制器通知I/O设备可以进行数据传输。
12.4.2 总线占用方式
CPU停止法(成组传送):
原理: DMA控制器获得总线控制权后,连续占用总线直到整个数据块传输完成,期间CPU完全停止访问内存。
适用场景: - 高速设备的大批量数据传输 - 传输时间较短(微秒级)
优缺点: - 优点:控制简单,传输速率高 - 缺点:CPU长时间等待,影响效率
周期挪用(周期窃取):
原理: DMA控制器在CPU不使用总线的周期(如CPU内部操作、缓存命中时)“窃取”总线周期进行数据传输。
实现方式: 1. 检测CPU是否使用总线 2. CPU不用时,DMA占用总线 3. CPU需要时,DMA让出总线
适用场景: - 中速设备 - 需要平衡CPU和I/O性能
交替分时访问:
原理: 将总线周期分为两部分,C1周期给CPU访问内存,C2周期给DMA访问内存。
特点: - 不需要总线仲裁 - CPU和DMA轮流访问 - 需要硬件支持
12.4.3 DMA与Cache的一致性问题
问题描述: 当Cache启用时,DMA直接访问内存可能导致Cache与内存数据不一致。
场景一:DMA写入内存: ``` CPU写入 → Cache命中 → 只更新Cache,不更新内存 DMA写入 → 直接写内存 结果:Cache中的数据是旧的 ```
场景二:DMA读取内存: ``` CPU写入 → Cache命中 → 只更新Cache DMA读取 → 从内存读数据 结果:DMA读到的数据是旧的 ```
解决方法:
1. 禁止Cache(Uncacheable): 将DMA使用的内存区域标记为不可缓存。
2. 写直达(Write-through): CPU写操作同时更新Cache和内存,保持内存数据最新。
3. 缓存刷新(Flush): DMA传输前刷新Cache,将脏数据写回内存。
4. 缓存失效(Invalidate): DMA传输后使对应Cache行失效,强制从内存重新读取。
5. 监听(Snooping): DMA控制器访问内存时,通知Cache控制器检查一致性。
12.5 DMA的应用实例
12.5.1 磁盘I/O中的DMA
硬盘读取过程: ``` 1. CPU设置DMA参数(内存地址、扇区数) 2. CPU向磁盘控制器发送读命令(柱面、磁头、扇区) 3. 磁盘控制器寻道并读取数据到内部缓冲区 4. 数据就绪,磁盘控制器发起DMA请求 5. DMA控制器传输数据从磁盘缓冲区到内存 6. 传输完成,DMA中断CPU 7. CPU进行后续处理 ```
硬盘写入过程: ``` 1. CPU设置DMA参数 2. CPU向磁盘控制器发送写命令 3. DMA控制器传输数据从内存到磁盘缓冲区 4. 磁盘控制器将数据写入磁盘 5. 写入完成,磁盘控制器中断CPU ```
12.5.2 网络通信中的DMA
网卡接收数据: ``` 1. 网络数据包到达网卡 2. 网卡通过DMA将数据包写入内存中的接收缓冲区 3. 传输完成,网卡中断CPU 4. CPU处理接收到的数据包 ```
网卡发送数据: ``` 1. CPU准备发送数据到发送缓冲区 2. CPU通知网卡发送数据 3. 网卡通过DMA从内存读取数据 4. 数据发送到网络 5. 发送完成,网卡中断CPU ```
12.5.3 图形显示中的DMA
显示刷新: ``` 1. 显示控制器通过DMA从显存读取像素数据 2. 数据转换为模拟信号(RAMDAC) 3. 信号发送到显示器 4. 重复过程维持屏幕刷新(通常60Hz以上) ```
纹理加载: ``` 1. CPU或GPU发起DMA传输 2. 将纹理数据从系统内存传输到显存 3. 传输完成后用于图形渲染 ```
12.6 DMA性能分析
12.6.1 DMA性能指标
数据传输率: 单位时间内传输的数据量,通常用MB/s或GB/s表示。
影响因素: - 总线宽度 - 总线频率 - 内存访问速度 - 设备速度
响应时间: 从DMA请求到开始传输的时间。
CPU开销: DMA传输中CPU参与的时间比例,理想情况下接近0%。
12.6.2 DMA效率分析
理论带宽计算: ``` DMA带宽 = 总线宽度 × 总线频率 × 传输效率
例如:32位总线,100MHz频率 带宽 = 4字节 × 100MHz = 400MB/s ```
实际带宽: 受以下因素影响: - 内存刷新周期 - 总线仲裁延迟 - 设备准备时间 - Cache一致性处理
例题: 某系统总线宽度为64位,总线频率为133MHz,使用突发传输模式。计算: (1) 理论DMA带宽 (2) 如果每次突发传输4个字,求每次传输时间
解答: (1) 理论带宽 = 8字节 × 133MHz = 1064 MB/s ≈ 1GB/s (2) 每次传输4×8=32字节,需要时间 = 32 / 1064MB/s ≈ 30ns
12.6.3 DMA优化技术
双缓冲技术: 使用两个缓冲区交替工作,DMA向一个缓冲区传输时,CPU处理另一个缓冲区的数据,实现并行。
环形缓冲区: 多个缓冲区组成环形队列,DMA连续写入,CPU顺序读取,提高吞吐量。
分散/聚集(Scatter/Gather): DMA控制器支持非连续内存传输,将分散的内存区域收集传输,或将数据分散到不同区域。
链式DMA: 通过链表描述多个DMA传输任务,自动连续执行,减少CPU干预。
12.7 DMA与其他方式的比较
12.7.1 四种I/O方式对比
| 特性 | 程序查询 | 程序中断 | DMA | 通道 |
| —– | ——— | ——— | —– | —— |
| 数据传输单位 | 字节/字 | 字节/字 | 数据块 | 数据块组 |
| CPU干预频率 | 持续干预 | 每次传输 | 开始/结束 | 开始/结束 |
| 数据通路 | 设备→CPU→内存 | 设备→CPU→内存 | 设备↔内存 | 设备↔内存 |
| 并行性 | 无 | 部分 | CPU与DMA并行 | CPU与通道并行 |
| 实现复杂度 | 简单 | 中等 | 较复杂 | 复杂 |
| 适用设备 | 简单低速 | 中低速 | 高速块设备 | 高速多设备 |
| 优先级处理 | 软件控制 | 中断优先级 | 总线仲裁 | 通道管理 |
12.7.2 DMA与中断的协同
协同工作模式: ``` 开始:CPU初始化DMA(中断方式)
↓
DMA传输数据(DMA方式)
↓
结束:DMA中断CPU(中断方式)
↓
CPU处理后处理
```
分工合作: - DMA负责高速数据传输 - 中断负责事件通知和异常处理 - CPU负责高层控制和数据处理
12.8 例题精讲
例题1: 某DMA控制器采用周期窃取方式,把一个字节从I/O设备送到内存。设: - 处理器时钟周期:100ns - 一个总线周期:100ns - 窃取一个周期可以传送一个字节
计算: (1) 处理器最大带宽 (2) DMA传输的最大带宽 (3) 如果处理器占用总线70%时间,DMA传输的实际带宽
解答: (1) 处理器最大带宽 = 1 / 100ns = 10MB/s(假设每次访存1字节) (2) DMA最大带宽 = 1 / 100ns = 10MB/s (3) DMA可用时间 = 30%,实际带宽 = 10MB/s × 30% = 3MB/s
例题2: 一个DMA接口采用周期窃取方式把字符传送到内存,支持的最大批量为400字节。若存取周期为100ns,每处理一次中断需5μs。现有字符设备的传输率为9600bps(1bps=1位/秒),假设字符之间的传输是无间隙的,若忽略预处理所需时间,问:
(1) 采用DMA方式,每秒内因数据传输需占用处理器多少时间? (2) 改用中断方式,每秒内因数据传输需占用处理器多少时间?
解答: (1) DMA方式: - 字符传输率 = 9600bps / 8 = 1200字符/秒 - 每字符占用时间 = 100ns - 每秒DMA占用时间 = 1200 × 100ns = 120μs - 每秒中断次数 = 1200 / 400 = 3次 - 中断处理时间 = 3 × 5μs = 15μs - 总时间 = 120μs + 15μs = 135μs
(2) 中断方式: - 每字符中断一次 - 每秒中断时间 = 1200 × 5μs = 6000μs = 6ms
例题3: 分析DMA传输时Cache一致性问题的两种解决方案,并比较其优缺点。
解答:
方案一:禁止DMA区域的Cache - 实现:将DMA使用的内存页标记为不可缓存 - 优点:简单可靠,无一致性问题 - 缺点:CPU访问该区域性能下降
方案二:Cache刷新/失效 - 实现:DMA前刷新脏数据,DMA后使Cache失效 - 优点:大部分时间可正常使用Cache - 缺点:刷新操作有开销,实现复杂
12.9 本章小结
重点内容:
1. DMA基本概念:
- 直接存储器访问,设备与内存直接传输数据
- 适合高速大批量数据传输
- 传输期间CPU可并行工作
2. DMA控制器结构:
- 地址寄存器:存放内存地址
- 字计数器:记录传输数据量
- 数据缓冲器:暂存传输数据
- 控制逻辑:管理传输过程
3. DMA工作流程:
- 预处理:CPU初始化参数
- 数据传送:DMA控制传输
- 后处理:中断CPU进行后续处理
4. 总线占用方式:
- CPU停止法:连续传输,CPU等待
- 周期窃取:利用CPU空闲周期
- 交替访问:CPU和DMA分时使用
5. Cache一致性:
- DMA直接访问内存可能破坏Cache一致性
- 解决方法:禁止Cache、刷新Cache、Cache监听
6. DMA传送模式:
- 单字节传送:每次一个字节
- 块传送:连续传输整块数据
- 请求传送:按需传输
- 级联:扩展通道数
常见考点: - DMA工作流程和时序 - 与中断、查询方式的比较 - 总线占用方式的优缺点 - Cache一致性问题 - DMA性能计算