Linux文件引用计数的逻辑

18 篇文章 8 订阅

-v0.1 2019.10.10 Sherlock init

        本文分析现在Linux内核中对打开文件引用计数的处理逻辑,目的是解答一个问题,即对设备文件的操作会不会引用到已经释放的文件上。

        考虑这样一个场景,打开一个字符设备文件/dev/A,得到一个fd,用户态可以对这个fd做相关的文件操作,包括ioctl, mmap, close等,内核如何保证close操作和其他操作的同步,即不会出现close和其他文件并发执行,其他文件访问已经close掉的文件这种情况。

        实际上,内核是靠打开文件的引用计数来保证这一点的。

kernel/fs/open.c
filp_open
  +-> file_open_name
    +-> do_filp_open
      +-> path_openat
        +-> alloc_empty_file
    这里在创建struct file结构的时候会把里面的f_count引用计数设置为1。

kernel/fs/ioctl.c
ksys_ioctl系统调用
  +-> fdget
    +-> __fdget
      在rcu锁里得到file结构的指针
      +-> __fget_light
        +-> __fget
      +-> get_file_rcu_many (atomic_long_add_unless(&(x)->f_count, xx, 0))
          这里只有在f_count非0的时候才会把引用计数加1。如果是0,表明已经file
      的引用计数已经是0。__fget会去files里查fd对应的file。
  +-> fdput
    +-> fput
      +-> fput_many
        +-> atomic_long_dec_and_test(&file->f_count)
    如果减到0,在另一个内核线程中,延迟执行delay_work:
      +-> delayed_fput_work
        +-> delayed_fput
          +-> __fput
            +-> file_free(file)

kernel/fs/open.c
close系统调用
  +-> __close_fd
    +-> spin_lock(&files->file_lock)
    在锁里拿到fd对应的file结构的指针
      +-> filp_close
        +-> fput     
        如上
    +-> spin_unlock(&files->file_lock)

fget(): 根据文件描述符fd得到其对应的struct file结构!并且给struct file结构的f_count引用数+1; 
fput(): 与fget()对应,对f_count进行-1,如果发现f_count为0了,那么将其对应的struct file结构删除! 


原文链接:https://blog.csdn.net/scarecrow_byr/article/details/102537314

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值