所以,我尝试使用它:
abort
我想从copy_to_user(p, q, 0)
复制到q
,如果它不起作用,那么我想知道p
是否指向无效地址。
p
返回未成功复制的字节数,但在这种情况下,有0个字节,我无法确定copy_to_user
是否指向无效地址。
还有另一种方法可以检查p
是否指向有效的用户内存吗?
答案 0 :(得分:0)
是。每次调用copy_to_user()
之前,您需要手动检查传递大小值。如果它在0或不在有效范围内 - 你根本不应该调用copy_to_user()
。这样您就可以依赖copy_to_user()
返回值。
答案 1 :(得分:0)
在/usr/src/linux-3.0.6-gentoo/include/asm-generic/uaccess.h中定义的copy_to_user方法
static inline long copy_to_user(void __user *to,
const void *from, unsigned long n)
{
might_fault();
if (access_ok(VERIFY_WRITE, to, n))
return __copy_to_user(to, from, n);
else
return n;
}
方法access_ok
检查(用户内存)的可访问性。所以你可以使用access_ok方法来检查内存是否有效(在用户空间中不是NULL / it)?
参数VERIFY_READ或VERIFY_WRITE。 VERIFY_READ:标识内存区域是否可读,VERIFY_WRITE:标识内存区域是否可读和可写。 source of method access_ok
答案 2 :(得分:0)
您认为'有效的用户记忆&#39 ;?你需要什么呢?
让我们说我们只关心驻留在用户空间范围内的目标缓冲区(对于具有联合地址空间的拱门)。仅从这一点我们就可以看出,测试没有大小的地址是没有意义的 - 如果地址是用户空间的最后一个字节怎么办?适当/范围/检查由access_ok完成。
第二部分是那里是否有页面,或者可以在不处理页面错误的情况下执行读/写操作。这对你有什么顾虑吗?如果您阅读copy_from /您将看到它执行读/写操作,并且只捕获故障。肯定有KPI来检查目标页面是否可以没有错误地写入,但你需要在你的支票上持有锁(mmap_sem和更多)以及你接下来要做什么,这可能不是你想要的要做。
到目前为止,您似乎正在尝试