更详细的介绍可以参考百度文库: https://wenku.baidu.com/view/ae7f2e7576c66137ef061903.html?re=view
在linux内核编程时,进行系统调用(如文件操作)时如果要访问用户空间的参数,可以用set_fs,get_ds等函数实现访问:
get_ds获得kernel的内存访问地址范围(IA32是4GB),
get_fs是取得当前的地址访问限制值。
set_fs是设置当前的地址访问限制值
进程由用户态进入核态,linux进程的task_struct结构中的成员addr_limit也应该由0xBFFFFFFF变为0xFFFFFFFF(addr_limit规定了进程有用户态核内核态情况下的虚拟地址空间访问范围,在用户态,addr_limit成员值是0xBFFFFFFF也就是有3GB的虚拟内存空间,在核心态,是0xFFFFFFFF,范围扩展了1GB)。使用这三个函数是为了安全性。为了保证用户态的地址所指向空间有效,函数会做一些检查工作。如果set_fs(KERNEL_DS),函数将跳过这些检查。
下面是典型用法:
//#define __NO_VERSION__
//#define __KERNEL__
//#define MODULE
#define __KERNEL_SYSCALLS__
#include <linux/uni