文件系统需要达到两个目的:地址独立和地址保护。地址独立就是一个文件在产生的时候无须担心其存放的磁盘地址,即文件数据的产生与文件将来存放的磁盘地址相互独立。而地址保护则需要对文件的访问进行一定的限制,即不是任何人都可以访问任何文件的。
文件内容的组织有两种:关系导向型组织和非关系导向型组织。
关系导向型文件内容的组织形式
非关系导向型文件内容的组织形式不考虑数据里面的任何结构。对于此种方式来说,数据就是一个数据流,没有记录,没有关系。这个数据流既可以是字位流,也可以是字节流,也可以是数据块流。它们之间的不同就是这个“流”的单位不同
关系导向型组织方式的缺陷:文件系统需要知道数据的很多细节,这将使得文件系统复杂。这种复杂性带来了两个巨大的负面效应:一是文件系统本身的设计将更为费时、费力;二是一个文件不能在另一个文件系统下被访问,因为另一个文件系统的记录格式可能不同。这样势必造成文件可靠性和兼容性存在问题。更关键的是,这些细节不是文件系统的责任范围,而是应用软件或用户的职责范围。因为这些细节直接涉及文件里面数据的语义。前面说过,文件系统的目的是让磁盘更加容易使用,而不是为用户管理数据的语义,即这种管理语义的能力超出了文件系统设计的初衷。
文件分为3种:目录、一般文件、块文件
目录是记录文件的文件,即它的内容是关于别的文件。
一般文件来说,可以分为两种文件:文本文件和二进制文件。
块文件关于输入输出设备的。具体来说,块文件模拟的是输入输出,或者说是为输入输出提供的一个抽象。
魔数:用来告诉操作系统这个文件的类型的。对于可执行文件来说,这个魔数有一个固定的值。如果不是这个值,则该文件不能被执行。
文件的访问类型只有两种:顺序访问和随机访问
常见的文件属性
临时文件标志用来指示该文件为临时创建的,用来存放中间结果,在创建该文件的进程结束后,该文件将被删除。
●锁标志用来指示该文件是否已上锁。为1时表明该文件当前被某个进程锁定,其他进程将不能打开该文件。利用对文件上锁,两个进程可以进行同步。
●记录长度、关键字位置、关键字长度几个属性针对的是记录流文件。对于字节流文件组织方式来说,这些属性是没有的。
●最后修改时间、最后访问时间等属性经常由备份软件用来判断是否是差分增量。
文件夹:是一个数据结构记录每个文件在磁盘上的地址
根目录:根目录是一个文件系统的总起点,它在操作系统启动的时候加载到内存。从根目录开始,该文件系统里面的所有文件都可以找出来。由于根目录是整个文件系统的源点,如果根目录损坏,则整个文件系统都无法访问,也就说文件系统已经崩溃。
内存映射的文件:把需要访问的文件映射到一个进程的虚拟地址内。这样,访问该虚拟地址就相当于访问文件。这样文件访问就变成内存访问。
必须分区的理由:因为计算机的内存字长度通常有限,而磁盘地址需要存放在内存字里面。这样,操作系统能够访问的磁盘地址数量就是一个有限数。如果使用分区,则可以将磁盘分解为大小为32MB的多个分区,这样整个磁盘就都可以被访问到。
第0个扇面存放的是主引导记录(Master Boot Record,MBR)。该记录的内容是一个小小的程序,用来启动计算机。在MBR后面紧接着的是磁盘分区表。磁盘分区表里给出的是磁盘的所有分区及其开始和终结地址,其中一个分区为主分区。操作系统就装载在这个分区中。主分区里面最前面的是引导记录(BootRecord)
在计算机启动时,处于主板ROM里面的BIOS程序首先运行。BIOS在进行一些基本的系统配置扫描后对磁盘的扇面0进行读操作,将MBR里面的程序读到内存并运行。MBR程序接下来找到系统主分区,并将主分区里面的Boot Record加载并运行。Boot Record里面的内容是一个小程序,该程序将负责找到操作系统映像,并加载到内存,从而启动操作系统。所有的文件系统都必须按照这种格式存放,操作系统才能正常启动。
在通常情况下,紧接着引导记录后面的是一个超级数据块(SuperBlock),该块里面存放的是关于该文件系统的各种参数,如文件系统类型、文件系统数据块尺寸等。在Super Block后面则是磁盘的自由空间,其后面是I-NODE区,再后面是文件系统根目录区。分区的最后存放的是用户文件和文件夹区。
文件系统的布局
非连续空间存放方式:在每个数据块里面留出一个指针的空间,用来存放下一个数据块所在的地址。这样一个数据块连着一个数据块,从最前面的数据块开始就可以顺着指针找到所有的数据块
FAT:存放文件数据块指针的表称为文件分配表(File Allocation Table,FAT)
FAT文件系统:使用FAT机制的文件系统称为FAT文件系统。而FAT文件系统又有FAT12、FAT16、FAT32 3种。这3种的区别在于用来表示磁盘地址的内存字位数。如果用12位来表示磁盘地址,则是FAT12,用16位就是FAT16。不过FAT32却并不是使用32位内存字位来表示磁盘地址,而是28位。但因为28听上去不像32那样像2的指数次方,所以把它叫做FAT32。
索引文件组织:果能够将每个文件的所有数据块的磁盘地址收集起来,集中放在一个索引数据块里,而在文件打开时将该数据块加载到内存,以后访问任何一个数据块都可以从该索引数据块里面获得物理磁盘地址。这样,内存里面存放的只是我们需要使用的文件的数据块的所有地址,而不是各种不相干的文件的地址全部一次加载到内存。
索引数据块称为I-NODE, I-NODE举例
非对称多级索引组织:索引既可以是单级,也可以是多级。到底是单级还是多级取决于文件的大小。所有的文件都有一个顶级索引节点(I-NODE)。不过这里比较特别的是该NODE里面的指针域被分为两个部分:一部分用来存放数据块所在的磁盘地址;另一部分用来存放次级I-NODE的地址。这样,如果文件尺寸较小,其所占数据块数没有超过I-NODE里面分配的数据块指针数,则其数据块磁盘地址全部存放在顶级I-NODE上。
文件缓存:将文件里面经常要访问的内容存放在缓存里,使得文件的访问可以在缓存满足,而无须到磁盘上去读写。这种缓冲称为文件缓存。
访问控制表:这张表存放在内核空间,对于每个文件每个具有访问权限的用户设置一个记录。该记录记载着用户ID和具体的访问权限,如读、写、执行、拷贝等。
能力表:这张表为所有该用户具有访问权限的文件设置一个记录。该记录记载着文件名和具体的访问权限,如读、写、执行、拷贝等。例如,<file2 R,file3 RW>代表该用户对文件file2有读的权限,对file3有读写的权限。而凡是不在这张表上的文件该用户将不具备访问资格。
能力表的优缺点:能力表的优点是效率高。如果用户要访问的文件是能力表所指向的文件,则无须进行任何检查。其次,能力表有较好的封装性。用户和他所能够访问的文件存放在同一个列表中。而缺点则是删除文件对象困难。如果要禁止所有用户对某个文件的访问,则需要对所有用户的能力表进行遍历。
保护域:保护域就是将访问控制权限一样的文件和对象组织成同一个域。而访问控制权限与每个域直接相关。每个域的控制独立于其他域。每个进程都运行在一定的域里,从而具有访问该域里面文件和对象的权限。
其他文件安全措施:
1.加密,根据某个给定算法和参数(密钥)对数据进行转换,使得转换后的数据无法辨认。要想正常阅读文件的内容,则需要先进行解密。
2.隐写文件或隐写文件系统(crypt file sys-tems),隐写就是将要保护的数据嵌入到其他文件中而达到隐身的目的。
3.数据隐藏,将数据隐藏起来,使得病毒或者试图进行非法访问的人无法看到数据,甚至无法得知数据的存在。
建立一个新的文件需的操作:1)建立文件的I-NODE,将I-NODE写入磁盘。2)将I-NODE的磁盘地址和文件名写入该文件所属文件夹里。
文件系统优化方法:将经常访问的内容置于缓存里。减少磁盘访问时磁臂移动的距离。提前将需要的数据块读入内存。