Linux系统虚拟文件系统VFS
Linux系统虚拟文件系统VFS是一个抽象层,使得文件、目录、读写访问等概念都成为抽象层概念,这个抽象层被称为虚拟文件系统(VFS)。
每个进程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针,一打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体。
在file结构体中维护File Status Flag(file结构体的成员f_flags)和当前读写位置(file结构体的成员f_pos)。在上图中,进程1和进程2都打开同一文件,但是对应不同的file结构体,因此可以有不同的File Status Flag和读写位置。file结构体还有一个成员f_count,表示引用计数(Reference Count),如果有两个文件描述符指向同一个file结构体,那它的引用计数就是2,当close()一个文件描述符时并不会释放file结构体而是将引用计数减到1,再close一个文件描述符引用计数就会变成0同时再释放file结构体。真正的关闭文件。
每个file结构体都指向了一个file_operations结构体,这个结构体的成员都是函数指针,指向实现各种文件操作的内核函数。例在用户程序中read一个文件描述符,read通过系统调用进入内核,然后找到这个文件描述符指向的file结构体,找到file结构体所指向的file_operations结构体,调用它的read成员所指向的内核函数以完成用户请求。对于同一文件系统上打开的常规文件来说,read、weite等文件操作的步骤和方法应该是一样的,调用的函数应该是相同的,所以图中三个打开文件的file结构体指向同一个file_operation结构体。
如果打开的是非常规文件那就不一样了。每个file结构体都有一个指向dentry结构体的指针,“dentry”是directory entry(目录项)的缩写。我们传给open、stat等函数的参数是一个路径,例如/home/orlion/a,需要根据路径找到文件的inode。为了减少读盘次数,内核缓存了目录的树状结构,称为dentry cache,其中每个节点是一个dentry结构体,只要沿着路径各部分的dentry搜索即可,从根目录/找到home目录,然后找到orlion目录,然后找到文件a。dentry cache只保存最近访问过的目录项,如果要找的目录项在cache中没有,就要从磁盘中读到内存中。
每个dentry结构体都有一个指针指向inode结构体。inode结构体保存着从磁盘inode读上来的信息。上图中有两个dentry,分别表示/home/akaedu/a和/home/akaedu/b,它们都指向同一个inode,说明这两个文件互为硬链接。inode结构体中保存着从磁盘分区的inode读上来信息,例如所有者、文件大小、文件类型和权限位等。每个inode结构体都有一个指向inode_operations结构体的指针,后者也是一组函数指针指向一些完成文件目录操作的内核函数。和file_operations不同,inode_operations所指向的不是针对某一个文件进行操作的函数,而是影响文件和目录布局的函数,例如添加删除文件和目录、跟踪符号链接等,属于同一文件系统的个inode结构体可以指向同一个inode_operation结构体。
inode结构体有一个指向super_block结构体的指针。super_block结构体保存着从磁盘分区的超级快上读来的信息,例如文件系统类型,块大小等。super_block结构体的s_root成员是一个指向dentry的指针,表示这个文件系统的根目录被mount到哪里。
file、dentry、inode、super_block这几个结构体组成了VFS的核心概念。
玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/linux/l5868.html
相关文章 Recommend
- • [上海]招Python量化系统开发工程师
- • macos x中python是默认就有的吗?
- • 问浏览器地址栏如何执行虚拟主机脚本关于环境
- • django-1.x windows环境 Error: 'SafeUnicode' object has no a
- • linux系统 修改include出现问题
- • Python方法获得系统CPU频率及内存占用情况
- • linux + python2 + zsh, unicode编码显示异常
- • linux下多个python版本切换如何设置
- • 文件系统中df -h磁盘命令变成数组格式python方法怎
- • Mac python2.7.3创建虚拟环境提示ImportError: No module
- • Linux控制台终端进行自动处理Web认证方法
- • Linux 系统中nginx是否适合用在工控的嵌入式设备上
必知PYTHON教程 Must Know PYTHON Tutorials
- • python 解释器
- • python idle
- • python dir函数
- • python 数据类型
- • python type函数
- • python 字符串
- • python 整型数字
- • python 列表
- • python 元组
- • python 字典
- • python 集合
- • python 变量
- • python print
- • python 函数
- • python 类定义
- • python import
- • python help
- • python open
- • python 异常处理
- • python 注释
- • python continue
- • python pass
- • python return
- • python global
- • python assert
- • python if语句
- • python break
- • python for循环
- • python while循环
- • python else/elif
- • lambda匿名函数
必知PYTHON模块 Must Know PYTHON Modules
- • os 模块
- • sys 模块
- • re 正则表达式
- • time 日期时间
- • pickle 持久化
- • random 随机
- • csv 模块
- • logging 日志
- • socket网络通信
- • json模块
- • urlparse 解析URL
- • urllib 模块
- • urllib2 模块
- • robotparser 解析
- • Cookie 模块
- • smtplib 邮件
- • Base64 编码
- • xmlrpclib客户端
- • string 文本
- • Queue 线程安全
- • math数学计算
- • linecache缓存
- • threading多线程
- • sqlite3数据库
- • gzip压缩解压
最新内容 NEWS
- • Linux物理内存使用量的查询方法
- • 提升工作效率的Unix操作命令示例
- • 被忽略的Linux系统命令
- • 2017常用Vim编辑命令大全
- • 初学者常用到的Linux进程命令有
- • cat命令合并文件Linux操作方法
- • IPv6协议关闭方法基于linux的操作
- • linux下Eclipse闪退怎么办?
- • PowerShell bash脚本的快速安装方法
- • Linux系统安装及使用calcurse库应用
图文精华 RECOMMEND
-
Linux物理内存使用量的查询方法
-
提升工作效率的Unix操作命令示例
-
2017常用Vim编辑命令大全
-
IPv6协议关闭方法基于linux的操作
-
Linux系统安装及使用calcurse库应用
-
Linux下mdp演示工具的使用方法
热点文章 HOT
- linux下Eclipse闪退怎么办?
- 应聘面试Linux基础问题及答案
- 初学者常用到的Linux进程命令有哪
- Linux系统locate命令使用方法详解
- Linux系统自动备份shell脚本示例
- 功能扩展示例之Cloud9 JavaScript ID
- 2017常用Vim编辑命令大全
- Linux下mdp演示工具的使用方法