Memory 在linux内核中更改用户进程的页面映射
假设我可以访问一个进程及其mm_结构,有没有一种方法可以更改其中一个映射,或者删除一个映射并创建一个临时映射,这样我就可以分配一个小于一个页面的量并写入内存Memory 在linux内核中更改用户进程的页面映射,memory,linux-kernel,kernel,virtual-memory,faults,Memory,Linux Kernel,Kernel,Virtual Memory,Faults,假设我可以访问一个进程及其mm_结构,有没有一种方法可以更改其中一个映射,或者删除一个映射并创建一个临时映射,这样我就可以分配一个小于一个页面的量并写入内存 例如,处理ADD指令上的写入错误。我可以相对容易地得到故障的地址和大小。我在本地分配8个字节(最大的单指令大小)并处理映射,以便出现故障的虚拟地址指向这8个字节中的第一个字节。然后单步执行指令,获取用于另一页的数据,然后将原始页还原回映射。我只是好奇,在虚拟内存区域中是否可以使用页面以外的内容进行进程。计算机的底层架构定义了虚拟内存的功能和
例如,处理ADD指令上的写入错误。我可以相对容易地得到故障的地址和大小。我在本地分配8个字节(最大的单指令大小)并处理映射,以便出现故障的虚拟地址指向这8个字节中的第一个字节。然后单步执行指令,获取用于另一页的数据,然后将原始页还原回映射。我只是好奇,在虚拟内存区域中是否可以使用页面以外的内容进行进程。计算机的底层架构定义了虚拟内存的功能和功能。您还没有指定您的体系结构,但我很有信心,它不允许您管理任何小于页面的单元
但是为了解决一个更大的问题,为什么内存大小很重要?您需要为每个线程分配一次,只有在它有故障时才需要,并且它将被分配给单个用户空间指令。只需使用一个新的、干净的页面临时映射到您的流程中,即可获得写入的值。它可能更容易编写,并且具有更好的安全性:它将避免将内核数据暴露给不受信任(显然是有故障的)应用程序。这是事实,因为内存开销不是很大,因为页面大小只有4或8k,即使最多只使用前8个字节。作为旁注,您是否知道单步执行用户空间指令的最简单方法(显然是从内核空间)?@Jesus:我不知道确切的方法,但我首先要看一下用于实现
PTRACE\u SINGLESTEP
请求的代码。