2011-08-06 92 views
1

因此,可以说我有机会获得一个过程,它的mm_struct一个用户进程更改页面映射,是没有办法,我可以改变映射的一个或删除的映射,并创建一个临时的,这样的方式我可以分配一个小于一页的数量,并写入内存?在Linux内核中

例如,在ADD指令上处理写入错误。我可以相对容易地得到错误的地址和大小。我在本地分配8个字节(最大的单个指令大小)并且映射混乱,使得故障的虚拟地址指向这8个字节的第一个字节。然后单步执行指令以获取用于其他页面的数据,然后将原始页面还原到映射。我只是好奇,是否可以在虚拟内存区域中使用除页面以外的其他内容。

回答

2

计算机的底层架构定义了您可以使用虚拟内存和无法使用的虚拟内存。您还没有指定您的架构,但我相当确信它不会让您管理小于一页的单元。

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

+0

这是真的,因为内存开销并不是很大,因为它只有4或8k的页面大小,即使最多只能使用前8个字节。作为一个旁注,你会碰巧知道单步执行用户空间指令(显然是从内核空间)的最简单方法吗? –

+0

@Jesus:我不知道确切的,但我会首先查看['ptrace()'](http://linux.die.net/man/2/ptrace)中使用的代码来实现' PTRACE_SINGLESTEP'请求。 – Karmastan