首页 > 编程知识 正文

为什么用DMA,DMA的含义?它是如何操作的

时间:2023-05-05 06:30:40 阅读:284078 作者:1726

DMA:Direct memory access,是一种访问内存的模式。它是怎么诞生的?

1. DMA的诞生起因:PIO模式太慢了

没有DMA之前的上古时代,很多设备都是低速的,比如PS/2的键鼠、PATA的光驱等。此时CPU访问它们的方式都是PIO。简单说,就是CPU去轮询(polling)这个设备(其实是设备控制器,CPU是不能直接访问设备的),检查是否有新的数据,如果有,就把它读入到内存中。

这个轮训的方式,至今在单片机的数据采集中还经常用到。这样做有个问题:低效,CPU大把的时间都用来检查了。那么有没有别的办法呢?有,中断。CPU通知设备控制器,我很忙,有很多事要去做,不能一直看你,这样吧,你接收到数据就告诉我好了。单片机的中断机制也是这样,UART的FIFO满了,产生一个中断告诉CPU,CPU进入Interrupt Service Route函数,把UART FIFO中的数据读走。

这样也有一个问题:当数据多了(比如磁盘中的一个大文件),中断就会很频繁。也变得低效了。怎么办?

2. DMA的诞生

于是就有了DMA控制器,它可以理解成是CPU的“协处理器”,也是CPU的儒雅的奇迹,CPU告诉它,我要读取磁盘中的一个小电影,但是我还有其他的事情(比如说打一局Dota),你来负责电影的读取吧。

就这样,DMA控制器替CPU接管了访问磁盘的总线控制权(所有的外设都是挂在总线上的),根据CPU发过来的数据大小和设备ID,来实现对设备的读写。这样就比PIO高级了。

这种DMA叫做Third-party DMA,或者Standard DMA,或者System DMA。总之呢,就是用一个总线上所有设备共享的DMA控制器来管DMA这件事。这类DMA也是很慢的,在磁盘这类高速设备出现之后就基本被First party DMA取代了。

First-party DMA又称为Bus Mastering,就是所有的外设直接可以申请总线的控制权,基本没有CPU什么事了。后面我们在学习用Xilinx FPGA实现一个PCIe的时候,它的IP core就是Bus mastering模式的(XAPP1052)。

 

其他的一些问题:

1. DMA控制器在硬件上是一个什么样的存在?

DMA控制器早期是一个独立的存在:比如intel的8237,但是随着总线技术的发展,8237的功能逐渐被放到了芯片组中,比如我家里PC用的芯片组是C216,里面就提到了DMA的功能:SATA Controller(支持DMA),USB Controller(支持DMA),Giga Ethernet Controller(支持DMA),LPC DMA Controller(用于LPC总线设备的DMA)等。

2. Ultra DMA是什么?

访问ATA总线外设的一种快速的DMA模式。目前最快可以达到167MB/s(UDMA7),我所接触到的主要是在CF卡上的应用。

 

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。