[英]Generating segfault from a custom syscall
我正在从系统调用中执行copy_to_user()
。
如何在错误时生成段错误或sigbus,就像用户空间试图访问相同的内存一样?
好吧,一般来说,你做不到。 除非你打算重写内核。
当内核访问用户模式地址时,它使用安全表单,通常是copy_from_user
, copy_to_user
, get_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中的其他合适函数)中调用某些东西就是你正在寻找的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.