get_fs,set_fs使用原理

本文介绍在内核中如何通过get_fs和set_fs来安全地使用系统调用,例如打开和写文件等操作。为了防止内核空间误被当作用户空间处理,文章详细解释了设置内核数据段寄存器的原因及具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家知道在内核中使用有些系统调用(如打开,写文件等操作)需要使用get_fs,set_fs对他们进行保护。具体使用方法如下:

oldfs=get_fs();   

set_fs(KERNEL_DS);   

filp->f_op->write(filp,buf,size,&filp->f_pos);   

set_fs(oldfs);

        只有使用上面的方法,才能在内核中使用open,write等的系统调用。其实这样做的主要原因是open,write的参数在用户空间,在这些系统调用的实现里需要对参数进行检查,就是检查它的参数指针地址是不是用户空间的,即判断地址是不是在3G以下的,如果在3G以上,说明参数为内核空间,系统调用就会返回错误,我们这里以open系统调用为例子:

          它最终会调用下面所示的函数,其中就会对char __user *filename这个用户指针进行判断,如果它不是segment_eq(get_fs(), KERNEL_DS)就需要如上面描述的检查它的指针是不是用户空间指针。内核使用系统调用参数肯定是内核空间,为了不让这些系统调用检查参数所以必须设置  set_fs(KERNEL_DS)才能使用该系统调用

satic int do_getname(const char __user *filename, char *page) {  

int retval;  unsigned long len = PATH_MAX;

 if (!segment_eq(get_fs(), KERNEL_DS)) {

  if ((unsigned long) filename >= TASK_SIZE)    

return -EFAULT;  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值