(void __user *)arg 中__user的作用

__user宏简单告诉编译器(通过 noderef)不应该解除这个指针的引用(因为在当前地址空间中它是没有意义的)。 

 

(void __user *)arg 指的是arg值是一个用户空间的地址,不能直接进行拷贝等,要使用例如copy_from_user,copy_to_user等函数。

默认是内核空间,因为这是驱动,是在内核空间运行的。

 

直接拷贝不了,因为一个是在用户空间,一个是在内核空间

如果要拷贝的话,可使用 copy_from_user 


假如用户空间写为:

int i = 0;
ioctl(fd, XXXXX, i);


内核空间需要写为

get_user(xxx, (int __user *)arg);


假如用户空间写为:

int i = 0;
ioctl(fd, XXXXX, &i);

则内核空间需要写为:

copy_from_user(xxx, (void __user *)arg, size);

原文地址:https://www.cnblogs.com/zl1991/p/6845751.html