📄 硬盘fat文件系统原理的详细分析_存储在线dostor_com.htm
字号:
src="硬盘FAT文件系统原理的详细分析_存储在线Dostor_com_files/1693.gif"
border=0></P>
<P><STRONG>
</STRONG>根据上边图例,我们来讨论DBR各字节的参数意义。</P>
<P><STRONG>
</STRONG>MBR将CPU执行转移给引导扇区,因此,引导扇区的前三个字节必须是合法的可执行的基于x86的CPU指令。这通常是一条跳转指令,该指令负责跳过接下来的几个不可执行的字节(BPB和扩展BPB),跳到操作系统引导代码部分。</P>
<P><STRONG>
</STRONG>跳转指令之后是8字节长的OEM<I></I> ID,它是一个字符串,<I></I> OEM<I></I> ID标识了格式化该分区的操作系统的名称和版本号。为了保留与MS-DOS的兼容性,通常Windows<I></I> 2000格式化该盘是在FAT16和FAT32磁盘上的该字段中记录了“MSDOS<I></I> 5.0”,在NTFS磁盘上(关于ntfs,另述),Windows<I></I> 2000记录的是“NTFS”。通常在被Windows<I></I> 95格式化的磁盘上OEM<I></I> ID字段出现“MSWIN4.0”,在被Windows<I></I> 95<I></I> OSR2和Windows<I></I> 98格式化的磁盘上OEM<I></I> ID字段出现“MSWIN4.1”。</P>
<P><STRONG>
</STRONG>接下来的从偏移0x0B开始的是一段描述能够使可执行引导代码找到相关参数的信息。通常称之为BPB(BIOS<I></I> Parameter<I></I> Block),BPB一般开始于相同的位移量,因此,标准的参数都处于一个已知的位置。磁盘容量和几何结构变量都被封在BPB之中。由于引导扇区的第一部分是一个x86跳转指令。因此,将来通过在BPB末端附加新的信息,可以对BPB进行扩展。只需要对该跳转指令作一个小的调整就可以适应BPB的变化。图9已经列出了项目的名称和取值,为了系统的研究,针对图8,将FAT32分区格式的BPB含义和扩展BPB含义释义为表格,见表4和表5。</P>
<P align=center><IMG alt=""
src="硬盘FAT文件系统原理的详细分析_存储在线Dostor_com_files/1694.gif"
border=0></P>
<P><STRONG>
</STRONG>DBR的偏移0x5A开始的数据为操作系统引导代码。这是由偏移0x00开始的跳转指令所指向的。在图8所列出的偏移0x00~0x02的跳转指令"EB<I></I> 58<I></I> 90"清楚地指明了OS引导代码的偏移位置。jump<I></I> 58H加上跳转指令所需的位移量,即开始于0x5A。此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。大多数的资料上都说win98,构建于fat基本分区上的win2000,winxp所使用的DBR只占用基本分区的第0扇区。他们提到,对于fat32,一般的32个基本分区保留扇区只有第0扇区是有用的。实际上,以FAT32构建的操作系统如果是win98,系统会使用基本分区的第0扇区和第2扇区存储os引导代码;以FAT32构建的操作系统如果是win2000或winxp,系统会使用基本分区的第0扇区和第0xC扇区(win2000或winxp,其第0xC的位置由第0扇区的0xAB偏移指出)存储os引导代码。所以,在fat32分区格式上,如果DBR一扇区的内容正确而缺少第2扇区(win98系统)或第0xC扇区(win2000或winxp系统),系统也是无法启动的。如果自己手动设置NTLDR双系统,必须知道这一点。</P>
<P><STRONG>
</STRONG>DBR扇区的最后两个字节一般存储值为0x55AA的DBR有效标志,对于其他的取值,系统将不会执行DBR相关指令。上面提到的其他几个参与os引导的扇区也需以0x55AA为合法结束标志。</P>
<P><STRONG>
FAT16<I></I> DBR:</STRONG></P>
<P><STRONG>
</STRONG>FAT32中DBR的含义大致如此,对于FAT12和FAT16其基本意义类似,只是相关偏移量和参数意义有小的差异,FAT格式的区别和来因,以后会说到,此处不在多说FAT12与FAT16。我将FAT16的扇区参数意义列表。感兴趣的朋友自己研究一下,和FAT32大同小异的。</P>
<P align=center><IMG alt=""
src="硬盘FAT文件系统原理的详细分析_存储在线Dostor_com_files/1695.gif"
border=0></P>
<P align=center><IMG alt=""
src="硬盘FAT文件系统原理的详细分析_存储在线Dostor_com_files/1711.gif"
border=0></P>
<P><FONT color=#0000ff><STRONG><FONT
color=#000000>
</FONT></STRONG>4.2<I></I> <I></I> 关于保留扇区</FONT></P>
<P><STRONG>
</STRONG>在上述FAT文件系统DBR的偏移0x0E处,用2个字节存储保留扇区的数目。所谓保留扇区(有时候会叫系统扇区,隐藏扇区),是指从分区DBR扇区开始的仅为系统所有的扇区,包括DBR扇区。在FAT16文件系统中,保留扇区的数据通常设置为1,即仅仅DBR扇区。而在FAT32中,保留扇区的数据通常取为32,有时候用Partition<I></I> Magic分过的FAT32分区会设置36个保留扇区,有的工具可能会设置63个保留扇区。</P>
<P><STRONG>
</STRONG>FAT32中的保留扇区除了磁盘总第0扇区用作DBR,总第2扇区(win98系统)或总第0xC扇区(win2000,winxp)用作OS引导代码扩展部分外,其余扇区都不参与操作系统管理与磁盘数据管理,通常情况下是没作用的。操作系统之所以在FAT32中设置保留扇区,是为了对DBR作备份或留待以后升级时用。FAT32中,DBR偏移0x34占2字节的数据指明了DBR备份扇区所在,一般为0x06,即第6扇区。当FAT32分区DBR扇区被破坏导致分区无法访问时。可以用第6扇区的原备份替换第0扇区来找回数据。</P>
<P><FONT color=#0000ff><STRONG><FONT
color=#000000>
</FONT></STRONG>4.3<I></I> <I></I> FAT表和数据的存储原则</FONT></P>
<P><STRONG>
</STRONG>FAT表(File<I></I> Allocation<I></I> Table<I></I> 文件分配表),是Microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。假如把磁盘比作一本书,FAT表可以认为相当于书中的目录,而文件就是各个章节的内容。但FAT表的表示方法却与目录有很大的不同。</P>
<P><STRONG>
</STRONG>在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。</P>
<P><I></I><STRONG> ★存储过程假想:</STRONG></P>
<P><STRONG>
</STRONG>我们模拟对一个分区存储数据的过程来说明FAT文件系统中数据的存储原则。</P>
<P><STRONG>
</STRONG>假定现在有一个空的完全没有存放数据的磁盘,大小为100KB,我们将其想象为线形的空间地址。为了存储管理上的便利,我们人为的将这100KB的空间均分成100份,每份1KB。我们来依次存储这样几个文件:A.TXT(大小10KB),B.TXT(大小53.6KB),C.TXT(大小20.5KB)。</P>
<P><STRONG>
</STRONG>最起码能够想到,我们可以顺序的在这100KB空间中存放这3个文件。同时不要忘了,我们还要记下他们的大小和开始的位置,这样下次要用时才能找的到,这就像是目录。为了便于查找,我们假定用第1K的空间来存储他们的特征(属性)。还有,我们设计的存储单位是1KB,所以,A.TXT我们需要10个存储单位(为了说明方便,我们把存储单位叫做“簇”吧。也能少打点字,呵呵。),B.TXT需要54个簇,C.TXT需要21个簇。可能有人会说B.TXT和C.TXT不是各自浪费了不到1簇的空间吗?干嘛不让他们紧挨着,不是省地方吗?我的回答是,如果按照这样的方式存储,目录中原本只需要记下簇号,现在还需要记下簇内的偏移,这样会增加目录的存储量,而且存取没有了规则,读取也不太方便,是得不偿失的。</P>
<P><STRONG>
</STRONG>根据上面所说的思想,我们设计了这样的图4.3.1所示的存储方式。</P>
<P align=center><IMG alt=""
src="硬盘FAT文件系统原理的详细分析_存储在线Dostor_com_files/1696.gif"
border=0></P>
<P><STRONG>
</STRONG>我们再考虑如何来写这三个文件的目录。对于每个文件而言,一定要记录的有:文件名,开始簇,大小,创建日期、时间,修改日期、时间,文件的读写属性等。这里大小能不能用结束簇来计算呢?一定不能,因为文件的大小不一定就是整数个簇的大小,否则的话像B.TXT的内容就是54KB的内容了,少了固然不行,可多了也是不行的。那么我们怎么记录呢?可以想象一下。为了管理上的方便,我们用数据库的管理方式来管理我们的目录。于是我把1KB再分成10份,假定开始簇号为0,定义每份100B的各个位置的代表含义如图4.3.2</P>
<P align=center><IMG alt=""
src="硬盘FAT文件系统原理的详细分析_存储在线Dostor_com_files/1697.gif"
border=0></P>
<P><STRONG>
</STRONG>这样设计的结构绝对可以对文件进行正确的读写了。接着让我们设计的文件系统工作吧。先改动个文件,比如A.TXT,增加点内容吧!咦?增加后往哪里放呀,虽然存储块的后面有很多空间,但紧随其后B.TXT的数据还顶着呢?要是把A.TXT移到后边太浪费处理资源,而且也不一定解决问题。这个问题看来暂时解决不了。</P>
<P><STRONG>
</STRONG>那我们换个操作,把B.txt删了,b.txt的空间随之释放。这时候空间如图4.3.3,目录如图4.3.4</P>
<P align=center><IMG alt=""
src="硬盘FAT文件系统原理的详细分析_存储在线Dostor_com_files/1698.gif"
border=0></P>
<P><STRONG>
</STRONG>这个操作看来还可以,我们接着做,在存入一个文件D.txt(大小为60.3KB),总共100簇的空间只用了31簇,还有68簇剩余,按说能放下。可是?往那里放呢?没有61个连续的空间了,目录行没办法写了,看来无连续块存储暂时也不行。</P>
<P><STRONG>
</STRONG>你一定能够想到我们可以在连续空间不够或增加文件长度的时候转移影响我们操作的其他文件,从而腾出空间来,但我要问你,那不是成天啥也不要干了,就是倒腾东西了吗?</P>
<P><STRONG>
</STRONG>看来我们设计的文件系统有致命的漏洞,怎么解决呢<I></I>?其实可以这样解决:</P>
<P><STRONG>
</STRONG>首先我们允许文件的不连续存储。目录中依然只记录开始簇和文件的大小。那么我们怎么记录文件占用那些簇呢,以文件映射簇不太方便,因为文件名是不固定的。我们换个思想,可以用簇来映射文件,在整个存储空间的前部留下几簇来记录数据区中数据与簇号的关系。对于上例因为总空间也不大,所以用前部的1Kb的空间来记录这种对应,假设3个文件都存储,空间分配如图4.3.5,同时修改一下目录,如图4.3.6</P>
<P align=center><IMG alt=""
src="硬盘FAT文件系统原理的详细分析_存储在线Dostor_com_files/1699.gif"
border=0></P>
<P><STRONG>
</STRONG>第一簇用来记录数据区中每一簇的被占用情况,暂时称其为文件分配表。结合文件分配表和文件目录就可以达到完全的文件读取了。我们想到,把文件分配表做成一个数据表,以图4.3.7的形式记录簇与数据的对应。</P>
<P><STRONG>
</STRONG>用图4.3.7的组织方式是完全可以实现对文件占有簇的记录的。但还不够效率。比如文件名在文件分配表中记录太多,浪费空间,而实际上在目录中已经记录了文件的开始簇了。所以可以改良一下,用链的方式来存放占有簇的关系,变成图4.3.8的组织方式。</P>
<P align=center><IMG alt=""
src="硬盘FAT文件系统原理的详细分析_存储在线Dostor_com_files/1700.gif"
border=0></P>
<P><STRONG>
</STRONG>参照图4.3.8来理解一下文件分配表的意义。如文件a.txt我们根据目录项中指定的a.txt的首簇为2,然后找到文件分配表的第2簇记录,上面登记的是3,我们就能确定下一簇是3。找到文件分配表的第3簇记录,上面登记的是4,我们就能确定下一簇是4......直到指到第11簇,发现下一个指向是FF,就是结束。文件便丝毫无误读取完毕。</P>
<P><STRONG>
</STRONG>我们再看上面提到的第三种情况,就是将b.txt删除以后,存入一个大小为60.3KB的d.txt。利用簇链可以很容易的实现。实现后的磁盘如图4.3.9<I></I> <I></I> 4.3.10<I></I> <I></I> 4.3.11</P>
<P align=center><IMG alt=""
src="硬盘FAT文件系统原理的详细分析_存储在线Dostor_com_files/1701.gif"
border=0></P>
<P><STRONG>
</STRONG>上面是我们对文件存储的一种假设,也该揭开谜底的时候了。上面的思想其实就是fat文件系统的思想的精髓(但并不是,尤其像具体的参数的意义与我们所举的例子是完全不同的。请忘掉上边细节,努力记忆下边)。</P>
<P><STRONG>
★FAT16存储原理:<I></I></STRONG> <I></I> </P>
<P><STRONG>
</STRONG>当把一部分磁盘空间格式化为fat文件系统时,fat文件系统就将这个分区当成整块可分配的区域进行规划,以便于数据的存储。一般来讲,其划分形式如图7所示。我们把FAT16部分提取出来,详细描述一下:</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -