get_fs()和set_fs(KERNEL_DS)

getfs()获取当前用户所能访问的最大虚拟内存空间

set_fs()设置用户所能访问的最大虚拟内存空间

在set_fs()中,可以填入参数KERN_DS代表可以访问虚拟内存中内核的地址空间和用户地址空间

在set_fs()中,也可以填入USER_DS代表只能访问虚拟内存中用户地址空间

换句话说,如果设置了KERN_DS,则不会进行有效性检查。

/* 
* The fs value determines whether argument validity checking should be 
* performed or not. If get_fs() == USER_DS, checking is performed, with
* get_fs() == KERNEL_DS, checking is bypassed. 

* For historical reasons, these macros are grossly misnamed. 
*/ 

因此可以看到,fs的值是作为是否进行参数检查的标志。系统调用的参数要求必须来自用户空间。

所以,当在内核中使用系统调用的时候,set_fs(get_ds())改变了用户空间的限制。

即扩大了用户空间范围,因此即可使用在内核中的参数了。

(参考:http://blog.chinaunix.net/space.php?uid=20564848&do=blog&id=74229)

你可能感兴趣的:(user,macros)