保护页面以进行读取和/或写入访问是可能的,因为页面表项中的位可以在内核级别打开和关闭。有没有一种方法可以保护某些内存区域免受写访问,比如说在C结构中有某些需要写保护的变量,对它们的任何写访问都会触发段错误和核心转储。它类似于mprotect()的缩小功能,因为它在页面级别工作,在用户空间的字节级别存在类似事物的机制。
谢谢,Kapil Upadhayay。
答案 0 :(得分:5)
不,没有这样的设施。如果您需要每个数据对象保护,则必须为每个对象分配至少一个页面(使用mmap
)。如果您还希望在对象末尾(对于数组)之外有一些防止访问的保护,那么您可以分配至少比您需要的页面多一个页面,对齐对象使其在页面边界处结束,并使用{{1保护您分配的一个或多个其他页面。
当然,这种方法会导致程序非常慢并浪费大量资源。除了作为调试技术之外,它可能不可行,而valgrind可以更有效地满足这种需求,而无需修改程序......
答案 1 :(得分:4)
一种方法,虽然非常慢,但是要保护对象所在的整个页面。每当对该页面进行写入访问时,都会调用无效页面访问的自定义处理程序,并通过快速取消保护页面,写入数据然后再次保护页面来解决问题。
这适用于单线程程序,我不知道如何处理多线程程序。
这个想法可能并不新鲜,因此您可以找到一些信息,甚至可以找到现成的信息。