参数
to
的时候有个
__user
限定,这个在
~/include/linux/compiler.h
中有如下定义:
# define __user
__attribute__((noderef, address_space(1)))
表示这是一个用户空间的地址,即其指向的为用户空间的内存
大家可能对这个
__attribute__
感到比较迷惑,不过没关系,
google
一下嘛
__attribute__
是
gnu c
编译器的一个功能,它用来让开发者使用此功能给所声明的函数或者变量附加一个属性,以方便编译器进行错误检查,其实就是一个内核检查器。
具体可以参考如下:
http://unixwiz.net/techtips/gnu-c-attributes.html
__user
宏简单告诉编译器(通过 noderef
)不应该解除这个指针的引用(因为在当前地址空间中它是没有意义的)。 不明白什么意义? 有些网友说是为用户空间的, 我自己用了, 用的不是用户空间一样没什么问题.
直接拷贝不了,因为一个是在用户空间,一个是在内核空间
如果要拷贝的话,可使用 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);