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

上面这个对我们驱动开发人员应该是最熟悉的,也是必须掌握的了。

字段 描述
owner   用于指定拥有这个文件操作结构体的模块,通常取THIS_MODULE;  
llseek   用于设置文件的偏移量。第一个参数指明要操作的文件,第二个参数为偏移量,第三个参数为开始偏移的位置(可取SEEK_SET,SEEK_CUR和SEEK_END之一)。  
read   从文件中读数据。第一个参数为源文件,第二个参数为目的字符串,第三个参数指明欲读数据的总字节数,第四个参数指明从源文件的某个偏移量处开始读数据。由系统调用read()调用;  
write   往文件里写数据。第一个参数为目的文件,第二个参数源字符串,第三个参数指明欲写数据的总字节数,第四个参数指明从目的文件的某个偏移量出开始写数据。由系统调用write()调用;  
mmap   将指定文件映射到指定的地址空间上。由系统调用mmap()调用;  
open   打开指定文件,并且将这个文件和指定的索引结点关联起来。由系统调用open()调用;  
release   释放以打开的文件,当打开文件的引用计数(f_count)为0时,该函数被调用;  
fsync()   文件在缓冲的数据写回磁盘;  
四、进程与这四者之间的关系

内核中用于管理进程的结构体是task_struct。
进程打开文件就涉及到上述4个重要的数据结构:

file fs_struct files_struct namespace

每个进程都有自己的namespace。

fs_struct用于表示进程与文件系统之间的结构关系,比如当前的工作目录,进程的根目录等等。

files_struct 用于表示当前进程打开的文件。

而对于每一个打开的文件,由file对象来表示。

Linux中,常常用文件描述符(file descriptor)来表示一个打开的文件,这个描述符的值往往是一个大于或等于0的整数。
而这个整数,其实就是在files_struct中file数组fd的下标。
对于所有打开的文件, 这些文件描述符会存储在open_fds的位图中。

进程与超级块、文件、索引结点、目录项的关系

从图中可知:

进程通过task_struct中的一个域files->files_struct 来了解它当前所打开的文件对象;而我们通常所说的文件描述符其实是进程打开的文件对象数组的索引值。

文件对象通过域f_dentry找到它对应的dentry对象,再由dentry对象的域d_inode找到它对应的索引节点(通过索引节点又可以得到超级块的信息,也就可以得到最终操作文件的方法,在open文件的时候就是使用这样一个过程),这样就建立了文件对象与实际的物理文件的关联。

文件对象所对应的文件操作函数列表是通过索引节点的域i_fop得到的,而i_fop最终又是通过struct super_operations *s_op来初始化的。

VFS文件系统中的inode和dentry与实际文件系统的inode和dentry有一定的关系,但不能等同。

真实磁盘文件的inode和dentry是存在于物理外存上的,但VFS中的inode和dentry是存在于内存中的,系统读取外存中的inode和dentry信息进行一定加工后,生成内存中的inode和dentry。

虚拟的文件系统也具有inode和dentry结构,只是这是系统根据相应的规则生成的,不存在于实际外存中。

五、磁盘与文件系统

假设一块磁盘被分为好几个分区,每个分区都是不同的文件系统。

磁盘与文件系统

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssgzj.html