gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:59:32 25 4
gpt4 key购买 nike

我正在通过系统调用执行 copy_to_user()

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

最佳答案

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

当内核访问用户模式地址时,它使用安全形式,通常是 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 的实现)

如您所见,当内核无法从用户模式读取时,它会返回 -EFAULT

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


但是,如果您正在自己编写一个内核系统调用,并且您想要触发一个信号,那一点也不难。我没有深入研究内核,但调用 send_sig_info 行中的内容(或 kernel/signal.c 中的另一个合适的函数)正是您要寻找的。

关于c - 从自定义系统调用生成段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44239545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com