19 组织文件

xuan01 / 2023-05-03 / 原文

文件系统:

把许多文件存储在某一种储存设备上;方便对各种文件执行打开关闭、读写等操作;FAT32、NTFS、Ext4、Btrfs、ZFS、HPFS 等,这些都是不同的文件系统建立的文件系统格式,甚至一个硬盘上不同分区储存格式也不相同;所以让文件系统成为内核的一部分很不现实;

两点设想:文件系统组件是独立的与内核分开;操作系统需要动态加载和删除不同的文件系统组件;

文件系统是一个设备:

文件系统的实现:写好了硬盘驱动程序,就可以让文件系统设备驱动程序处理好了数据,然后发送给硬盘设备驱动程序,让其写入到硬盘中去;

文件格式与储存块:

类Unix和Windows系统中,文件就是一个可以动态增加、减少的线性字节数组; 由于现在的储存设备都是以储存块为单位存储数据的,访问这些设备的最小单位也是一个储存块;

文件系统把文件数据定义为一个动态的线性字节数组,又分成一个个数据块,又因为不同的储存设备的物理存储块大小不一样,我们把数据块定义为文件系统逻辑块,大小为4096字节;最终映射到物理储存块;如下图:

组织文件:

若数以万计的文件不分门别类,查找非常困难;所以采用文件目录组织文件,有层次关系;

文件系统的数据结构:

文件系统元数据:文件系统本身的一些数据结构、文件和目录的数据结构;

设计超级块:

文件系统的超级块/文件系统描述块:包含文件系统标识、版本、状态、存储介质大小、文件系统逻辑存储块大小、位图所在存储块、根目录;

rfssublk_t 结构,包含 rfsdir_t 根目录结构,超级块保存在储存设备的第一个4KB大小的逻辑存储块中,但是本身大小并没有4KB,空闲区间可以用于扩展;

位图:

利用一块储存空间中所有位的状态,达到映射储存块状态(是否已分配)的目的;4KB大小的储存块可以表示 4096 * 8 位;

因为我们只用4MB大小的储存块,有1024个4KB的块,完全可以用一个字节表示一个储存块是否已分配;

文件目录:

rfsdir_t 结构表示目录数据结构,包含一个文件数据管理头的块号,按块访问;还有一个名称数组;

目录类型有四种,空、目录、文件、已删除类型;目录也是一种文件,里面保存着一系列 rfsdir_t 结构变量;

文件管理头:

fimgrhd_t 结构表示一个文件管理头,包含文件的详细信息,其中filblks_t 结构类型的 fmd_fleblk数组表示 文件占用逻辑储存块的数组,每个元素保存一片连续的逻辑储存块,只有32个结构;比如一个文件占用:4~8、10~15、30~40 的逻辑储存块,那么就在 fmd_fleblk[0]中保存 4 和 4,在 fmd_fleblk[1]中保存 10 和 5,在 fmd_fleblk[2]中保存 30 和 10。

同时,当文件特别大,fmd_fleblk 不够用时,可以通过类似链表的形式动态增加 fimgrhd_t 结构;在 fmd_fleblk 数组元素用完时,就再分配一个逻辑储存块,在里面再次存放同一个文件的 fimgrhd_t 结构,让上一个 fimgrhd_t 结构中的 fmd_linknblk 域指向这个逻辑储存块,再让这个逻辑储存块中 fimgrhd_t 结构中的 fmd_linkpblk 域,指向上一个 fimgrhd_t 结构所在的逻辑储存块。

文件的第一个逻辑储存块的首个 512 字节空间中,存放的就是 fimgrhd_t 数据结构。