第十二章 DMA方式

定义: DMA(Direct Memory Access,直接存储器访问)是一种I/O控制方式,允许I/O设备在无需CPU干预的情况下,直接与主存进行高速数据传输。DMA方式下,数据传输在设备控制器和内存之间直接进行,仅在传输开始和结束时需要CPU参与。

产生背景

程序查询方式的局限: - CPU效率低下,大量时间用于轮询设备状态 - 高速设备容易丢失数据

中断方式的局限: - 每次传输都需要中断CPU - 中断处理开销大(保存现场、恢复现场) - 不适合大批量数据传输

DMA的优势: - 批量数据传输无需CPU干预 - 传输速率高,仅受限于内存速度 - CPU可以并行执行其他任务

直接性: 数据在I/O设备和内存之间直接传输,不经过CPU寄存器。

成批性: 一次DMA传输可以传送一个数据块(多个字节或字)。

并行性: DMA传输期间,CPU可以继续执行程序(不使用内存时)。

快速性: 响应速度快,不需要执行指令,只需硬件控制。

专用性: 需要专用硬件DMA控制器(DMAC)管理传输过程。

图12-1:DMA数据传输方式示意图 DMA数据传输|500

适用设备类型: - 磁盘驱动器(硬盘、软盘) - 高速数据采集系统 - 图形显示适配器 - 网络接口卡 - 高速通信接口

适用数据传输场景: - 磁盘与内存之间的整块数据交换 - 高速外设的数据采集 - 内存到内存的数据移动 - 显示刷新数据传送

内存地址寄存器(AR/MAR): 存放要访问的内存单元地址。在传输过程中自动递增或递减,指向下一个内存单元。

字计数器(WC): 存放要传输的数据字数。每传输一个数据自动减1,当计数器为零时表示传输完成。

数据缓冲寄存器(DBR): 暂存从设备到内存或从内存到设备的数据,解决速度匹配问题。

控制/状态寄存器(CSR): 存放控制命令和设备状态信息,如传输方向、传输模式、中断使能等。

DMA请求触发器: 接收设备的DMA请求信号,向CPU申请总线控制权。

控制逻辑电路: 产生DMA操作所需的各种控制信号,管理DMA传输过程。

地址译码电路: 识别CPU发来的命令,选择DMA控制器内部寄存器。

单总线分离型: ``` CPU ───┬─── 主存

     │
  系统总线
     │
  DMA控制器 ─── I/O设备

```

特点:DMA控制器与CPU共享系统总线,需要仲裁总线使用权。

单总线集成型: DMA控制器集成在I/O接口中。 ``` CPU ─── 主存

       ↑
    系统总线
       ↑
  I/O接口(含DMA控制器)── I/O设备

```

选择型DMA控制器: 物理上可以连接多个设备,但逻辑上只允许一个设备使用,即一次只能服务一个设备。

多路型DMA控制器: 可以同时管理多个设备进行DMA传输,各设备以字节或字为单位交叉传输。

Intel 8237A: 经典的DMA控制器芯片,主要特性: - 4个独立的DMA通道 - 每个通道有64KB寻址能力和64K字计数 - 支持内存到内存传输 - 支持块传送、请求传送、单字节传送三种模式 - 支持优先级仲裁(固定/循环)

内部结构: ``` ┌─────────────────────────────────┐ │ 定时和控制逻辑 │ 命令控制单元 │ ├─────────────────────────────────┤ │ 通道0 │ 通道1 │ 通道2 │ 通道3 │ │ AR/WC │ AR/WC │ AR/WC │ AR/WC │ ├─────────────────────────────────┤ │ 优先级编码器 │ 数据和地址缓冲 │ └─────────────────────────────────┘ ```

寄存器组: - 基地址寄存器和当前地址寄存器 - 基字计数器和当前字计数器 - 命令寄存器、模式寄存器、屏蔽寄存器、状态寄存器

阶段一:预处理(初始化)

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. 恢复现场,返回主程序

DMA读时序(设备→内存): ``` 时钟 ─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐

      └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └

HRQ ───────────┐ ┌────── (请求) └─────────────────────┘ HLDA ──────────────┐ ┌──────── (响应) └───────────────┘ 地址 ────┤ 有效地址 ├────────────────────────

      无效      有效

IOR# ───────────────┐ ┌──────────── (读) └─────────┘ MEMW# ──────────────────┐ ┌─────────────── (写) └───┘ 数据 ──────────────────┤数据├─── ```

时序说明: 1. T1周期:DMA控制器发送地址到地址总线 2. T2周期:发送IOR#信号,设备将数据放到数据总线 3. T3周期:发送MEMW#信号,数据写入内存 4. T4周期:结束当前传送周期

单字节传送模式(Cycle Stealing)

特点: - 每次DMA请求只传送一个字节 - 传送完后释放总线 - 效率较低但CPU响应及时

时序: ``` CPU执行 ─┬─────┬─────┬─────┬─────┬─────┬───

       │ DMA │CPU  │ DMA │CPU  │ DMA │
       └──┬──┘     └──┬──┘     └──┬──┘

设备请求 ↑ ↑ ↑ ```

块传送模式(Burst Mode)

特点: - 一次DMA请求连续传送整个数据块 - 传送期间CPU放弃总线控制权 - 效率高但CPU等待时间长

请求传送模式(Demand Mode)

