我阅读了copy_from/to_user
函数的源代码。
似乎他们总是返回 0
。
static inline int copy_from_user(void *to, const void __user volatile *from,
unsigned long n)
{
__chk_user_ptr(from, n);
volatile_memcpy(to, from, n);
return 0;
}
但是,有如下代码检查 copy_from/to_user
的返回值。
if (copy_from_user(&tmp, user, sizeof(tmp)) != 0)
return -EFAULT;
那么我有3个问题。
- 返回非零的
copy_from/to_user
代码定义在哪里? - 是什么导致
copy_from/to_user
返回非零值? - 返回什么值?
最佳答案
我敢肯定您看错了文件; tools/*
不是内核的一部分,而是用户空间工具的源代码。这段代码看起来像是用于链接为用户空间程序中的内核 API 编写的代码的 stub 。
实际的 copy_from/to_user
函数也可能看起来总是返回 0,但据我所知,它们有一些奇特的技巧,链接器部分连接到它们的内联 asm 中,因此当 cpu在复制操作期间捕获访问错误,错误处理程序可以使用伪造的 -EFAULT
返回值在调用者处恢复执行。这些函数的定义是特定于架构的,可能可以在 arch/
树中的某个地方找到。
关于c - copy_from/to_user 何时返回非零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57977023/