先上一张图:
task_struct不用多说,是Linux中的进程描述符;
所谓的inode就是index node,因为ext4,ext2等都是indexed allocation file sysyem;
fs字段指向fs_struct结构体(存储filesystem info),是用来记录这个进程的工作目录pwd,和它的根目录root;显然目录信息是由dentry结构体保存的;在linux中,目录也是一种文件,因此dentry结构体会有指向inode结构体的指针字段d_inode;
file字段指向files_struct结构体,这个结构体是用来记录该进程打开的所有文件的信息;每个打开的文件都会为它建立一个file(图中的files错误)结构体;files_struct结构体中,用fd_array[]数组字段,维护着所有指向file结构体的指针;
而每个被打开的file也有其所在目录f_entry; 所有的operations都是对应目录或是inode或是文件的操作方法;
在linux中打开文件需要知道文件的inode,而inode就是通过dentry来获取的;因此需要拿着dentry去找它下面的文件的inode;
目录也有inode,而目录的inode指向的block中存放的是这个目录下的文件或目录的inode的号码(或位置),如/etc/passwd访问流程:
先通过/的inode号(2号)找到其block,在其block中找到/etc的inode的位置a,通过inode a找到/etc目录文件的block,在其block中又找到/etc/passwd文件的inode位置,就找到了/etc/passwd文件;
为什么要将files_struct分出来,用一个指针指向,而不是放在task_struct中呢?
是为了支持多线程,把file_struct移出来是为了让同一进程内的多个线程可以共享一个file_struct,这样线程1打开的文件,线程2也能看到了;