DMA请求与DMA中断

DMA请求与DMA中断也是曾混淆的一点。当I/O设备准备好数据之后,I/O设备向DMA控制器发送DMA请求,再由DMA控制器向CPU发送总线请求,时常将这两个过程统称为DMA请求。这不是中断,不需要进行保存现场之类的操作。DMA请求发生在数据传输之前。

当处理器希望读或写数据时,它发送一个命令给DMA模块,向DMA模块发送如下信息:

  • 通过使用处理器与DMA模块之间的读或写控制线,说明需要的是读还是写操作。
  • 相应的I/O设备地址,经数据线传输。
  • 读或写操作的存储器起始单元地址,经数据线传输,并被DMA模块存入其地址寄存器中。
  • 读或写操作的字数,经数据线传输,并被DMA模块存入其数据计数寄存器中。

然后,处理器继续执行其他工作,它已将该I/0操作委派给DMA模块。而DMA模块负责传送全部的数据块,每次一个字,直接将数据传送到存储器或从存储器中读出,不经过处理器。当该数据传送完成时,DMA模块给处理器发送一个中断信号。因此,处理器只在数据传送的开始和结束时参与(如图7-4c所示)。

图7-12显示了在指令周期的哪个位置处理器可以挂起。每次,仅仅在它需要使用总线之前挂起处理器。然后DMA模块传送一个字,并把控制权交还给处理器。注意,这不是中断,处理器不保存现场,也不做其他事情,而是等待一个总线周期。总的效果是使处理器的执行速度下降,但是对于多字节I/O传送来说,DMA比中断驱动式I/O和编程式I/O有效得多。

DMA中断指的是DMA传送完成后向CPU的中断,起到报告传送结束的作用。DMA中断发生在数据传输之后,和其他中断一样需要进行保存现场之类的操作。DMA控制器中有中断机构负责此功能。

中断机构 当字计数器溢出时(全0),意味着一组数据交换完毕,由溢出信号触发中断机构,向CPU提出中断报告。这里的中断与上一节介绍的I/O中断所采用的技术相同,但中断的目的不同,前面是为了数据的输入或输出,而这里是为了报告一组数据传送结束。因此它们是I/O系统中不同的中断事件。

DMA的后处理进行的工作是,一旦DMA的中断请求得到响应,CPU停止主程序的执行,转去执行中断服务程序做一些DMA的结束处理工作。这些工作包括校验送入内存的数据是否正确;决定继续用DMA方式传送下去,还是结束传送;测试在传送过程中是否发生了错误等等。

关于类似“不需要占用CPU”、“不需要切换进程”以及“不需要保护/恢复现场”的说法都指的是除了预处理和后处理的单纯的数据传输的过程。

DMA方式的主要优点是速度快。由于CPU根本不参加传送操作,因此就省去了CPU取指令、取数、送数等操作。在数据传送过程中,没有保存现场、恢复现场之类的工作。内存地址修改、传送字个数的计数等等,也不是由软件实现,而是用硬件线路直接实现的。所以DMA方式能满足高速I/O设备的要求,也有利于CPU效率的发挥。正因为如此,包括微型机在内,DMA方式在计算机中被广泛采用。