linux 2.6.32文件系统 fd与file*之间的关系
给定如下一定情况:
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中的:
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*之间的关系的更多相关文章
- linux 2.6.32文件系统的dentry父子关系
我们知道,linux文件系统,inode和dentry是有对应关系的,dentry是文件名或者目录的一个管理结构,2.6内核中: struct dentry { atomic_t d_count; u ...
- linux 2.6.32文件系统的inode
接上文: crash> struct -xo dentry.d_inode ffff8818118002c0 struct dentry { [ffff8818118002d0] struct ...
- js中的blob,图片base64URL,file之间的关系
js的base64编码和解码 英文是这样的:// atob() 将base64解码 // btoa() 将字符串转码为base64 var str = 'javascript'; window.bto ...
- Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系
更多嵌入式原创文章,请关注公众号:一口Linux 一:文件系统 1. 什么是文件系统? 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统. 通常文件系统是用于存储和组织文件的一 ...
- 【转】linux IO子系统和文件系统读写流程
原文地址:linux IO子系统和文件系统读写流程 我们含有分析的,是基于2.6.32及其后的内核. 我们在linux上总是要保存数据,数据要么保存在文件系统里(如ext3),要么就保存在裸设备里.我 ...
- 深入理解linux系统下proc文件系统内容
深入理解linux系统下proc文件系统内容 内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统. Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它 ...
- 详解Linux磁盘管理与文件系统
磁盘基础 硬盘结构 物理结构 盘片:硬盘有多个盘片,每盘片 2 面. 磁头:每面一个磁头. 数据结构 扇区:磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区. 硬盘的第一个扇区,叫做引导扇区 ...
- 9.1 Linux存储结构和文件系统
1. 存储结构 Linux系统中的一切文件都是从"根"目录(/)开始的,并按照文件系统层次标准(FHS)采用倒树状结构来存放文件,以及定义了常见目录的用途. 目录名称 应放置文件的 ...
- Linux中文件描述符fd和文件指针flip的理解
转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...
随机推荐
- SSL&HTTPS简单介绍
这篇是最近看SSL和HTTPS的一个简单性总结,其中内容大部分都是参考网络上的内容,自己归纳整理了下. SSL介绍 HTTPS介绍 HTTP请求数据工作流程: l 用户在浏览器中输入网址,并告诉浏览 ...
- [电脑知识点]Excel取消受保护视图
- 本地IP,掩码,网关,DNS设置
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Delphi XE5中的新增内容
Delphi XE5中的新增内容 Delphi XE5是所有Delphi开发人员的必须备升级,并且是来自Embarcadero的获奖的.多设备应用开发解决方案的最新版本.使用Delphi XE5的新特 ...
- python 实现排序算法(三)-选择排序和冒泡排序
#/usr/bin/env python #coding:utf-8 #@auther="livermorium" ''' 选择排序 从数据中选择最小值,排在位置首位 再从剩余未排 ...
- python实现排序算法(一)——插入排序算法
''' 插入排序算法 原始数据data 排序数据后数据SortedData,默认是从小打大排序 1.从data第一个元素开始,该元素赋值给SortedData[0],可以认为SortedData已经被 ...
- react 数据管理之state思想指南
react的数据管理库有不少,最常听到的可能是mobx redux altjs之类的,当然还有很多其他,可以自己搜索. 为什么需要数据管理库呢,因为react本身只是为了实现view的表现,而不是数据 ...
- gentoo openrc 开机打印信息
gentoo openrc 开机的时候,最开始 一些硬件的信息, 后面是一些内核和驱动的信息. 硬件的信息是默认保存到 /var/log/dmesg 中, 可以使用 dmesg | less 来查看硬 ...
- webDAV
wiki webDAV client - java https://github.com/lookfirst/sardine https://www.cnblogs.com/xgjblog/p/383 ...
- Linux:DNS服务器搭建及配置
1.yum install -y bind bind-chroot bind-utils 2.编辑DNS主配置文件 vim /etc/named.conf 修改如下标红色处即可: options ...