====== 第十二章 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:DMA数据传输方式示意图** {{https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/DMA_transfer.svg/800px-DMA_transfer.svg.png?direct|DMA数据传输|500}} ==== 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性能计算