2009-01-04 18 views
0

是否存在一种方法来捕获写入写保护页面?写保护的虚拟页面,赶上写

我打算做一个自我喜欢的对象系统,在其中复制对象来实例化它。 (因为它听起来简单而紧凑)显然,为此目的创建的对象应该以某种方式被写保护。我已经看到有一种方法可以标记ELF中程序头部写保护的内容。 (RE,RWE,RW-标志)

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

回答

1

是的,你可以使用mprotect

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

std::signal(SIGSEGV, my_segv_handler_func); 

这是做你想要什么,但你不得不增加很多额外的管理黏性物质,使其工作的一个可行办法。例如,这种写入检测是在硬件中完成的,而在x86架构上,您的页面大小为4k。因此,您可以一次保护4k个事物,并在4k边界上对齐 - 而不是通用的“地址X处的起始地址和N个字节”。我相信你要么必须

  1. 有对象来页的映射 ,这样你可以识别 写入到一个页面是否是一个 特殊保护对象的写,或
  2. 滚你自己的malloc始终 上分配4K为边界,这将迫使你要使用的4K

一个 最小alloc'd块大小我不知道把我的头顶部,如果有一个更好的办法,但玩起来听起来很有趣。 :)