📄 fat文件系统原理(四).htm
字号:
<TBODY>
<TR>
<TD align=middle colSpan=6><I><FONT color=#006699
size=2>图4.3.11 Fat16的组织形式</FONT></I></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: #008080 1px solid; BORDER-TOP: #008080 1px solid; BORDER-LEFT: #008080 1px solid; BORDER-BOTTOM: #008080 1px solid; BACKGROUND-COLOR: #c0c0c0"
align=middle width="7%"><FONT color=#006699
size=2>引导扇区</FONT></TD>
<TD
style="BORDER-RIGHT: #008080 1px solid; BORDER-TOP: #008080 1px solid; BORDER-LEFT: #008080 1px solid; BORDER-BOTTOM: #008080 1px solid; BACKGROUND-COLOR: #c0c0c0"
align=middle width="19%"><FONT color=#006699
size=2>FAT1</FONT></TD>
<TD
style="BORDER-RIGHT: #008080 1px solid; BORDER-TOP: #008080 1px solid; BORDER-LEFT: #008080 1px solid; BORDER-BOTTOM: #008080 1px solid; BACKGROUND-COLOR: #c0c0c0"
align=middle width="18%"><FONT color=#006699
size=2>FAT2(重复的)</FONT></TD>
<TD
style="BORDER-RIGHT: #008080 1px solid; BORDER-TOP: #008080 1px solid; BORDER-LEFT: #008080 1px solid; BORDER-BOTTOM: #008080 1px solid; BACKGROUND-COLOR: #c0c0c0"
align=middle width="13%"><FONT color=#006699
size=2>根文件夹</FONT></TD>
<TD
style="BORDER-RIGHT: #008080 1px solid; BORDER-TOP: #008080 1px solid; BORDER-LEFT: #008080 1px solid; BORDER-BOTTOM: #008080 1px solid; BACKGROUND-COLOR: #c0c0c0"
align=middle width="30%"><FONT color=#006699
size=2>其他文件夹及所有文件</FONT></TD>
<TD
style="BORDER-RIGHT: #008080 1px solid; BORDER-TOP: #008080 1px solid; BORDER-LEFT: #008080 1px solid; BORDER-BOTTOM: #008080 1px solid; BACKGROUND-COLOR: #c0c0c0"
align=middle width="13%"><FONT color=#006699
size=2>剩余扇区</FONT></TD></TR>
<TR>
<TD align=middle width="7%"><FONT color=#006699
size=2><I>1扇区</I></FONT></TD>
<TD align=middle width="19%"><FONT color=#006699
size=2><I>实际情况取大小</I></FONT></TD>
<TD align=middle width="18%"><FONT color=#006699
size=2><I>同FAT1</I></FONT></TD>
<TD align=middle width="13%"><FONT color=#006699
size=2><I>32个扇区</I></FONT></TD>
<TD align=middle width="30%"><FONT color=#006699
size=2><I>开始簇编号(从2开始)</I></FONT></TD>
<TD align=middle width="13%"><FONT color=#006699
size=2><I>不足一簇</I></FONT></TD></TR></TBODY></TABLE>
<P> </P>
<TABLE id=table23 style="WIDTH: 397px; HEIGHT: 119px"
width=397 border=1>
<TBODY>
<TR>
<TD align=middle colSpan=3>表9
FAT16分区大小与对因簇大小</TD></TR>
<TR>
<TD align=middle width="26%">分区空间大小</TD>
<TD align=middle width="29%">每个簇的扇区</TD>
<TD align=middle width="18%">簇空间大小</TD></TR>
<TR>
<TD align=middle width="26%">0MB-32MB</TD>
<TD align=middle width="29%">1</TD>
<TD align=middle width="18%">512个字节</TD></TR>
<TR>
<TD align=middle width="26%">33MB-64MB</TD>
<TD align=middle width="29%">2</TD>
<TD align=middle width="18%">1k</TD></TR>
<TR>
<TD align=middle width="26%">65MB-128MB</TD>
<TD align=middle width="29%">4</TD>
<TD align=middle width="18%">2k</TD></TR>
<TR>
<TD align=middle width="26%">129MB-225MB</TD>
<TD align=middle width="29%">8</TD>
<TD align=middle width="18%">4k</TD></TR>
<TR>
<TD align=middle width="26%">256MB-511MB</TD>
<TD align=middle width="29%">16</TD>
<TD align=middle width="18%">8k</TD></TR>
<TR>
<TD align=middle width="26%">512MB-1023MB</TD>
<TD align=middle width="29%">32</TD>
<TD align=middle width="18%">16k</TD></TR>
<TR>
<TD align=middle width="26%">1024MB-2047MB</TD>
<TD align=middle width="29%">64</TD>
<TD align=middle width="18%">32k</TD></TR>
<TR>
<TD align=middle width="26%">2048MB-4095MB</TD>
<TD align=middle width="29%">128</TD>
<TD align=middle width="18%">64k</TD></TR></TBODY></TABLE>
<P><BR><FONT color=#c0c0c0><SPAN
style="FONT-WEIGHT: 700; BACKGROUND-COLOR: #ffff00"></SPAN></FONT>
注意:少于32680个扇区的分区中,簇空间大小可最多达到每个簇8个扇区。不管用户是使用磁盘管理器来格式化分区,还是使用命令提示行键入format命令格式化,格式化程序都创建一个12位的FAT。少于16MB的分区,系统通常会将其格式化成12位的FAT,FAT12是FAT的初始实现形式,是针对小型介质的。FAT12文件分配表要比FAT16和FAT32的文件分配表小,因为它对每个条目使用的空间较少。这就给数据留下较多的空间。所有用FAT12格式化的5.25英寸软盘以及1.44MB的3.5英寸软盘都是由FAT12格式化的。除了FAT表中记录每簇链结的二进制位数与FAT16不同外,其余原理与FAT16均相同,不再单独解释。。。</P>
<P>
格式化FAT16分区时,格式化程序根据分区的大小确定簇的大小,然后根据保留扇区的数目、根目录的扇区数目、数据区可分的簇数与FAT表本身所占空间
来确定FAT表所需的扇区数目,然后将计算后的结果写入DBR的相关位置。<BR>
FAT16
DBR参数的偏移0x11处记录了根目录所占扇区的数目。偏移0x16记录了FAT表所占扇区的数据。偏移0x10记录了FAT表的副本数目。系统在得到这几项参数以后,就可以确定数据区的开始扇区偏移了。<BR>
FAT16文件系统从根目录所占的32个扇区之后的第一个扇区开始以簇为单位进行数据的处理,这之前仍以扇区为单位。对于根目录之后的第一个簇,系统并不编号为第0簇或第1簇
(可能是留作关键字的原因吧),而是编号为第2簇,也就是说数据区顺序上的第1个簇也是编号上的第2簇。<BR>
FAT文件系统之所以有12,16,32不同的版本之分,其根本在于FAT表用来记录任意一簇链接的二进制位数。以FAT16为例,每一簇在FAT表中占据2字节(二进制16位)。所以,FAT16最大可以表示的簇号为0xFFFF(十进制的65535),以32K为簇的大小的话,FAT32可以管理的最大磁盘空间为:32KB×65535=2048MB,这就是为什么FAT16不支持超过2GB分区的原因。<BR>
FAT表实际上是一个数据表,以2个字节为单位,我们暂将这个单位称为FAT记录项,通常情况其第1、2个记录项(前4个字节)用作介质描述。从第三个记录项开始记录除根目录外的其他文件及文件夹的簇链情况。根据簇的表现情况FAT用相应的取值来描述,见表10</P>
<TABLE id=table21 style="WIDTH: 302px; HEIGHT: 151px"
width=302 border=1>
<TBODY>
<TR>
<TD align=middle colSpan=2><FONT size=2>表10
FAT16记录项的取值含义(16进制)</FONT></TD></TR>
<TR>
<TD align=middle width=136><FONT
size=2>FAT16记录项的取值</FONT></TD>
<TD align=middle><FONT size=2>对应簇的表现情况</FONT></TD></TR>
<TR>
<TD align=middle width=136><FONT size=2>0000</FONT></TD>
<TD align=middle><FONT size=2>未分配的簇</FONT></TD></TR>
<TR>
<TD align=middle width=136><FONT
size=2>0002~FFEF</FONT></TD>
<TD align=middle><FONT size=2>已分配的簇</FONT></TD></TR>
<TR>
<TD align=middle width=136><FONT
size=2>FFF0~FFF6</FONT></TD>
<TD align=middle><FONT size=2>系统保留</FONT></TD></TR>
<TR>
<TD align=middle width=136><FONT size=2>FFF7</FONT></TD>
<TD align=middle><FONT size=2>坏簇</FONT></TD></TR>
<TR>
<TD align=middle width=136><FONT
size=2>FFF8~FFFF</FONT></TD>
<TD align=middle><FONT
size=2>文件结束簇</FONT></TD></TR></TBODY></TABLE>
<P> 看一幅在winhex所截FAT16的文件分配表,图10:</P>
<P><FONT color=#c0c0c0></FONT><IMG height=516
src="FAT文件系统原理(四).files/2004420124552734.gif" width=653
border=0> <BR><FONT color=#c0c0c0><SPAN
style="FONT-WEIGHT: 700; BACKGROUND-COLOR: #ffff00"><BR></SPAN></FONT>
如图,FAT表以"F8 FF FF FF"
开头,此2字节为介质描述单元,并不参与FAT表簇链关系。小红字标出的是FAT扇区每2字节对应的簇号。<BR>
相对偏移0x4~0x5偏移为第2簇(顺序上第1簇),此处为FF,表示存储在第2簇上的文件(目录)是个小文件,只占用1个簇便结束了。<BR>
第3簇中存放的数据是0x0005,这是一个文件或文件夹的首簇。其内容为第5簇,就是说接下来的簇位于第5簇——〉
FAT表指引我们到达FAT表的第5簇指向,上面写的数据是"FF FF",意即此文件已至尾簇。<BR>
第4簇中存放的数据是0x0006,这又是一个文件或文件夹的首簇。其内容为第6簇,就是说接下来的簇位于第6簇——〉FAT表指引我们到达FAT表的第6簇指向,上面写的数据是0x0007,就是说接下来的簇位于第7簇——〉FAT表指引我们到达FAT表的第7簇指向……直到根据FAT链读取到扇区相对偏移0x1A~0x1B,也就是第13簇,上面写的数据是0x000E,也就是指向第14簇——〉14簇的内容为"FF
FF",意即此文件已至尾簇。<BR>
后面的FAT表数据与上面的道理相同。不再分析。</P>
<P>
FAT表记录了磁盘数据文件的存储链表,对于数据的读取而言是极其重要的,以至于Microsoft为其开发的FAT文件系统中的FAT表创建了一份备份,就是我们看到的FAT2。FAT2与FAT1的内容通常是即时同步的,也就是说如果通过正常的系统读写对FAT1做了更改,那么FAT2也同样被更新。如果从这个角度来看,系统的这个功能在数据恢复时是个天灾。</P>
<P>
FAT文件系统的目录结构其实是一颗有向的从根到叶的树,这里提到的有向是指对于FAT分区内的任一文件(包括文件夹),均需从根目录寻址来找到。可以这样认为:目录存储结构的入口就是根目录。<BR>
FAT文件系统根据根目录来寻址其他文件(包括文件夹),故而根目录的位置必须在磁盘存取数据之前得以确定。FAT文件系统就是根据分区的相关DBR参数与DBR中存放的已经计算好的FAT表(2份)的大小来确定的。格式化以后,跟目录的大小和位置其实都已经确定下来了:位置紧随FAT2之后,大小通常为32个扇区。根目录之后便是数据区第2簇。<BR>
FAT文件系统的一个重要思想是把目录(文件夹)当作一个特殊的文件来处理,FAT32甚至将根目录当作文件处理(旁:NTFS将分区参数、安全权限等好多东西抽象为文件更是这个思想的升华),在FAT16中,虽然根目录地位并不等同于普通的文件或者说是目录,但其组织形式和普通的目录(文件夹)并没有不同。FAT分区中所有的文件夹(目录)文件,实际上可以看作是一个存放其他文件(文件夹)入口参数的数据表。所以目录的占用空间的大小并不等同于其下所有数据的大小,但也不等同于0。通常是占很小的空间的,可以看作目录文件是一个简单的二维表文件。其具体存储原理是:<BR>
不管目录文件所占空间为多少簇,一簇为多少字节。系统都会以32个字节为单位进行目录文件所占簇的分配。这32个字节以确定的偏移来定义本目录下的一个文件(或文件夹)的属性,实际上是一个简单的二维表。<BR>
这32个字节的各字节偏移定义如表11:</P>
<TABLE id=table22 height=357 width=398 border=1>
<TBODY>
<TR>
<TD align=middle colSpan=4 height=15><FONT
size=2>表11 FAT16目录项32个字节的表示定义</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>字节偏移(16进制)</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>字节数</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>定义</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0x0~0x7</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>8</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>文件名</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0x8~0xA</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>3</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>扩展名</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=183 rowSpan=7><FONT
size=2>0xB</FONT></TD>
<TD align=middle width=86 height=183 rowSpan=7><FONT
size=2>1</FONT></TD>
<TD align=middle width=23 height=183 rowSpan=7><FONT
size=2>属性字节</FONT></TD>
<TD align=middle width=138 height=21><FONT
size=2>00000000(读写)</FONT></TD></TR>
<TR>
<TD align=middle width=138 height=21><FONT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -