第9章  DMA

2009-05-13 07:15:06来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折


第9章  DMA
9.1 DMA:什么是DMA,它如何工作
Copyright © 1995,1997 Frank Durda IV , All Rights Reserved. 10 December 1996. Last Update 8 October 1997.

翻译 gvim

原文连接
http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/dma.html


直接内存访问(DMA)是一种传输数据的方式,它允许两个地址上的数据直接进行传输而无需CPU的介入。

DMA功能在不同计算机体系下的实现方式有所不同,因此这里的讨论只局限于IBM 个人计算机(IBM PC/AT以及它们的衍生系统)的DMA子系统的实现和工作方式上。
PC 上的DMA子系统使用的是Intel® 8237 DMA控制器。8237包含有四个DMA通道,这些通道可以被单独的编程,并且任何一个通道也可以在任何时刻被激活。

第一个DMA 控制器(0,1,2和3)在传输的时候一次只能移动一个字节(8-bits)。第二个DMA 控制器(4,5,6和7)在传输的时候一次可以从相邻内存空间里移动16-bits(2个字节)的数据。显然,进行传输的第一个字节一定来自偶数编号的地址上。

8237的每个通道上都有两个芯片信号引脚,一个是DRQ和-DACK。还有一些其他信号引脚,分别是 HRQ(请求保持信号), HLDA(应答保持信号), -EOP(过程结束信号), 和总线控制信号 –MEMR(内存读), -MEMW(内存写), -IOR(I/O读), -IOW(I/O写)。

8237 DMA 是一种“遥控型”的DMA控制器。这也就是说,在两个地址间移动的数据不会经过DMA芯片,也不会转储到DMA芯片上。因为这个特点,数据的DMA传输只可以在I/O端口和内存地址之间进行,而不可以发生在两个I/O端口或者两个内存区域之间。

注意:8237确实也可以工作在非“遥控型”的方式,只要把两个通道连接起来就可以进行内存到内存的DMA操作。不过在现实中的PC制造业中并没有制造商这样处理,因为DMA资源十分稀少,而且使用CPU进行内存间数据的移动比使用DMA要快不少。

在PC体系中,一般来说某个DMA通道仅在以下情况时被激活:如果某个硬件需要利用某个DMA通道进行数据的传输,它需要往DMA控制器的DRQ引脚发出请求信号。
9.1.1 DMA传输的例子

这里是一个例子,用来说明引发并执行DMA传输的步骤。在这个例子里,软盘控制器(FDC)从磁盘中读取一个字节,然后使用DMA将读取的数据存放在内存地址0x00123456上。

DMA 控制器检测到它的DRQ2引脚被触发。DMA控制器接下来首先需要验证DMA的2号通道已经被编程,并且该通道没有被屏蔽(即,可以被使用)。DMA还需要验证没有其他更高优先级的DMA通道是激活的(或者将要被激活)。仅当上面这些验证都通过了,DMA才会请求CPU释放对总线的控制权,转而由自己进行接管。DMA对总线控制权的请求,是通过发出HRQ(请求保持)信号来完成的,该信号被送往CPU。

CPU检测到HRQ信号,并将正在执行的指令执行完毕。一旦处理器不再需要总线,那CPU就释放它。现在,CPU的-MEMR, -MEMW, -IOR, -IOW 和其他一些信号线的引脚都处于高阻态(即不是高电平也不是低电平),接着CPU向DMA控制器发出HLDA信号,通知DMA控制器“从此刻开始,总线的控制权可以被它接管”。

虽然CPU当前不再拥有总线控制权,不过根据处理器的设计,它仍可能继续执行一些指令。但是随着CPU指令的执行,可能有一些指令/数据不在cache或者流水线中,这些内容只能从内存上取得,那么CPU也只有等待总线了。

现在,总线的控制权属于DMA控制器,DMA使用它自己的-MEMR, -MEMW, -IOR, -IOW 输出信号使用总线,并且将0x3456发送到总线的地址线上。这个地址就是数据将被写入的内存地址。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:FreeBSD设备驱动(3) - PCI网卡

下一篇:[转]FreeBSD系统终极安装手册(图)