写保护的虚拟页面,捕获写入

时间:2009-01-04 22:14:47

标签: linux x86 elf language-implementation

是否存在捕获写入受保护页面的方法?

我计划做一个类似于自我的对象系统,你可以在其中复制对象来实例化它。 (因为与其他部分相比,它听起来简单而紧凑)显然,为此目的创建的对象应该以某种方式进行写保护。我已经看到有一种方法可以标记ELF中程序头的写保护。 (RE,RWE,RW -flags)

这是否提供写保护?我记得它应该引发一个段错误,这是真的吗?如何将写入捕获到写保护页面。这是实现我想要的好方法吗?有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以使用mprotect

是的,写入受保护的内存会引发段错误。您可以安装处理程序,例如在C ++中:

std::signal(SIGSEGV, my_segv_handler_func);

这是一种合理的方式来做你想要的,虽然你必须添加很多额外的管理goo才能使它工作。例如,这种写检测是在硬件中完成的,而在x86架构上,您的页面大小为4k。所以你可以一次保护4k的东西,在4k边界上对齐 - 不是通用的“从地址X开始并且去N字节”。我相信你要么

  1. 具有对象到页面的映射 这样你就可以确定是否 写入页面是对a的写入 特别受保护的对象,或
  2. 总是滚动你自己的malloc         在4k边界上分配,这将迫使你使用a         最小alloc'd块大小为4k
  3. 如果有更好的方法,我不知道我的头脑,但玩起来听起来很有趣。 :)