资料链接:
Linux 内核编程之文件系统(二)
几个关系:
(1)inode索引节点表示文件的信息——每个文件都有一个inode。
(2)dentry目录项表示文件名与inode的对应关系。
(3)一个inode可能对应不止一个dentry结构。
(一)inode索引节点:
一个文件对应的索引节点和超级块对象是唯一的,有多少个文件就有多少个索引节点。
inode结构中几个重要成员:
(1)i_no——索引节点号;
(2)i_dentry——该节点可由多个目录项指向,i_dentry为这些目录项组成的链表的头节点。
(二)dentry目录项:
一个路径的各个组成部分,不管是目录还是普通的文件,都是一个目录项对象。如,在路径/home/source/test.c中,目录 /, home, source和文件test.c都对应一个目录项对象。不同于前面的两个对象,目录项对象没有对应的磁盘数据结构,VFS在遍历路径名的过程中现场将它们逐个地解析成目录项对象。
结构中几个重要成员:
(1)d_inode——为该目录项对应的索引节点指针。
(2)d_count——该目录项的引用计数。
(3)d_parent——指向父目录项。
(4)d_subdirs——如果该目录项是目录,该目录下的所有子目录形成一个链表,该字段是这个链表的表头。
(5)d_child——如果当前目录项是一个目录,那么该目录项通过这个字段加入到父目录的d_subdirs链表当中。这个字段中的next和prev指针分别 指向父目录中的另外两个子目录。
(6)d_alias——索引节点目录项别名链表。索引节点中i_dentry为指向它的所有目录项形成的链表的头节点。当前目录项以d_alias处于i_dentry表中,该字段中的prev和next指针分别指向与该目录项同inode的其他两个(如果有的话)目录项。
(7)d_name——目录项名(文件名)。
(三)inode与dentry的关系:
dentry可以多次指向同一个inode,dentry中的d_count记录了链接的数量。
(四)file文件对象:
文件对象 通过f_path.dentry指针指向相关的目录项对象。目录项会指向相关的索引节点,索引节点会记录文件是否是脏的。
该结构中的几个重要成员:
(1)fu_list——每个文件系统中以被打开的文件都会形成一个双联表,这个双联表的头结点存放在超级块的s_files字段中。该字段的prev和next指针分别指向在链表中与当前文件结构体相邻的前后两个元素.
(2)f_dentry——与该文件对应的dentry。
(3)f_op——指向文件操作函数的指针。
(4)f_count——文件对象的使用计数。
(5)f_pos——文件的当前偏移量。
(五)多个dentry可以指向同一个索引节点;
多个file文件对象可以指向同一个dentry;
多个文件描述符可以共用同一个file文件对象;
一个file对象指向一个dentry——一个dentry指向一个索引节点。
(六)pipe后,父子进程共用两个(读写)文件对象,两个文件对象指向同一个临时索引节点,临时索引节点指向一个物理页面。