拱= x86_64的映射保留高內存通過remap_pfn_range用戶空間
我通過以下這個問題概括的過程中DMA解決方案時, Direct Memory Access in Linux
我對ioremap
電話與地址成功返回, PT。
在我致電remap_pfn_range
時,我使用virt_to_phys(pt) >> PAGE_SHIFT
來指定由ioremap
調用生成的區域的pfn。
當執行使用mmap
的用戶空間應用程序並調用remap_pfn_range
時,機器崩潰。我假設映射關閉,我迫使系統使用已經分配的內存(退出前的屏幕毛刺),但是我不清楚哪裏出現了不匹配。該系統具有4 Gig Ram,並通過使用內核啓動選項mem=2048M
預留2Gigs。我使用BUFFER_SIZE=1024u*1024u*1024u
和BUFFER_OFFSET=2u*1024u*1024u*1024u
。
把這些放入pt=ioremap(BUFFER_SIZE,BUFFER_OFFSET)
我相信pt應該等於虛擬地址到位於2GB邊界的物理內存,直到3GB邊界。這個假設是否準確?
當我執行我的內核模塊,但我更改我的remap_pfn_range
使用vma->vm_pgoff>>PAGE_SHIFT
作爲目標pfn代碼執行沒有錯誤,我可以讀取和寫入內存。但是,這並未使用我預期的保留物理內存。
既然一切使用vma->vm_pgoff>>PAGE_SHIFT
工作時,我相信我的罪魁禍首是我ioremap
和remap_pfn_range
感謝您的任何建議之間!
使用此內核模塊的動機是需要來自PCI設備的DMA的大量連續緩衝區。在這個應用程序中,重新編譯內核不是一個選項,所以我試圖用模塊+硬件來完成它。
謝謝,我會考慮這一點,並提出報告。我感謝你的洞察力,簡潔和基調。 – deltatango