给定如下一定情况:

crash> files
PID: TASK: ffff8817facd2100 CPU: COMMAND: "slabtop"
ROOT: / CWD: /
FD FILE DENTRY INODE TYPE PATH
ffff881810117680 ffff880c115a5cc0 ffff881811fa7a78 CHR /dev/null
ffff880af6bf2200 ffff88180c64e440 ffff88180dc02438 REG /dev/shm/zxdfs/moni_sys.log
ffff88180ef619c0 ffff881811a263c0 ffff880c0eabf118 CHR /dev/console
ffff880c9ddbba80 ffff8818014b1540 ffff88100a8117f8 REG /proc/slabinfo---------------请注意,第二列就是对应的file*,第三列就是dentry,第四列就是对应的inode,用来验证

比如对于fd为3,如何快速获取对应的file* 信息?虽然这个命令输出的时候,第二列就是对应的file*,第三列就是dentry,第四列就是对应的inode,但是今天我们通过代码找到的file*是否正确。

对于fd来说,一般会根据 fget_light-->fcheck_files来获取file*,(注意,这里无关fget 还是 fget_light,因为最终都是调用fcheck_files)

结构就是当前进程task中的:

struct files_struct *files = current->files;
然后根据这个files_struct成员,找到fdt指针:
static inline struct file * fcheck_files(struct files_struct *files, unsigned int fd)
{
struct file * file = NULL;
struct fdtable *fdt = files_fdtable(files); if (fd < fdt->max_fds)
file = rcu_dereference(fdt->fd[fd]);
return file;
}

fdt中的fd数组中,就是按照fd下标存放的file*指针,如下:

crash> task
PID: TASK: ffff8817facd2100 CPU: COMMAND: "slabtop" crash> struct task_struct.files ffff8817facd2100
files = 0xffff88130c8bec00
crash> struct fdtable.fd 0xffff88126d2f4900
fd = 0xffff880c976ad000 crash> rd 0xffff880c976ad000
ffff880c976ad000: ffff881810117680 ffff880af6bf2200 .v......."......
ffff880c976ad010: ffff88180ef619c0 ffff880c9ddbba80 ................

所以对于fd为3来说,取到的file*指针就是ffff880c9ddbba80   ,(这个指针也和我们files命令打印的一致)我们来验证一下这个file*指针:

crash> struct file.f_path.dentry ffff880c9ddbba80
f_path.dentry = 0xffff8818014b1540
crash> struct dentry.d_iname 0xffff8818014b1540
d_iname = "slabinfo\000_offset\000ndler.py\000m\000\000\000\000"

d_iname就是对应的文件路径最后一段文件名,说明我们取的file*指针是对了,有了file* 指针,我们就可以将对应的vfs的其他结构全部串起来。

不过需要注意的是,操作这个fdt的时候,需要关注rcu锁,具体可以查看files.txt里面的说明,获取到的file*指针,如果

if (atomic_long_inc_not_zero(&file->f_count))
*fput_needed = 1;

这个满足的话,是需要put的,否则file*指针不能用。也就是说,当file->f_count为0时,是不直接增加计数的,这个和pagecache中的lockless用法一样。

取到的file指针,用rcu保证有效性,然后这个get之后,用file->f_count来保证计数的有效性。

其实,crash中的files命令,除了能快速查看到对应的file*,dentry,inode等,带参数的files 命令还有更多的输出:

crash> files -d ffff8818014b1540
DENTRY INODE SUPERBLK TYPE PATH
ffff8818014b1540 ffff88100a8117f8 ffff880c1188cc00 REG /.root_tmpfs/proc/slabinfo

具体可以hlep files 来验证。

