Linux   发布时间:2022-05-08  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了从自定义系统调用生成段错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在从系统调用中执行copy_to_user().

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

最佳答案
好吧,一般来说,你做不到.除非你打算重写内核.

当内核访问用户模式地址时,它使用安全表单,通常是copy_from_user,copy_to_user,get_user,… – 正如您所提到的那样.这些宏具有内核检查的返回值,并且在大多数情况下将返回-EFAULT.

然后,通常会出现libc并调整返回值以适合手册页 – 这意味着如果结果是错误的,则设置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中的其他合适函数)中调用某些东西是你正在寻找的东西.

大佬总结

以上是大佬教程为你收集整理的从自定义系统调用生成段错误全部内容,希望文章能够帮你解决从自定义系统调用生成段错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。