【发布时间】:2012-07-27 15:27:38
【问题描述】:
我一直在使用一种技术来透明地对内存映射数据进行数据转换。这个想法基本上是内存映射所需的文件,并创建第二个读/写保护的匿名区域。当用户访问匿名区域时,会捕获由此产生的段错误,转换数据并更改权限以允许访问继续进行。
效果很好,但有一个小问题。在没有首先接触数据的情况下将指针传递给像 write() 这样的系统调用不会触发段错误处理程序,而是只返回 EFAULT,因为没有调用处理程序来修复权限。有没有办法让系统调用在出现问题时使用用户空间处理程序?
【问题讨论】:
-
linux-kernel 邮件列表中曾经有一个suggestion 用于为系统调用生成 SIGSEGV 以解决不一致问题。甚至还有一个demonstration patch。但是有些人反对它,因为 EFAULT 是传统的,并且某些程序实际上可能正在处理它,并且将它们转换为使用信号处理程序会很困难。那是14年前的事了。也许是时候再试一次了。
-
也许是一个补丁,允许用户进程启用该行为,同时保持默认返回 EFAULT?
-
是的,如果使用
prctl启用它,也许他们会接受。或者,如果您不需要您的翻译器在任意内核上工作,您可以破解您的。那个有 14 年历史的补丁可能不会轻易移植到新内核,而且它还是 i386-only,但它很小,所以也许再做一次也不会太难。