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