【问题标题】:Causing segfault in system call to return to user signal handler?导致系统调用中的段错误返回到用户信号处理程序?
【发布时间】:2012-07-27 15:27:38
【问题描述】:

我一直在使用一种技术来透明地对内存映射数据进行数据转换。这个想法基本上是内存映射所需的文件,并创建第二个读/写保护的匿名区域。当用户访问匿名区域时,会捕获由此产生的段错误,转换数据并更改权限以允许访问继续进行。

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

【问题讨论】:

  • linux-kernel 邮件列表中曾经有一个suggestion 用于为系统调用生成 SIGSEGV 以解决不一致问题。甚至还有一个demonstration patch。但是有些人反对它,因为 EFAULT 是传统的,并且某些程序实际上可能正在处理它,并且将它们转换为使用信号处理程序会很困难。那是14年前的事了。也许是时候再试一次了。
  • 也许是一个补丁,允许用户进程启用该行为,同时保持默认返回 EFAULT?
  • 是的,如果使用prctl 启用它,也许他们会接受。或者,如果您不需要您的翻译器在任意内核上工作,您可以破解您的。那个有 14 年历史的补丁可能不会轻易移植到新内核,而且它还是 i386-only,但它很小,所以也许再做一次也不会太难。

标签: c linux


【解决方案1】:

不,当缓冲区错误时,没有办法让像write 这样的系统调用产生SIGSEGV。 Return EFAULTwrite(2) 系统调用语义的一部分。

如果只关心libc.so,你可能会做LD_PRELOAD的事情;你也可以使用ptrace 来捕获系统调用,比如strace

另请参阅this answer 以了解您的一个非常相似的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多