copy_to_user 错误

函数原型:
copy_to_user(),其在内核的原型是:

unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
 {
      if (access_ok(VERIFY_WRITE, to, n))
           n = __copy_to_user(to, from, n);
      return n;
 }

其功能是将内核空间的内容复制到用户空间,所复制的内容是从from来,到to去,复制n个位。
其返回值标识有多少个未能复制完成。
在处理问题过程中,发现通过copy_to_user无法正确的将kernel space的数据copy到user space

source code如下
if(copy_to_user((uint8_t __user*)(arg+12), p->serial_number, strlen(p->serial_number)))
{
return -EFAULT;
}
将kernel space中的p->serial_number copy到arg+12的偏移位置


测试code如下
unsigned char *serial = "sda";
..........
int main(int argc, char **argv)
{
........
if(ioctl(fd, MU_IOCTL_STATUS, serial)<0)
{
printf("get serial number fail\n");
}
........


}


问题分析如下:
user spac中传递到kernel space的参数是指针 serial,且该指针只在初始化时分配了3个byte,用于存储"sda", 但是kernel 

space里是将p->serial_number copy到arg+12的位置,arg+12位置在user space是一个未知的位置,因此copy动作失败。



你可能感兴趣的:(Linux)