【发布时间】:2010-11-07 11:54:54
【问题描述】:
我正在开发一个内存跟踪库,我们使用mprotect 删除对程序大部分内存的访问,并使用 SIGSEGV 处理程序在程序接触到单个页面时恢复对它们的访问。这在大多数情况下都很有效。
我的问题是,当程序使用我的库标记为不可访问的内存调用系统调用(比如read)时,系统调用只返回-1 并将errno 设置为EFAULT。这会以奇怪的方式改变正在测试的程序的行为。我希望能够在系统调用实际进入内核之前恢复对系统调用的每一页内存的访问。
我目前的方法是为每个涉及内存的系统调用创建一个包装器。在将其交给真正的系统调用之前,每个包装器都会触及所有分配给它的内存。这似乎适用于直接从程序发出的调用,但不适用于 libc 发出的调用(例如,fread 将直接调用 read 而无需使用我的包装器)。有没有更好的方法?怎么可能得到这种行为?
【问题讨论】:
-
这很愚蠢。在给系统调用无效内存时,谁期望 EFAULT 而不是段错误? :P 似乎是系统调用和用户空间函数之间的随机不一致...
标签: linux memory system-calls segmentation-fault