linux 2.6.32文件系统 fd与file*之间的关系的更多相关文章

  1. linux 2.6.32文件系统的dentry父子关系

    我们知道,linux文件系统,inode和dentry是有对应关系的,dentry是文件名或者目录的一个管理结构,2.6内核中: struct dentry { atomic_t d_count; u ...

  2. linux 2.6.32文件系统的inode

    接上文: crash> struct -xo dentry.d_inode ffff8818118002c0 struct dentry { [ffff8818118002d0] struct ...

  3. js中的blob,图片base64URL,file之间的关系

    js的base64编码和解码 英文是这样的:// atob() 将base64解码 // btoa() 将字符串转码为base64 var str = 'javascript'; window.bto ...

  4. Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系

    更多嵌入式原创文章,请关注公众号:一口Linux 一:文件系统 1. 什么是文件系统? 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统. 通常文件系统是用于存储和组织文件的一 ...

  5. 【转】linux IO子系统和文件系统读写流程

    原文地址:linux IO子系统和文件系统读写流程 我们含有分析的,是基于2.6.32及其后的内核. 我们在linux上总是要保存数据,数据要么保存在文件系统里(如ext3),要么就保存在裸设备里.我 ...

  6. 深入理解linux系统下proc文件系统内容

    深入理解linux系统下proc文件系统内容 内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统. Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它 ...

  7. 详解Linux磁盘管理与文件系统

    磁盘基础 硬盘结构 物理结构 盘片:硬盘有多个盘片,每盘片 2 面. 磁头:每面一个磁头. 数据结构 扇区:磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区. 硬盘的第一个扇区,叫做引导扇区 ...

  8. 9.1 Linux存储结构和文件系统

    1. 存储结构 Linux系统中的一切文件都是从"根"目录(/)开始的,并按照文件系统层次标准(FHS)采用倒树状结构来存放文件,以及定义了常见目录的用途. 目录名称 应放置文件的 ...

  9. Linux中文件描述符fd和文件指针flip的理解

    转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...

随机推荐

  1. Jmeter(三十九)User.Properties定义全局变量

    “烟”从物质上满足吸烟者对尼古丁的依赖,但“烟”更从精神上满足了人们对“思想”的欲望---在抽烟的时刻,每个男人都可能成为思想家. ---<冲突> 前面有记到jmeter读取外部文件内容的 ...

  2. SQL-sqlHelper001

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  3. SAS 通过逻辑库引用名实现相关联

    SAS逻辑库是可以有多个物理位置的 下面的代码示例给出了下定义多个物理位置的SAS逻辑库Y2014. 这3段代码都能实现将逻辑库引用名:Y2014与4个物理位置: e:\sas\data\Quater ...

  4. sas transpose 代码备忘

    OPTIONS NOCENTER LS=MAX PS=MAX; LIBNAME S '.\report';/*PROC PRINT DATA=S.doquestionr(WHERE=(sid=1972 ...

  5. 可变卷积Deforable ConvNet 迁移训练自己的数据集 MXNet框架 GPU版

    [引言] 最近在用可变卷积的rfcn 模型迁移训练自己的数据集, MSRA官方使用的MXNet框架 环境搭建及配置:http://www.cnblogs.com/andre-ma/p/8867031. ...

  6. String,StringBuilder和StringBuffer区别

    String字符串常量 StringBuilder 字符串变量(非线程安全) StringBuffer  字符串变量(线程安全) 1.String String是字符串常量,为不可改变对象 Strin ...

  7. C语言:冒泡排序

    void sort(int arr[],int len) { ; ; i<len; i++) { printf("第%d轮:\n", i); // len-i+1:新轮比上轮 ...

  8. Maven依赖下载速度慢,不用怕,这么搞快了飞起

    一.背景 众所周知,Maven对于依赖的管理让我们程序员感觉爽的不要不要的,但是由于这货是国外出的,所以在我们从中央仓库下载依赖的时候,速度如蜗牛一般,让人不能忍,并且这也是大多数程序员都会遇到的问题 ...

  9. js常用内置对象

    数组Array 1创建方式 var colors = ['red','color','yellow']; var colors2 = new Array(); 2数组的赋值 var arr = []; ...

  10. layer.js关闭子窗口及刷新父窗口

    在需要layer.js弹窗口时,当编辑完窗口内容,需要关闭及刷新父窗口时: $("#senddata").click(function(){var id = $('input[na ...