struct file是Linux文件系统中的一个重要数据结构,用于表示进程打开的文件,也就是文件对象,struct file是已打开的文件在内存中的表示,存储了与文件操作和状态相关的信息。
通过file对象就可以获取当前文件的目录项和索引节点,通过files_struct这个纽带,就把进程了和文件系统对接起来了。那么文件系统给进程呈现的是什么信息呢?
继续阅读“010 Linux文件系统数据结构详解:文件对象struct file”struct file是Linux文件系统中的一个重要数据结构,用于表示进程打开的文件,也就是文件对象,struct file是已打开的文件在内存中的表示,存储了与文件操作和状态相关的信息。
通过file对象就可以获取当前文件的目录项和索引节点,通过files_struct这个纽带,就把进程了和文件系统对接起来了。那么文件系统给进程呈现的是什么信息呢?
继续阅读“010 Linux文件系统数据结构详解:文件对象struct file”前两篇博客看了超级块和索引节点的数据结构,接下来研究一下目录项dentry的结构。目录项设计的目的是构建完整的目录树,这样可以快速找到文件对应的inode,帮助VFS完成文件操作。具体过程如下:
用户程序在调用open()、stat()、chmod()等函数时,传递文件路径信息到VFS,VFS需要根据文件路径找到对应的inode,所以VFS用文件名和目录项缓存一层一层比对,直到找到对应的目录项,进而获取inode信息。如果在缓存中没有命中,VFS将会新创建文件的inode和对应的目录项,并且持久化到磁盘上。
继续阅读“008 Linux文件系统数据结构详解:目录项dentry”上一篇讲了超级块,超级块存储了文件系统的基础信息,以及文件系统的控制信息。而今天介绍的索引节点数据结构,负责保存文件系统中实际文件一般信息,文件系统使用inode管理文件和目录。与超级块类似,索引节点也有三种形态:
前面几篇文章,介绍了内核虚拟文件系统VFS的一些基本概念,今天开始正式详细介绍几个核心数据结构:超级块super_block、索引节点inode、目录项dentry、文件对象file、挂载点mount和vfsmount。对于文件系统来说,在谈论数据结构时,一般至少要关注三个方面:持久化的结构(磁盘上)、内存中的结构、以及VFS的结构。
Linux有一棵全局文件系统树,文件系统要被用户使用,必须先安装(挂载)到这棵树上。每一次安装被都会生成一个装载实例。每个文件系统装载后,都包含上述提到的四个对象:mount(含vfsmount)、超级块、根inode和根dentry,而文件对象file,是文件系统中文件被进程使用后产生的,可以认为是一个打开的文件。
继续阅读“006 Linux文件系统数据结构详解:超级块super_block”上一篇介绍了虚拟文件系统VFS的基本数据结构,包括:文件系统类型file_system_type、超级块super_block、索引节点inode、目录项dentry和文件对象file。本篇文章着重看一下与进程相关的数据结构,包括files_struct和fs_struct,两者通过task_struct(进程)结构体粘结起来,通过fs_struct可以获取文件系统、挂载点、根dentry等信息,通过files_struct可以打开的文件对象,进而获取目录项、索引节点,最后和物理文件建立联系。
继续阅读“004 虚拟文件系统VFS与进程相关的数据结构”Linux支持多种文件系统,这些具体的文件系统并不是直接都挂载到系统中的,实际上是按需挂载的,这些文件系统只有挂载到系统中,VFS才能够真正管理起来,否则如果只是注册,不会产生任何文件系统实例。
文件系统挂载(安装)后,将会产生多个数据结构实例,挂载过程实际上就是构造这些数据结构实例的过程。Linux在文件系统的设计中,汲取了Unix的设计思想,抽象出四个基本数据结构:超级块(super_block),索引节点(inode),目录项(directory entry)和文件对象(file)