文件系统

本帖意在围绕文件读取对文件系统做简单介绍,用来以后快速回忆,并不会涉及到文件系统的方方面面,如需了解建议翻教材

一个文件由2部分组成:FCB和文件体。

FCB用来记录文件的属性信息,每当存取文件时,先找到其FCB,再找到文件信息盘块号,首块物理位置或索引表就能存取文件信息。

      FCB汇集和组织在一起形成文件目录。文件目录包含许多目录项,2类:描述子目录,描述文件,目录文件永远不会为空,它至少包含2个目录项:"."和".."。文件目录的基本功能是将文件名转换成此文件信息在磁盘上的物理位置。

linux中将FCB中的文件名和其他管理信息分开。其他信息单独组成一个数据结构,成为索引节点inode,此索引节点的位置由inode号表示,于是目录项中仅剩下文件名和inode号,称为基本目录项。

文件系统中每个文件都有一个磁盘inode与之对应,这些inode被集中存放于磁盘的inode区。

linux在系统所占用的内存区开辟了一张内存索引节点表,又称活动inode表,含有100个表项,每个表项称为一个活动inode。当访问文件时,若在活动inode表中找不到其inode,就申请一个空闲活动inode,再把磁盘inode内容复制给它,随之就可用来控制文件读写。当用户关闭文件后,活动inode内容回写到对应的磁盘inode中,再释放活动inode以供它用。

-------------------------------------

磁盘按扇区编号,扇区序列分成三个部分:

1.超级块:1#块。存放文件系统结构和管理信息,如记录inode表所占盘块数,文件数据所占盘块数,内存中登记的空闲盘块数等。既有盘块位示图的功能,又记录整个文件卷的控制数据。

2.索引节点区:2#~(k+1)#块。存放inode表。

3.数据区:(k+2)#~n#块。用作数据区,文件内容保存在这个区域中。磁盘上所有物理块的大小是一样的。如果文件包含超过一个物理块的数据,则文件内容会存放在多个磁盘块中。

---------------------------------------

两个重要的数据结构:

1.用户打开文件表:

  进程pcb结构中保留一个file_struct,称为用户打开文件表或文件描述符表。表项的序号是文件描述符fd,此登记项内登记系统打开文件表的一个入口指针fp,通过此系统打开文件表项链接到打开文件的活动inode。

2.系统打开文件表:

这是为了解决多个进程共享文件,父子进程共享文件而设置的系统数据结构file_struct。由于一个文件可以被多个进程同时打开或者一个进程同时打开多次,这就带来了如何管理文件当前位移的问题,因为每个进程打开文件后进行的操作都未必一样,故文件偏移量也会不同。file记录了当前打开文件的偏移量等数据,由于文件对英语inode,所以一个inode可以连接0个或多个file,而多个file可以对应于同一个inode。内核内存区专门开辟最多可登记256项的系统打开文件表区,每当打开一个文件时,通过一个file把用户打开表的fd与活动inode三者链接起来,以实现数据的访问和共享。

-------------------------------------------

打开文件:建立进程与文件之间的联系

1.存在检查,在检索到指定文件后,就将其磁盘inode复制到活动inode表中。

2.权限检查。

3.为文件分配用户打开文件表项和系统打开文件表项,并为后者设置初值,通过指针建立表项与活动inode之间的联系,再把文件描述符fd返回给调用者。

 

文件读取:

从文件的哪个位置读入数据,或者把数据写入文件的哪个逻辑位置,均由系统打开文件表中的f_offset决定

1.权限合法性

2.按活动inode中的i_data[]指出的文件物理块存放地址,从文件当前位移量f_offset处开始读出所要求的字节数到块设备缓冲区中;然后,在送到bufp指向的用户数据区中。可见,在执行读操作的过程中,一定要用到块设备管理中的读程序

-------------------------------------------

下一节:设备管理

 

posted @ 2019-06-22 21:47  l2c  阅读(741)  评论(0编辑  收藏  举报