dma_alloc_coherent() -- 獲取物理頁,並將該物理頁的實體位址存放在dma_handle。然後回傳該物理頁的邏輯位址。

void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t gfp)
{
void *ret;
if (!dev || *dev->dma_mask >= 0xffffffffUL){
gfp &= ~GFP_DMA;
}
ret = (void *)__get_free_pages(gfp, get_order(size)); //(1)
if (ret){
memset(ret, 0, size);
*dma_handle = virt_to_bus(ret); //(2)
}
return ret;
}

(1) 將 size 轉換成 order,即 2^order
(2) 將邏輯位址 ret 轉換成實體地址

BB 發表在 痞客邦 PIXNET 留言(0) 人氣()