从自定义系统调用生成段错误

时间:2017-05-29 09:54:31

标签: c linux linux-kernel signals

我在系统调用中做copy_to_user()

如何在出错时生成段错误或sigbus,就像用户空间试图访问同一个内存一样?

1 个答案:

答案 0 :(得分:0)

嗯,一般来说,你不能。除非您计划重写内核。

当内核访问用户模式地址时,它使用安全表单,通常为copy_from_usercopy_to_userget_user,...... - 如您所述。这些宏具有内核检查的返回值,并且在大多数情况下将返回-EFAULT

然后,通常会出现libc并调整返回值以适合man页面 - 这意味着如果结果是错误的,它会设置errno(取决于调用的是哪个系统调用)。

例如,内核中的常见代码段如下:

if (unlikely(copy_from_user(&pos, offset, sizeof(loff_t))))
    return -EFAULT;

(取自sendfile64系统调用在fs / read_write.c的实现)

如您所见,当内核无法从usermode读取时,它将返回-EFAULT

鉴于可以将多个指针传递给某些系统调用,可能无法找出导致-EFAULT的指针。因此,没有一种通用的用户模式方式可以代表内核检查无效内存访问时发送SIGSEGV

但是,如果您自己编写内核系统调用,并且想要触发信号,则根本不困难。我没有在内核中挖掘太多东西,但是在send_sig_info(或者kernel / signal.c中的另一个合适的函数)中调用某些东西就是你正在寻找的东西。