我正在编写一个需要将特定物理地址映射到特定虚拟地址的 Linux 内核模块,但我找不到实现它的方法。
最佳答案
好的,这是我目前的解决方案。要将 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();
一些解释:我使用 pfn_to_page
函数获取与我的 virt_addr
对应的页面结构。我使用 get_locked_pte
函数获取页表条目 (pte
),它需要与所需的 pte
对应的物理地址和一个未初始化的自旋锁 (ptl
)。然后,我实际使用 set_pte_at
函数和 mk_pte
宏映射页面,解锁自旋锁并刷新 tlb 缓存。
这个解决方案似乎工作得很好,尽管它无法在上下文切换后继续存在。
关于linux - 将特定的虚拟地址映射到特定的物理地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15543502/