copy_to_user出现'bad address'错误

时间:2008-09-15 05:20:04

标签: c linux kernel

我正在尝试将自定义结构从内核空间复制到用户空间。在用户空间内errno返回'坏地址'。地址错误的常见原因是什么?

if(copy_to_user(info, &kernel_info, sizeof(struct prinfo)))

3 个答案:

答案 0 :(得分:5)

错误地址错误表示您提供的地址位置无效。有了上面的情况,我猜是因为你传递的是info的副本,而不是指向info内存位置的指针。

查看文档,copy_to_user定义为

copy_to_user(void __user * to, const void * from, unsigned long n);

因此,除非您的info变量是指针,否则我会将您的代码更新为:

if(copy_to_user(&info, &kernel_info, sizeof(struct prinfo)) ) {
    //some stuff here i guess
}

答案 1 :(得分:2)

假设info是一个指针类型,并且该信息指向一个有效的位置,那么信息仍然可能指向一个不在该用户所需的用户空间中的地址。

答案 2 :(得分:-1)

写一个小的char驱动程序时遇到了同样的问题。所有我做错的是函数copy_to_user在失败时返回非零,所以你必须这样做..

if(copy_to_user(void *userbuf, void *kernelbuf, long len))
    return -EFAULT;

// Continue with code..