保护页以进行读和/或写访问是可能的,因为在页表条目中存在可在内核级开启和关闭的位。有没有一种方法可以保护内存的某些区域不被写访问,比如在C结构中,有某些变量需要写保护,对它们的任何写访问都会触发段错误和核心转储。这就像是在页面级别上工作的缩小的mprotect ()功能,在用户空间的字节级别上有没有类似的机制。
谢谢,Kapil Upadhayay。
发布于 2011-09-21 15:19:36
不,没有这样的设施。如果您需要针对每个数据对象的保护,则必须为每个对象分配至少一个页面(使用mmap
)。如果您还想防止超出对象末尾的访问(对于数组),您可能会分配至少一个超出所需的页,对齐对象,使其在页边界结束,并使用mprotect
来保护您分配的一个或多个附加页。
当然,这种方法会导致程序非常慢并浪费大量资源。除了作为一种调试技术之外,它可能是不可行的,而valgrind可以更有效地满足需求,而不必修改您的程序……
发布于 2011-09-21 15:25:09
一种方法是保护对象所在的整个页面,尽管速度非常慢。每当发生对该页的写入访问时,都会调用针对无效页访问的自定义处理程序,并通过快速取消对该页的保护、写入数据,然后再次保护该页来解决这种情况。
这对单线程程序很有效,我不确定对多线程程序该怎么做。
这个想法可能并不新鲜,因此您也许能够找到一些信息,甚至是它的现成实现。
https://stackoverflow.com/questions/7495922
复制相似问题