dma(direct memory access) ,即直接存储器存取,是一种快速传送数据的机制。数据传递可以从适配卡到内存,从内存到适配卡或从一段内存到另一段内存。dma技术的重要性在于,利用它进行数据传送时不需要cpu的参与。每台电脑主机板上都有dma控制器,通常计算机对其编程,并用一个适配器上的rom(如软盘驱动控制器上的rom)来储存程序,这些程序控制dma传送数据。一旦控制器初始化完成,数据开始传送,dma就可以脱离cpu,独立完成数据传送。
在dma传送开始的短暂时间内,基本上有两个处理器为它工作,一个执行程序代码,一个传送数据。利用dma传送数据的另一个好处是,数据直接在源地址和目的地址之间传送,不需要中间媒介。如果通过cpu把一个字节从适配卡传送至内存,需要两步操作。首先,cpu把这个字节从适配卡读到内部寄存器中,然后再从寄存器传送到内存的适当地址。dma控制器将这些操作简化为一步,它操作总线上的控制信号,使写字节一次完成。这样大大提高了计算机运行速度和工作效率。
计算机发展到今天,dma已不再用于内存到内存的数据传送,因为cpu速度非常快,做这件事,比用dma控制还要快,但要在适配卡和内存之间传送数据,仍然是非dma莫属。要从适配卡到内存传送数据,dma同时触发从适配卡读数据总线(即i/o读操作)和向内存写数据的总线。激活i/o读操作就是让适配卡把一个数据单位(通常是一个字节或一个字)放到pc数据总线上,因为此时内存写总线也被激活,数据就被同时从pc总线上拷贝到内存中。
对于每一次写操作,dma控制器都控制地址总线,通知应将数据写到哪段内存中去。 dma控制数据从内存传送到适配卡的方法与上面类似。对每一个要传送的单位数据,dma控制器激活读内存和i/o写操作的总线。内存地址被放到地址总线上,像从适配卡到内存传送数据一样,以数据总线为通道,数据从源地址直接传送到目的地址。 dma从dma请求线(dreq)上接收dma请求,正像中断控制器从中断请求线(irq)上接收中断请求一样。
一个典型的从适配卡到内存的数据传送是这样进行的,首先,对dma控制器编程,写入数据要到达的内存地址和要传送的字节数。适配器可以开始传送数据时,它将激活dreq线,与dma控制器连通。dma控制器在与cpu取得总线控制权后,输出内存地址,发送控制信号,使得一个字节或一个字从适配器读出并写入相应内存中,然后更新内存地址,指向下一个字节(或字)要写入的地址,重复上面的操作,直至数据传送完毕。对控制器进行不同编程,就可以实现单字节传送(即每传送一个字节都要求一个dreq信号)或块数据传送(即全部数据传送只需要一个dreq信号)。
如果你要往计算机中插一块适配卡,而且适配卡使用dma,通常安装程序会让你选择一个dma通道,设定dip开关或跳线,来为相应适配器设置dma通道。尽管从理论上讲,只要不是同时使用dreq线,不同的适配卡可以共享这条线的,但是按常规,我们最好为每个适配卡单独安排一个dma通道,这样就可以保证不会发生dma冲突。附表是dma的缺省分配情况。通道 功能 通道 功能 o 空闲 4 用于级联dma控制器 1 空闲 5 空闲 2 软盘 6 空闲 3 空闲 7 空闲 从中可以看出,dma通道2和4已被占用,在大多数微机上,通道1、3、5、6和7可由你任意分配。我们平时最好对自己的计算机上dma通道的分配情况记录下来,以免我们向计算机增加新硬件时出现两个适配卡共用一个通道,导致冲突。
dma---direct memory access,直接内存访问,是一种数据传输模式。dma方式下由于不直接访问计算机的cpu,而直接在ram与设备之间传输,因而大大提高了数据传输速度。
pio模式下硬盘和内存之间的数据传输是由cpu来控制的;而在dma模式下,cpu只须向dma控制器下达指令,让dma控制器来处理数的传送,数据传送完毕再把信息反馈给cpu,这样就很大程度上减轻了cpu资源占有率。dma模式与pio模式的区别就在于,dma模式不过分依赖cpu,可以大大节省系统资源,二者在传输速度上的差异并不十分明显。dma模式又可以分为single-word dma(单字节dma)和multi-word dma(多字节dma)两种,其中所能达到的最大传输速率也只有16.6mb/s。