__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);