2012-07-09 103 views
16
  1. 這個調用返回的DMA地址是否與物理地址相同? LDD3表示DMA地址應該被驅動程序視爲不透明。我想要映射這個DMA緩衝區,以便用戶空間可以直接讀取/寫入它。問題是我應該爲remap_pfn_range指定什麼PFN(現在我的驚喜(內核3.4+)對傳統內存和I/O內存相同)。我可以將DMA地址轉換爲無符號長整型並將其轉換爲PFN嗎?這不違反LDD3關於不透明性的說法嗎?關於dma_alloc_coherent的一些問題

  2. dma_alloc_coherent是否始終在內部使用__get_free_pages?這是否意味着該區域可能總是被過度分配(因爲第一個函數需要字節,但第二個函數以頁爲單位分配)?

  3. 有沒有一種方法可以爲從__get_free_pages的調用獲得的多個連續頁面設置單個流式映射? dma_map_page僅適用於單頁。

+0

您是否發現將dma內存附加到remap_pfn_range內存的正確方法? – Luca 2015-01-27 18:53:24

回答

11
  1. 沒有,返回的地址是一個虛擬地址,否則你將無法從內核空間訪問它。它是代表物理地址的dma_handle,但它是不透明的。您需要在返回的地址上使用virt_to_phys,然後將其傳遞給remap_pfn_range。

  2. 我不相信它(雖然它可能是平臺依賴),但它確實分配頁面。如果你想爲DMA使用更少的內存,你應該使用dma_pool_create,然後從那裏分配區域。

  3. 您可以使用dma_map_single而不是dma_map_page。

我建議諮詢DMA-API.txt關於這些東西的更多細節。