首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

DMA 是什么以及如何工作的

DMA 是什么以及如何工作的

直接内存存储 (Direct Memory Access - DMA) 是一种计算机内数据传输的模式,它不需要中央处理器 (CPU) 的干涉。  DMA 的工作方式在不同架构的计算机内是以不同的形式被实现的。因此此篇文章将把讨论限制在对 IBM 个人计算机 (PC) 和 IBM PC/AT 以及其他所有后继者和兼容产品 的 DMA 子系统的实现以及工作方式上。
  PC 的 DMA 子系统是建立在 Intel® 8237 控制器上的。这个 8237 控制器包含 了四个 DMA 通道,每个通道都可以被独立的编程控制而且任何一个通道在任何时候都可以是活动的。这些通道被编号为 0, 1, 2 和 3。从 PC/AT 开始,IBM 加入了第二个 8237 芯片,然后把加入的通道命名为 4, 5, 6 和 7。
  原来的 DMA 控制器 (0, 1, 2 和 3) 每次传输一个字节。第二个 DMA 控制器 (4, 5, 6 和 7) 每次传输两个连续内存块内的 16 比特数据,而且前 8 个比特一定是来自一个奇数位的地址。这两个控制器完全是相同的。传输的不同是由第二个控制器连接到系统的方式来决定的。
  8237 每个通道有两种电信号,叫 DRQ 和 -DACK。还有一些附加的信号如 HRG (Hold Request),HLDA (Hold Acknowledge),-EOP (End of Process),和总线控制信 号 -MEMR (Memory Read),-MEMW (Memory Write),-IOR (I/O Read),和 -IOW (I/O Write)。
  8237 DMA 也叫 “fly-by” DMA 控制器。这意味着被传输的数据即 不通过 DMA 芯片,也不存储在 DMA 芯片中。因此,DMA 只能在 I/O 端口和内存地址 间传输数据,而不是在两个 I/O 端口或者两块内存间。
注意: 8237 允许非 “fly-by” 模式,即连接两个通道来完成内存你到内存的数据传输。但在 PC 工业中没人使用这种模式,因为在内存中移动数据使用 CPU 要更快。

  在 PC 架构中,当使用一个给定 DMA 通道的硬件对这个通道发出 DRQ 信号以后, 这个 DMA 通道才会被激活。
[url=]9.1.1 一个 DMA 传输的例子[/url]  这个例子展示了 DMA 传输的触发和执行。在这个例子里,软盘控制器 (FDC) 从软盘读入了一个字节,然后需要 DMA 把这个字节放到内存的 0x00123456 处。整 个过程由 FDC 对 DMA 控制器发出 DRQ2 (对第二个通道发出 DRQ 信号)信号开始。
  DMA 控制器会注意到接收到了一个 DRQ2信号。然后控制器会确定第二个 DMA 通道已经被编程而且被标记为 unmasked (开启)。然后控制器也会确定其他的通道是活动的而且有更高的优先权。一旦这些工作完成,DMA 就要求 CPU 把总线放开,以便自己可以使用。DMA 通过总线发出 HRQ 信号直达 CPU。

  依靠处理器,CPU 在空闲的时候就可以执行一些附加的指令。但是最终 CPU 在执行从内部处理器缓存或管道读取内容的命令的时候, 还是要等待。
  既然 DMA “取得了管理权”,那么 DMA 就会激活 -MEMR,-MEMW, -IOR,-IOW 输出信号,来自 DMA 的地址输出也会被设定为 0x3456。这个输出将用来引导将被传输的字节到确定的内存地址。
  DMA 然后让需求 DMA 传输数据的设备知道传输就要开始了。这个开始的信号 就是 -DACK,如果这个设备是软盘控制器, 那么就使用 -DACK2 信号。
  软盘控制器会负责把要传输的字节放到总线数据线上。除非软盘控制器需要更多的时间从总线上获取数据(而且,如果外围设备的确需要更多的时间,这个设备会 使用 READY 信号警告 DMA。),DMA 就会等待一个 DMA 时钟周期,然后去除掉 -MEMW 和 -IOR 信号以便内存可以关闭和保存总线上的字节,然后软盘控制器就知道 那个字节已经被传输。
  因为 DMA 周期一次只传输一个字节,软盘控制器现在就会丢掉 DRQ2 信号, 因此 DMA 就知道这个不再需要了。DMA 也丢掉 -DACK2 信号,以便软盘控制器知道它必须停止往总线上传输数据。
  DMA 会检查任何一个 DMA 通道有没有动静。如果任意通道都没有 DRQ 信号,那 么 DMA 控制器就会第三次发出 -MEMR,-MEMW,-IOR,-IOW 和地址信号。
  最后,DMA 会去掉 HRQ 信号。CPU 看见这个信号后,也会去掉 HOLDA 信号。 然后 CPU 激活 -MEMR,-MEMW,-IOR,-IOW 和地址信息,然后再回去执行命令并访 问内存和外围设备。
  对于一个典型的软盘区段,上述过程会重复 512 次,每次一个字节。每个字节传输的时候,DMA 中的地址寄存器会增加一,显示还有多少字节要传输的数据计数器则会减一。
  当这个计数器变为 0 的时候,DMA 会发出 EOP 信号,意味着 DMA 知道计数 器为 0,没有数据需要传输了,并等待再次被 CPU 召唤执行其他任务。这个事件也 叫作 终端计数 (Terminal Count, or TC)。只有一个 EOP 信号,而且,既然每次只 会有一个 DMA 通道是活动的,那么这个活动的通道就只可能是刚刚完成任务的通道。
  当缓存的传输结束以后,如果一个外围设备需要发出中断信号,就可以试验一 下把 -DACKn 信号和 EOP信号一起发出去。如果有这样的情况发生,就意味着 DMA 在没有 CPU 干预的情况下,不会再给那个设备传送任何的数据了。外围设备就可以发出中断信号来取得处理器的注意。在 PC 架构下,DMA 芯片自己是不能发出中断信号的。只有外围设备以及相应的硬件才负责发送中断信号。因此,就有可能有使用 DMA 而不使用中断的外围设备。
  应该懂得,尽管 CPU 在 DMA 需要的时候,总是把总线释放给 DMA,这个动作在应用程序和操作系统里面是不可见的,只是当 DMA 是活动的时候,CPU 执行指令的时间会有一点点的差别。因此,处理器会不时的探测外围设备的状态,探测 DMA 芯片中的寄存器,或者,当 DMA 传输结束的时候,从外围设备接收中断信号以确定 情况。
继承事业,薪火相传
返回列表