linux - 将特定的虚拟地址映射到特定的物理地址

标签 linux memory kernel memory-address

我正在编写一个需要将特定物理地址映射到特定虚拟地址的 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/

相关文章:

c - 动态分配内存

c - 段错误,大小为 4 的无效写入

algorithm - Taking data into memory 在 Java 或任何其他编程语言中是什么意思?

android - 将 CyaSSL 与当前的 Android 内核 (KitKat) 集成

linux - 如何安装 kernel-devel 和 kernel-headers mathching 5.x 内核?

wolfram-mathematica - 通过不使用评估菜单的命令退出mathematica中的内核

c - 键盘中断处理的 Linux 设备驱动程序错误

android - Android app如何知道底层硬件支持某种硬件解码加速?

linux - Crontab 无法正常工作

linux - 如何根据 linux 中的键列合并两个文件的内容