2013-02-19 149 views
2

我在那裏我開發的以太網設備仿真模塊有點不尋常的情況。理想情況下,仿真層與寄存器組的實際硬件完全相同。我遇到的問題是硬件中的DMA寄存器加載了數據的DMA映射(物理)地址。我需要使用這些物理地址將數據從源設備上的Tx緩衝區複製到目標設備上的Rx緩衝區。爲了在模塊代碼中做到這一點,我需要指向虛擬內存的指針。我看着phys_to_virt(),我不明白的man page此評論:轉換DMA映射虛擬地址

This function does not handle bus mappings for DMA transfers. 

這是否意味着經由dma_map_single檢索到的物理地址無法使用phys_to_virt轉換回一個虛擬地址() ?是否有另一種方法來完成此轉換?

回答

0

沒有任何通用的方法將DMA地址映射到虛擬地址。 dma_map_single()函數可能是對IOMMU(例如Intel x86系統上的VT-d)進行編程,這會導致DMA地址與原始物理地址或虛擬地址完全無關。然而,this presentation和鏈接的幻燈片提供了一種將仿真硬件模型掛接到真實驅動程序(基本上使用虛擬化)的方法。

+0

感謝您的幻燈片鏈接。我會看一下。 – jhd1013 2013-02-25 07:47:05

0

我對這個問題不太清楚,但是如果您使用的是"phys_to_virt()",可能是由於該功能無法將總線上可用的地址轉換爲虛擬的原因。我不確定只是試試bus_to_virt(bus_addr);function

+0

謝謝你試圖回答。原來我原來的問題沒有太大意義。由於我試圖模擬硬件,因此下面沒有真正的總線。如果內核下面沒有可以映射的總線,我不會得到DMA地址。 – jhd1013 2013-02-25 07:46:13

0

嘗試dma_virt = virt_to_phys(bus_to_virt(dma_handle))

它爲我工作。它給出了由dma_coherent_alloc()映射的相同虛擬地址。