Contents ...
udn網路城邦
linux kernel中dma內存的使用
2015/07/14 15:32
瀏覽2,852
迴響0
推薦0
引用0
對DMA內存的使用有兩種方式:
1,一致DMA映射
通過dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag)來直接得到一塊用於dma的內存,同時得到這一段內存的虛擬地址和總線地址,分別用於CPU和device的訪問。
通過這種方式得到的dma內存,開發者不用擔心cache的問題,但是要註意在執行DMA操作之前flush write buffer。
2,流式DMA映射
先通過kmalloc, get_free_pages等得到一段物理連續的內存空間(註意,除非目標平臺有IOMMU,否則必須要求物理地址連續,即vmalloc分配得到的內存空間不能用於DMA操作。)
然後使用dma_map_single, dma_map_pages, dma_map_sg將之前分配的內存空間映射,得到總線地址,使之能被device訪問。
這種方式不保證cache的一致性,需要開發者手動處理(調用dma_sync_single_for_cpu/device函數?);
另外,必須保證內存的虛擬地址空間邊界與cache line length對齊,因cache line length不確定,所以一般選擇page 對齊。


一致DMA映射具有更長的生命周期,它在driver的整個生命周期內都有效,且不用關心cache效應。
流式DMA映射則只在driver填充完要傳輸的內容到device完成傳輸這段時間內有效(理論上是從map到unmap,但有效時間如前所述),凡使用流式DMA映射的內存區域在map之後,就只對device有效,driver在unmap之前不能在讀寫這一段內存區域。或者使用dma_sync_single_for_cpu由cpu獲得讀寫權利,然後driver可對其進行讀寫。

限會員,要發表迴響,請先登入