【问题标题】:write-protected virtual pages, catch write写保护的虚拟页面,catch write
【发布时间】:2009-01-04 22:14:47
【问题描述】:

有没有办法捕捉写保护页面的写入?

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

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

【问题讨论】:

    标签: linux x86 elf language-implementation


    【解决方案1】:

    是的,您可以使用mprotect

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

    std::signal(SIGSEGV, my_segv_handler_func);
    

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

    1. 有对象到页面的映射 这样您就可以确定是否 写入页面是写入 特定的受保护对象,或
    2. 滚动你自己的malloc,总是 在 4k 边界上分配,这将迫使您使用 最小分配块大小为 4k

    我不知道是否有更好的方法,但玩起来听起来很有趣。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多