DMA小结

DMA分为两大类,总线主DMA驱动(利用PCI卡上的DMA控制器),从属DMA驱动(利用主板上的DMA控制器,例如软盘控制器,这类基本被淘汰)。这两类驱动每种又可以分为基于包的DMA驱动和通用缓冲区DMA驱动。

基于包的DMA驱动是,由用户程序进程发起读写请求。由于读写请求是虚拟内存连续,但物理内存不连续的,所以需要调用MapTransfer来完成这些转换。

另外一种是通用缓冲区DMA驱动,是在驱动中通过调用AllocateCommonBuffer来分配一段连续物理内存。用这片物理内存和DMA控制器操作,这段内存和应用程序之间使用过简单的内存拷贝实现。

IoGetDmaAdapter第三个参数是映射寄存器的个数,比如最大DMA传输量为1M,那么映射寄存器的个数应该是1M/4K+1 = 0x101

使用AllocateCommonBuffer分配内存是为了区分逻辑地址(设备访问的地址)和物理地址(实际物理内存)。在32位系统下使用32位的PCI卡,逻辑地址和物理地址是等价的。32位PCI卡在64位下,AllocateCommonBuffer返回的物理地址可能高于4GB,但是逻辑地址肯定是低于4GB,这就需要物理地址和逻辑地址的换算。对于设备的DMA控制器,它只知道逻辑地址,而不知道物理地址。

posted @ 2011-05-04 16:10  Fan Zhang  阅读(419)  评论(0编辑  收藏  举报