2012-07-27 43 views
3

我一直在玩一种技术,透明地对内存映射数据进行数据转换。这个想法基本上是为了映射一个想要的文件,并创建一个读/写保护的第二个匿名区域。当用户访问匿名区域时,会捕获生成的段错误,转换数据并更改权限以允许继续进行访问。在系统调用中导致segfault返回到用户信号处理程序?

它工作的很好,但有一点小问题。在没有首先将数据传递给像write()这样的系统调用的情况下传递指针将不会触发segfault处理程序,而只是返回EFAULT,因为未调用处理程序来修复权限。有什么办法可以让系统调用在出现问题时使用用户空间处理程序?

+2

在linux-kernel邮件列表上曾经有一个[建议](https://lkml.org/lkml/1998/8/23/31)为syscalls生成SIGSEGV来解决不一致问题。甚至有一个[示范补丁](https://lkml.org/lkml/1998/8/26/57)。但有些人反对它,因为EFAULT是传统的,有些程序可能实际上正在处理它,而将它们转换为使用信号处理程序将会很困难。那是14年前。也许是时候再试一次。 – 2012-07-27 19:09:30

+0

也许一个补丁允许用户进程启用该行为,同时保持默认返回EFAULT? – 2012-07-27 19:27:11

+0

是的,如果它启用了'prctl',他们可能会接受它。或者如果你不需要你的翻译工作在任意内核上,你就可以破解你的内核。这个14岁的补丁可能不会轻松移植到新的内核上,而且它只是i386,但是它的体积很小,所以也许不会太难再做一次。 – 2012-07-27 19:33:08

回答

3

不,没有办法让系统调用如write在缓冲区错误时作出SIGSEGV。返回EFAULT是系统调用write(2)的语义的一部分。

如果您只关注libc.so,您可能会做LD_PRELOAD;您还可以使用ptrace来捕获系统调用,以便与la strace

另请参阅this answer到您的一个非常类似的问题。

相关问题