【问题标题】:Changing page mapping for a user process in the linux kernel在 linux 内核中更改用户进程的页面映射
【发布时间】:2011-10-21 08:50:35
【问题描述】:

假设我可以访问一个进程及其 mm_struct,有没有一种方法可以更改其中一个映射或删除一个映射并创建一个临时映射,以便我可以分配小于页面的数量并拥有内存写到那个?

例如,处理 ADD 指令的写入错误。我可以相对容易地获得故障的地址和大小。我在本地分配了 8 个字节(最大的单指令大小)并弄乱了映射,以便出错的虚拟地址指向这 8 个字节的第一个字节。然后单步执行指令以获取用于另一个页面的数据,然后将原始页面恢复回映射。我只是好奇是否可以在进程的虚拟内存区域中使用页面以外的东西。

【问题讨论】:

    标签: memory linux-kernel kernel virtual-memory faults


    【解决方案1】:

    计算机的底层架构定义了您可以使用虚拟内存做什么和不能做什么。您尚未指定您的架构,但我非常有信心它不会允许您管理比页面更小的单元。

    但是要解决一个更大的问题,为什么内存大小很重要?每个线程都需要这个分配一次,只有当它出现故障时,它才会被分配给单个用户空间指令。只需使用一个新的、干净的页面来临时映射到您的流程中即可获得书面价值。它可能更容易编写,并且具有更好的安全性:它将避免将内核数据暴露给不受信任的(并且显然是错误的)应用程序。

    【讨论】:

    • 这是真的,因为内存开销不是很大,因为它的页面大小只有 4 或 8k,即使它最多只使用前 8 个字节。作为旁注,您是否碰巧知道单步执行用户空间指令(显然来自内核空间)的最简单方法?
    • @Jesus:我不太清楚,但我会先看看ptrace() 中用于实现PTRACE_SINGLESTEP 请求的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 2012-11-15
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多