我正在編寫一個需要將特定物理地址映射到特定虛擬地址的Linux內核模塊,而我無法找到一種方法來實現它。將虛擬地址映射到特定物理地址
-1
A
回答
0
你能告訴我們你正在使用的內核版本和CPU架構/類型嗎?一般來說,如果要映射到的特定虛擬地址與內核虛擬地址(例如0xC0000000)不重疊,並且您的設備正在使用的物理地址與系統內存物理地址範圍不重疊,則可以使用低級函數(如果沒有,則可以使用匯編語言在內核啓動期間直接設置MMU TLB條目)設置MMU TLB條目,以便在內核啓動期間將特定地址映射到特定虛擬地址。我可以提供一個基於2.6.10內核版本和Freescale PowerPC CPU的例子,有一個函數io_block_mapping來完成你想要的任務。
0
好的,這是我目前的解決方案。要映射phys_addr
到virt_addr
我使用此代碼:
page = pfn_to_page(virt_addr >> PAGE_SHIFT);
pte = get_locked_pte(&init_mm, phys_addr, &ptl);
set_pte_at(&init_mm, phys_addr, pte, mk_pte(page, VM_READ | VM_WRITE | VM_EXEC));
spin_unlock(ptl);
flush_tlb_all();
一些explenations:我用的是pfn_to_page
FUNC得到對應我virt_addr
的頁面結構。我得到頁表項(pte
)與get_locked_pte
函數,它需要與想要的pte
相對應的物理地址和一個未經初始化的自旋鎖(ptl
)。然後,我實際使用set_pte_at
func和mk_pte
宏映射頁面,解鎖自旋鎖並刷新tlb緩存。
這種解決方案似乎工作得很好,雖然它不能在上下文切換中倖存下來。
相關問題
- 1. 將物理地址映射到虛擬地址linux
- 2. 虛擬地址映射到物理地址
- 3. 虛擬地址到物理地址映射
- 4. 如何將物理地址映射到不同大小的虛擬地址?
- 5. 物理地址與虛擬地址
- 6. 映射虛擬地址到物理地址的含義是什麼?
- 7. 虛擬與物理地址
- 8. 內存映射IO - 誰將地址映射到物理地址空間?
- 9. 將虛擬地址轉換爲物理地址。任務解決
- 10. 轉換邏輯(虛擬)地址到物理地址
- 11. 虛擬地址到物理地址的轉換
- 12. 轉換DMA映射虛擬地址
- 13. ELF中的虛擬和物理地址
- 14. elf文件中段的虛擬地址和物理地址
- 15. 函數指針:物理地址或虛擬地址
- 16. 虛擬地址和物理地址的區別?
- 17. 內存與物理地址或虛擬地址合併?
- 18. C指針是指物理地址還是虛擬地址
- 19. malloc的返回值是虛擬地址還是物理地址?
- 20. PTE中的條目是物理地址還是虛擬地址? |虛擬內存
- 21. 兩個進程中兩個相同的虛擬地址如何映射到不同的物理地址?
- 22. 將內核空間虛擬地址映射到Windows 10驅動程序中的用戶空間虛擬地址
- 23. 虛擬地址
- 24. 緩存查找決定是基於虛擬地址還是物理地址
- 25. 將內存地址映射到Windows XP中的物理模塊
- 26. 物理地址到IP地址
- 27. 虛擬IP地址
- 28. 虛擬物理網址
- 29. 如何查找可用於特定虛擬物理地址映射的最大頁面大小?
- 30. SNMP OID將MAC地址映射到IP地址?
我使用內核3.0與ARM/omap拱。 我掛鉤了內核啓動時間(使用「pure_initcall」宏)以使用memblock_remove函數保留這個物理地址,所以我知道它是免費的。 – yygg 2013-03-21 11:51:33