DMA传输数据过程简介


  DMA传送操作分三个阶段:准备阶段、DMA传送阶段和传送结束阶段。
  1.准备阶段:在这个阶段中,CPU通过指令向DMA控制器发送必要的传送参数。
  ①控制字送DMA控制器指出数据传送方向。
  ②预置MBAP,即数据块在主存缓冲区的首址。
  ③置DAR外设的地址,如外设为磁盘机,其地址包括:磁盘机号、盘面号、柱面号和扇区号。
  ④给WBC预置,指出数据传送字节/字数。
  2.DMA传送阶段
  DMA接口上传送的一批数据是一个个传送的,在周期挪用控制方式下DMA控制器主要完成以下五个操作。
  ①外设准备好一次数据传送后,接口向主机发DMA请求。
  ②CPU响应DMA请求,把总线使用权让给DMA控制器。DMA控制器控制源、目的端口准备传送数据。
  ③DMA周期挪用一次,交换一个数据信息。
  ④归还总线使用权,修改主存地址指针和传送计数值。
  ⑤判断这批数据是否传送完毕:是,结束该工作阶段;没有,又开始传送下一个数据。DMA中信息传送过程.
  3.结束阶段
  DMA在两种情况下都会进入结束阶段,一种情况是一批数据传送完毕,这是正常结束。另一种情况是DMA发生故障,也要进入结束阶段,这是非正常结束。不论是哪一种情况进入结束阶段,DMA都向主机发出中断请求,CPU执行服务程序查询DMA接口状态,根据状态进行不同的处理。
  DMA是程序中断传送技术的发展。它在硬件逻辑机构的支持下,以更快的速度、更简便的形式传送数据。程序中断与DMA相比有以下几个不同。
  ①中断方式通过程序实现数据传送,而DMA方式不使用程序直接靠硬件来实现,信息传送速度快。 
  ②CPU对中断的响应是在执行完一条指令之后,而对DMA的响应则可以在指令执行过程中的任何两个存储周期之间,请求响应快。
  ③中断方式必须切换程序,要进行CPU现场的保护和恢复操作。DMA仅挪用了一个存储周期,不改变CPU现场,额外化销小。
  ④DMA请求的优先权比中断请求高。CPU优先响应DMA请求,是为了避免DMA所连接的高速外设丢失数据。
  ⑤中断方式不仅具有I/O数据传送能力,而且还能处理异常事件,DMA只能进行I/O数据传送。
总而言之,在进行I/O控制时,DMA控制方式比程序中断控制方式速度快,但程序中断控制方式的应用范围比DMA控制方式广。
### DMA 数据传输过程、原理及步骤 DMA(Direct Memory Access,直接内存访问)是一种高效的计算机数据传输机制,它允许外部设备与存储器之间直接进行数据交换而无需 CPU 的干预。以下是关于 DMA 数据传输的具体过程、原理以及详细的步骤说明。 #### 一、DMA 数据传输的基本原理 DMA 技术的核心在于通过专用的硬件模块——DMA 控制器来接管数据传输的任务,从而减少 CPU 的负担并提高系统的整体性能。具体来说,DMA 控制器能够独立于 CPU 完成外设和内存之间的数据搬移操作[^1]。 #### 二、DMA 数据传输的主要步骤 DMA 数据传输通常分为以下几个阶段: 1. **初始化配置** 在开始数据传输之前,主机软件会向 DMA 控制器写入必要的参数,这些参数包括源地址、目标地址以及要传输的数据长度等信息。此阶段由 CPU 负责完成设置,并启动 DMA 请求准备过程[^2]。 2. **DMA 请求发起** 当外围设备准备好发送或接收数据时,该设备会向 DMA 控制器发出一个 DMA 请求信号。一旦接收到有效的请求,DMA 控制器便会申请总线控制权以便执行后续的操作[^2]。 3. **获取总线使用权** 如果当前总线上没有其他更高优先级的任务正在运行,则仲裁逻辑授予 DMA 控制器对系统总线的完全掌控权限;否则需要等待直到条件满足为止[^2]。 4. **实际数据传送** 获取到总线之后,DMA 控制器按照预先设定好的方式将数据从源位置复制到目的位置。这一过程中可能涉及单字节/多字节连续读取或者分批处理等多种模式取决于具体的实现方案[^1]。 5. **结束通知与状态更新** 数据成功转移完成后,DMA 控制器释放所占用资源并将结果反馈给最初触发此次事务的相关方(通常是中断形式告知CPU)。与此同时还会记录下本次作业的状态供将来查询使用[^2]。 #### 三、代码示例模拟简单 DMA 过程 下面给出一段伪代码用于演示如何利用编程接口简化描述上述提到的部分功能: ```python class DMAController: def __init__(self, src_addr, dest_addr, length): self.src_addr = src_addr # 源地址指针 self.dest_addr = dest_addr # 目的地地址指针 self.length = length # 需要传输的数据量大小 def start_transfer(self): """ 开始数据传输 """ while self.length > 0: data = read_memory(self.src_addr) # 从源地址读取数据单元 write_memory(self.dest_addr, data) # 将数据写入至目的地地址 increment_pointers() # 更新指针指向下一个待处理项的位置 decrement_length_counter() # 减少剩余计数直至全部完成 def main(): dma = DMAController(0x8000, 0xA000, 1024) dma.start_transfer() if __name__ == "__main__": main() ``` 以上仅为理论上的抽象表示,在真实环境中还需要考虑更多细节比如错误检测恢复机制等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值