DMA的一些基础问题

来源:互联网 发布:知乎奶酪陷阱白仁荷 编辑:程序博客网 时间:2024/05/29 21:30

1.DMA的硬件使用总线地址而非物理地址,总线地址是从设备(这个设备就是DMA控制器)角度上看到的内

存地址,物理地址是从CPU角度上看到的未经转换的内存地址(包括一些外设的地址)

2.DMA映射包括两个方面的工作:分配一片DMA缓冲区;为这片缓冲区产生“设备”可访问的地址(注意是

设备可访问的地址,DMA传输过程中没有CPU参与,所有地址都是“实”地址)

3.void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp);
这个函数的返回值为申请到的DMA缓冲区的虚拟地址。此外,该函数还通过参数handle返回DMA缓冲区的总

线地址。------这个函数返回2个地址,内存的虚拟地址和DMA控制器使用的总线地址,这个地址写入DMA

控制寄存器,别的就不管了。这个是一致性缓冲,流式缓冲的目的一致,手段不同

4.void *pci_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma_addrp);
Linux内核还提供了PCI设备申请DMA缓冲区的函数