2007-08-21 12:29

dma_alloc_coherent() -- 给DMA池分配物理页

poop_alloc_page() --> dma_alloc_coherent()

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转换成总线地址

更多推荐

dma_alloc_coherent() 的实现