来自copy_to_user的'错误的地址'错误

我正在尝试从内核空间复制到用户空间的自定义结构。 内部用户空间errno返回“不良地址”。 错误的地址错误的通常原因是什么?

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

错误地址错误意味着您提供的地址位置无效。 在上面的情况下,我猜测这是因为你传递的是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 } 

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

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

 if(copy_to_user(void *userbuf, void *kernelbuf, long len)) return -EFAULT; // Continue with code..