您好,欢迎访问三七文档
FAT文件系统的数据结构中有两个重要的结构:文件分配表和目录项:文件和文件夹内容储存在簇中,如果一个文件或文件夹需要多余1个簇的空间,则用FAT表来秒速如何找到另外的簇。FAT结构用于指出文件的下一个簇,同时也说明了簇的分配状态。FAT12、FAT16、FAT32这三种文件系统的主要区别在于FAT项的大小不同。FAT文件系统的每一个文件和文件夹都被分配到一个目录项,目录项中记录着文件名、大小、文件内容起始地址以及其他一些元数据。在FAT文件系统中,文件系统的数据记录在“引导扇区DBR”中。引导扇区位于整个文件系统的0扇区,是文件系统隐藏区域的一部分,我们称其为DBR(DOSBootRecorder——DOS引导记录)扇区,DBR中记录着文件系统的起始位置、大小、FAT表个数及大小等相关信息。在FAT文件系统中,同时使用“扇区地址”和“簇地址”两种地址管理方式。这是因为只有存储用户数据的数据区使用簇进行管理(FAT12和FAT16的根目录除外),所有簇都位于数据区。其他文件系统管理数据区域是不以簇进行管理的,这部分区域使用扇区地址进行管理。文件系统的起始扇区为0号扇区。FAT32的保留区FAT32文件系统的开始部分有一个由若干扇区组成的保留区,保留区的信息会记录在DBR扇区中,比较常见的为32、34或38个扇区。引导扇区:引导扇区是FAT32文件系统的第一个扇区,也称DBR扇区。包含以下基本信息:·每扇区字节数·每簇扇区数·保留扇区数·FAT表个数·文件系统大小(扇区数)·每个FAT表大小(扇区数)·根目录起始簇号·其他附加信息说明:我们可以通过每个FAT表的大小扇区数乘以FAT的个数得到FAT区域的大小;通过保留扇区数和FAT区域的大小就可以得知数据区的起始位置,也即文件系统第一簇的位置。由根目录的簇号和第一簇的位置就可以得到根目录的位置。引导代码FAT文件系统将引导代码与文件形同数据结构融合在一起,而不像Unix文件系统那样各自存在,引导扇区的前三个字节为一个由机器代码构成的跳转指令,以使CPU越过跟在后面的配置数据跳转到配置数据后面的引导代码处。FAT32文件系统引导扇区的512字节中,90~509字节为引导代码,而FAT12/FAT32则是62~509字节为引导代码。同时,FAT32还可以利用引导扇区后的扇区空间存放附加的引导代码。一个FAT卷即使不是可引导文件文件系统,也会存在引导代码。FSINFO信息扇区FAT32文件系统在保留区中增加了一个FSINFO扇区,用以记录文件系统中空闲簇以及下一可用簇的簇号等信息。FAT32的FAT表位于保留区后的FAT区,有两个完全相同的FAT(文件分配表)组成。说明:1.对于文件系统来说,FAT表有两个重要作用:描述簇的分配状态以及标明文件或目录的下一簇的簇号2.通常情况下,一个FAT文件系统会有两个FAT表,但有时也允许只有一个FAT表,FAT表的具体个数记录在引导扇区的偏移0x10字节处3.由于FAT区紧跟在文件系统保留区后,所以FAT1在文件系统中的位置可以通过引导记录中偏移0x0e~0x0f字节处得保留扇区数得到。4.FAT2紧跟在FAT1之后,它的位置可以通过FAT1的位置加上FAT表的大小扇区数来计算出。FAT表的特性:FAT表由一系列大小相等的FAT表项组成,总的来说FAT表有如下特性:1.FAT32中每个簇的簇地址,是有32bit记录在FAT表中。FAT表中的所有字节位置以4字节为单位并存储特殊标志内容。从2号地址开始,每个地址对应于数据区的簇号,FAT表中的地址编号于数据区中的簇号相同。故我们也称FAT表中的这些地址为FAT表项,FAT表项中记录的值称为FAT表项值。2.当文件系统被创建,也就是进行格式化操作时,分配给FAT区域的空间将会被清空,在FAT1与FAT2的0号表项与1号表项写入特定值。由于创建文件系统的同时也会创建根目录,也就是为根目录分配了一个簇空间,通常为2号簇,所以2号簇对应的2号FAT表项也会被写入一个结束标记。3.如果某个簇未被分配使用,它所对应的FAT表项内的FAT表项值即用0进行填充,表示该FAT表项对应的簇未被分配。4.当某个簇已被分配使用时,则它对应的FAT表项内的FAT表项值也就是该文件的下一存储位置的簇号。如果该文件结束于该簇,则在它的FAT表项中记录的事一个文件结束标记,对于FAT32而言,代表文件结束的FAT表项值为0x0fffffff。5.如果某个簇存在坏扇区,则整个簇会用FAT表项值0xfffffff7标记为坏簇,不再使用,这个坏簇标记就记录在它所对应的FAT表项中。6.由于簇号起始于2号,所以FAT表项的0号表项与1号表项不与任何簇对应。FAT32的0号表项值总是F8FFFF0F。7.1号表项可能被用于记录脏标志,以说明文件系统没有被正常卸载或者磁盘表面存在错误。不过这个值并不重要。正常情况下1号表项的值为FFFFFFFF或FFFFFF0F.8.在文件系统中新建文件时,如果新建的文件只占用一个簇,为其分配的簇对应的FAT表项将会写入结束标记。如果新建的文件不只占用一个簇,则在其所占用的每个簇对应的FAT表项中写入为其分配的下一簇的簇号,在最后一个簇对应的FAT表项中写入结束标记。9.新建目录是,只为其分配一个簇的空间,对应的FAT表项中写入结束标记。当目录增大超过一个簇的大小是,将会在空闲空间中继续为其分配一个簇,并在FAT表中为其建立表链以描述它所占用的簇情况。10.对文件或目录进行操作时,他们所对应的FAT表项将会被清空,设置为0以表示其所对应的簇处于未分配状态。FAT表的使用一个文件的起始簇号记录在它的目录项中,该文件的其他簇号则用一个簇链结构记录在FAT表中。如果要寻找一个文件的下一簇,只需要查看该文件的目录项中所描述的起始簇号所对应的FAT表项,如果该文件只有一个簇,则此处的值为一个结束标记;如果该文件不止一个簇,则此处的值是它的下一个簇的簇号。FAT其他说明:要找一个簇的FAT表项,只要用它的簇号乘以每个FAT表项的字节数即可。文件系统大小的上限取决于FAT项的大小。簇链上的每个FAT项记录着下一个簇的簇地址,FAT项所能表示的数字有一个上限,这个上限值也就是文件系统中的最大簇号。FAT32文件系统的FAT项只使用了3,因此只能描述268435456个簇。FAT32的数据区:数据区时真正用于存放用户数据的区域。数据区紧跟在FAT2之后,被划分成一个个的簇。所有的簇从2开始进行编号。2号簇的起始位置就是数据区的起始位置。1.定位根目录数据区以前的区域只能使用扇区地址(逻辑卷地址),而无法使用簇地址。计算:1从引导扇区的便宜0x0e~0x0f字节处得到保留扇区。2从偏移0x10字节处得到FAT表的个数。3从偏移0x24~0x27字节处得到每个FAT表的大小扇区数,公式:保留扇区数+每个FAT表大小扇区数*FAT表个数=数据区起始扇区号计算某簇起始扇区号:某簇起始扇区号=保留扇区数+每个FAT表大小扇区数*FAT表个数+(该簇簇号-2)*每簇扇区数某簇起始扇区号=FDT+(该簇簇号-2)*每簇扇区数根目录:根目录及其他目录项的基本特性:1.为文件或子目录分配的第一个簇的簇号记录在它的目录项中,其他后续簇则由FAT表中的FAT表链进行跟踪。2.目录项中除记录子目录或文件起始簇号外,还记录它的名字、大小、时间值等信息。3.每个子目录或文件除具有一个端文件目录项外,还会有长文件名目录项。4.短文件名目录项固定占用32字节,长文件名目录项则根据需要占用1个或若干个32字节。5.对于同一个子目录或文件,它的长文件名目录项存放在它的短文件名目录项之前,如果长文件名目录项占用多个32字节,则按倒序存放于段文件名目录项之前。子目录:在FAT32文件系统中,处根目录在创建时即被建立并分配空间外,其他所有的子目录都是在使用过程中根据需要建立的。新建一个子目录时,在其父目录中为其建立目录项,在空闲空间中为其分配一个簇并对该簇进行清零操作,同时将这个簇号记录在它的目录项中。如果在根目录下创建一个子目录,我们就称这个子目录为根目录的子目录,称根目录为这个子目录的父目录。创建子目录时,在为其父目录分配的簇中建立目录项,目录项中描述了这个目录的起始簇号。在为子目录建立目录项的同时,也在为子目录分配的簇中,使用前两个目录项描述它与父目录的关系。目录项:在FAT32文件系统中,根据结构不同可以将目录项大致分为四种:卷标目录项、“.”目录项和“..”目录项、短文件名目录项、长文件名目录项。段文件名目录项是最重要的数据结构,其中存放着有关目录或文件的短文件名、属性、起始簇号、时间值以及内容大小等下信息。在FAT32文件系统中,将子目录看做是一种特殊的文件。
本文标题:FAT文件系统分析
链接地址:https://www.777doc.com/doc-2871462 .html