特点: - 只要DMA请求有效就持续传送 - 请求无效时暂停,恢复后继续 - 适合不规则数据传输

级联模式(Cascade Mode)

特点: - 多个DMA控制器级联,扩展通道数 - 主控制器将从控制器作为设备对待 - 可以管理更多I/O设备

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设备可以进行数据传输。

CPU停止法(成组传送)

原理: DMA控制器获得总线控制权后,连续占用总线直到整个数据块传输完成,期间CPU完全停止访问内存。

适用场景: - 高速设备的大批量数据传输 - 传输时间较短(微秒级)

优缺点: - 优点:控制简单,传输速率高 - 缺点:CPU长时间等待,影响效率

周期挪用(周期窃取)

原理: DMA控制器在CPU不使用总线的周期(如CPU内部操作、缓存命中时)“窃取”总线周期进行数据传输。

实现方式: 1. 检测CPU是否使用总线 2. CPU不用时,DMA占用总线 3. CPU需要时,DMA让出总线

适用场景: - 中速设备 - 需要平衡CPU和I/O性能

交替分时访问

原理: 将总线周期分为两部分,C1周期给CPU访问内存,C2周期给DMA访问内存。

特点: - 不需要总线仲裁 - CPU和DMA轮流访问 - 需要硬件支持

问题描述: 当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控制器检查一致性。

硬盘读取过程: ``` 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 ```

网卡接收数据: ``` 1. 网络数据包到达网卡 2. 网卡通过DMA将数据包写入内存中的接收缓冲区 3. 传输完成,网卡中断CPU 4. CPU处理接收到的数据包 ```

网卡发送数据: ``` 1. CPU准备发送数据到发送缓冲区 2. CPU通知网卡发送数据 3. 网卡通过DMA从内存读取数据 4. 数据发送到网络 5. 发送完成,网卡中断CPU ```

显示刷新: ``` 1. 显示控制器通过DMA从显存读取像素数据 2. 数据转换为模拟信号(RAMDAC) 3. 信号发送到显示器 4. 重复过程维持屏幕刷新(通常60Hz以上) ```

纹理加载: ``` 1. CPU或GPU发起DMA传输 2. 将纹理数据从系统内存传输到显存 3. 传输完成后用于图形渲染 ```

数据传输率: 单位时间内传输的数据量,通常用MB/s或GB/s表示。

影响因素: - 总线宽度 - 总线频率 - 内存访问速度 - 设备速度

响应时间: 从DMA请求到开始传输的时间。

CPU开销: DMA传输中CPU参与的时间比例,理想情况下接近0%。

理论带宽计算: ``` 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

双缓冲技术: 使用两个缓冲区交替工作,DMA向一个缓冲区传输时,CPU处理另一个缓冲区的数据,实现并行。

环形缓冲区: 多个缓冲区组成环形队列,DMA连续写入,CPU顺序读取,提高吞吐量。

分散/聚集(Scatter/Gather): DMA控制器支持非连续内存传输,将分散的内存区域收集传输,或将数据分散到不同区域。

链式DMA: 通过链表描述多个DMA传输任务,自动连续执行,减少CPU干预。

特性 程序查询 程序中断 DMA 通道
—–———————–——
数据传输单位 字节/字 字节/字 数据块 数据块组
CPU干预频率 持续干预 每次传输 开始/结束 开始/结束
数据通路 设备→CPU→内存 设备→CPU→内存 设备↔内存 设备↔内存
并行性 部分 CPU与DMA并行 CPU与通道并行
实现复杂度 简单 中等 较复杂 复杂
适用设备 简单低速 中低速 高速块设备 高速多设备
优先级处理 软件控制 中断优先级 总线仲裁 通道管理

协同工作模式: ``` 开始:CPU初始化DMA(中断方式)

         ↓
    DMA传输数据(DMA方式)
         ↓

结束:DMA中断CPU(中断方式)

         ↓
    CPU处理后处理

```

分工合作: - DMA负责高速数据传输 - 中断负责事件通知和异常处理 - CPU负责高层控制和数据处理

例题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 - 缺点:刷新操作有开销,实现复杂

重点内容

1. DMA基本概念

  1. 直接存储器访问,设备与内存直接传输数据
  2. 适合高速大批量数据传输
  3. 传输期间CPU可并行工作

2. DMA控制器结构

  1. 地址寄存器:存放内存地址
  2. 字计数器:记录传输数据量
  3. 数据缓冲器:暂存传输数据
  4. 控制逻辑:管理传输过程

3. DMA工作流程

  1. 预处理:CPU初始化参数
  2. 数据传送:DMA控制传输
  3. 后处理:中断CPU进行后续处理

4. 总线占用方式

  1. CPU停止法:连续传输,CPU等待
  2. 周期窃取:利用CPU空闲周期
  3. 交替访问:CPU和DMA分时使用

5. Cache一致性

  1. DMA直接访问内存可能破坏Cache一致性
  2. 解决方法:禁止Cache、刷新Cache、Cache监听

6. DMA传送模式

  1. 单字节传送:每次一个字节
  2. 块传送:连续传输整块数据
  3. 请求传送:按需传输
  4. 级联:扩展通道数

常见考点: - DMA工作流程和时序 - 与中断、查询方式的比较 - 总线占用方式的优缺点 - Cache一致性问题 - DMA性能计算

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • 计算机组成与体系结构/dma方式.txt
  • 最后更改: 2026/03/01 16:25
  • 张叶安