人生最暗的夜,恰是抬头可见星辰的时刻。那些让你喘不过气的压力,是蜕变的茧房;那些被汗水浸透的清晨,终将化作破晓的光。不必羡慕他人的花开,你的根系正穿透岩层汲取力量,正如深海中的微光总在无人处酝酿璀璨。奔跑时不必害怕摔倒,因为真正定义你的,从来不是脚下踉跄的沙砾,而是眼中始终燃烧的远方。记住:没有一座高山拒绝攀登者的脚步,正如黎明永远不会辜负彻夜执灯的人——你的故事,正在翻越山脊的途中写成史诗。
计算机组成原理资源网
https://www.wenjingketang.com/这里面有ppt课后习题及答案,需要的可以自行下载
目录
9.4 DMA方式
9.4.1 DMA基本概念
定义与特点
与传统传输对比
9.4.2 DMA传送方式
1. 单字节传输模式
2. 块传输模式
3. 请求传输模式
9.4.3 基本DMA控制器
核心组件
工作流程(时序图描述)
9.4.4 DMA控制器类型
1. 独立DMA控制器(如8237A)
2. 集成DMA控制器
3. 多通道DMA
9.5 通道方式和I/O处理机方式
9.5.1 通道方式
通道结构体系
通道程序示例
执行过程
9.5.2 I/O处理机方式
架构演进
Intel I/O处理器示例
典型应用场景
关键技术对比表
代码案例详解
DMA内存到外设传输(Linux驱动示例)
总结与展望
9.4 DMA方式
9.4.1 DMA基本概念
定义与特点
DMA(Direct Memory Access)是一种无需CPU参与的数据传输技术,特点:
- 传输速率高:可达数GB/s
- 节省CPU资源:CPU仅需初始化传输,无需处理每个字节
- 适用场景:高速设备(磁盘、网卡、显卡)的批量数据传输
与传统传输对比
传输方式 | CPU参与度 | 适用场景 | 典型速率 |
---|---|---|---|
程序控制 | 100% | 低速设备 | <1MB/s |
中断驱动 | 50-80% | 中速设备 | 1-10MB/s |
DMA | <5% | 高速设备 | 100MB/s - 10GB/s |
9.4.2 DMA传送方式
1. 单字节传输模式
C
// 伪代码示例 void dma_transfer_single(void* src, void* dest, int size) { dma_init(src, dest, size); while(!dma_check_complete()) { // 等待每次传输完成中断 // CPU可执行其他任务 } }
特点:
- 每次传输1字节后释放总线
- 总线占用率高但延迟低
2. 块传输模式
ASSEMBLY
; 汇编示例(x86) mov DX, DMA_MODE_REG ; 设置块传输模式 mov AL, BLOCK_MODE_CODE out DX, AL
特点:
- 连续传输整个数据块
- 总线独占直至传输完成
- 适合大数据量传输
3. 请求传输模式
工作流程:
- 设备发出DREQ请求
- DMA接管总线
- 传输直至:
- 数据块传输完成
- 外部EOP信号
- DREQ失效
9.4.3 基本DMA控制器
核心组件
寄存器 | 位宽 | 功能描述 |
---|---|---|
地址寄存器 | 32/64位 | 存储内存起始地址 |
计数寄存器 | 16/32位 | 记录剩余传输字节数 |
控制寄存器 | 8/16位 | 设置传输方向、模式等参数 |
工作流程(时序图描述)
- CPU初始化DMA参数
- 外设发起传输请求(DREQ)
- DMA向CPU申请总线(HRQ)
- CPU响应后进入HLDA状态
- DMA执行数据传输
- 传输完成发送中断信号
9.4.4 DMA控制器类型
1. 独立DMA控制器(如8237A)
引脚配置示例:
引脚 功能 HRQ 总线请求 HLDA 总线应答 DREQ0-3 设备请求线 DACK0-3 设备应答线
2. 集成DMA控制器
现代SoC典型配置:
C
// ARM Cortex-M DMA结构体 typedef struct { __IO uint32_t CCR; // 配置寄存器 __IO uint32_t CNDTR; // 数据数量寄存器 __IO uint32_t CPAR; // 外设地址 __IO uint32_t CMAR; // 内存地址 } DMA_Channel_TypeDef;
3. 多通道DMA
通道优先级处理算法:
- 固定优先级
- 循环优先级
- 带宽加权分配
9.5 通道方式和I/O处理机方式
9.5.1 通道方式
通道结构体系
CPU → I/O通道 → 设备控制器 → 外设
通道类型对比:
类型 | 并行能力 | 适用场景 |
---|---|---|
选择通道 | 单设备 | 高速设备(磁带机) |
多路通道 | 多设备 | 中速设备群 |
数组多路通道 | 分时复用 | 磁盘阵列 |
通道程序示例
; IBM通道命令字(CCW) CCW1: 02 000000 80 000050 ; 读操作,数据地址000000,长度80 CCW2: 08 000000 00 000000 ; 控制命令,结束链
执行过程
- CPU发出START IO指令
- 通道获取CCW链
- 执行通道程序
- 通过CSW(通道状态字)报告结果
9.5.2 I/O处理机方式
架构演进
传统:CPU → 设备控制器 DMA: CPU → DMA → 设备 通道:CPU → 通道 → 设备 IOP: 独立I/O处理机
Intel I/O处理器示例
C
// 数据搬运任务描述符 struct iop_task { uint32_t src_addr; uint32_t dest_addr; uint32_t length; uint32_t control; // 加密/校验使能位 struct iop_task* next; }; // 提交任务 void iop_submit(struct iop_task* task) { memory_barrier(); *IOP_QUEUE_TAIL = task; }
典型应用场景
- RAID控制器:硬件级数据条带化
- 网络处理器:TCP/IP协议栈卸载
- GPU:图形流水线处理
关键技术对比表
特性 | DMA | 通道方式 | I/O处理机 |
---|---|---|---|
智能化程度 | 低(需CPU配置) | 中(执行通道程序) | 高(完整指令集) |
最大传输速率 | 10GB/s | 2GB/s | 100GB/s+ |
典型延迟 | 1-10μs | 5-50μs | 0.1-1μs |
多任务支持 | 多通道分时 | 通道程序控制 | 多核并行处理 |
编程复杂度 | 低 | 中 | 高 |
成本 | $0.1-1 | $1-10 | $10-100+ |
代码案例详解
DMA内存到外设传输(Linux驱动示例)
C
#include <linux/dma-mapping.h> dma_addr_t dma_handle; void* buffer = dma_alloc_coherent(dev, size, &dma_handle, GFP_KERNEL); struct dma_device *dma_dev = filter->dma_chan->device; struct dma_async_tx_descriptor *tx_desc; tx_desc = dma_dev->device_prep_dma_memcpy( dma_chan, dest_addr, src_addr, size, DMA_CTRL_ACK); dma_cookie_t cookie = dmaengine_submit(tx_desc); dma_async_issue_pending(dma_chan);
总结与展望
未来发展趋势:
- CXL协议下的DMA新形态
- 智能网卡中的可编程I/O引擎
- 存算一体架构中的DMA优化
关键技术挑战:
- 安全防护(DMA攻击防范)
- 缓存一致性维护
- 异构计算资源调度