1. 分配源地址、目的地址 函數裡面是源和目的的物理地址,函數返回的是源和目的的虛擬地址。 2. 源和目的的記憶體釋放 3. 和硬體打交道用到的是物理地址,比如把源和目的地址告訴DMA寄存器 4. 調用內核函數使用的一般是虛擬地址 完整程式見https://www.cnblogs.com/zhu-g5 ...
1. 分配源地址、目的地址
src_addr = dma_alloc_writecombine(NULL,BUFF_SIZE, &psrc_addr,GFP_KERNEL);
dst_addr = dma_alloc_writecombine(NULL,BUFF_SIZE, &pdst_addr,GFP_KERNEL);
函數裡面是源和目的的物理地址,函數返回的是源和目的的虛擬地址。
2. 源和目的的記憶體釋放
dma_free_writecombine(NULL, BUFF_SIZE,src_addr,psrc_addr);
dma_free_writecombine(NULL, BUFF_SIZE,dst_addr,pdst_addr);
3. 和硬體打交道用到的是物理地址,比如把源和目的地址告訴DMA寄存器
dma_regs->disrc = psrc_addr;
dma_regs->didst = pdst_addr;
4. 調用內核函數使用的一般是虛擬地址
memset(src_addr,0xaa,BUFF_SIZE); //從src開始的BUFF_SIZE空間每個位元組都設置為0xaa memset(dst_addr,0x55,BUFF_SIZE);
完整程式見https://www.cnblogs.com/zhu-g5may/p/9314819.html