Linux __user
linux把操作系统内存和用户区内存隔离开,用户程序只能通过系统调用访问系统功能,内核态可以访问用户内存,但是要做检查,因为用户区内存是不可靠的,甚至是危险的。
__user
就表示这个意思。
这个在~/include/linux/compiler.h中有如下定义:
# define __user __attribute__((noderef, address_space(1)))
__attribute__
是gnu c编译器的一个功能,它用来让开发者使用此功能给所声明的函数或者变量附加一个属性,以方便编译器进行错误检查,其实就是一个内核检查器。
这里表示这个变量必须是非解除参考(no dereference)的,即这个变量地址必须是有效的,而且变量所在的地址空间必须是1,即用户程序空间的。
这里把程序空间分成了3个部分,0表示normal space,即普通地址空间,对内核代码来说,当然就是内核空间地址了。1表示用户地址空间,这个不用多讲,还有一个2,表示是设备地址映射空间,例如硬件设备的寄存器在内核里所映射的地址空间。
因此__user
表示的是一个用户空间的指针,且编译器不应该解除这个指针的引用。