📄 fat文件系统原理(三).htm
字号:
codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0
height=60 width=480
classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000><PARAM NAME="movie" VALUE="images/banner.swf"><PARAM NAME="quality" VALUE="high">
<embed src='images/banner.swf'
pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash'
type='application/x-shockwave-flash' width='480'
height='60'></embed></OBJECT></DIV></TD>
<TD width=80>
<TABLE height="100%" cellSpacing=0 cellPadding=0 width="100%"
align=center border=0>
<TBODY>
<TR vAlign=center>
<TD align=middle><IMG height=16
src="FAT文件系统原理(三).files/home.gif" width=16
align=absMiddle></TD>
<TD align=middle><A
onclick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.sjhf.net')"
href="http://www.sjhf.net/Article_Show.asp?ArticleID=4#">设为首页</A></TD></TR>
<TR vAlign=center>
<TD align=middle><IMG height=17
src="FAT文件系统原理(三).files/email.gif" width=16
align=absMiddle></TD>
<TD align=middle><A
href="mailto:sjhf@sjhf.net">联系站长</A></TD></TR>
<TR vAlign=center>
<TD align=middle><IMG height=16
src="FAT文件系统原理(三).files/bookmark.gif" width=16
align=absMiddle></TD>
<TD align=middle><A
href="javascript:window.external.addFavorite('http://www.sjhf.net','数据恢复网')">加入收藏</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR vAlign=center>
<TD class=nav_menu vAlign=center>
<SCRIPT language=JavaScript1.2 type=text/javascript>
<!--
stm_bm(['uueoehr',400,'','images/blank.gif',0,'','',0,0,0,0,0,1,0,0]);
stm_bp('p0',[0,4,0,0,2,2,0,0,100,'',-2,'',-2,90,0,0,'#000000','transparent','',3,0,0,'#000000']);
stm_ai('p0i0',[0,'|','','',-1,-1,0,'','_self','','','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',1,'','',3,3,0,0,'#fffff7','#000000','#000000','#000000','9pt 宋体','9pt 宋体',0,0]);
stm_aix('p0i1','p0i0',[0,'技术资料首页','','',-1,-1,0,'Article_Index.asp','_self','Article_Index.asp','','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',1,'','',3,3,0,0,'#fffff7','#ff0000','#000000','#cc0000','9pt 宋体','9pt 宋体']);
stm_aix('p0i2','p0i0',[0,'|','','',-1,-1,0,'','_self','','','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',1,'','',3,3,0,0,'#fffff7','#000000','#000000','#000000','9pt 宋体','9pt 宋体',0,0]);
stm_aix('p0i3','p0i0',[0,'逻辑修复资料','','',-1,-1,0,'Article_Class2.asp?ClassID=6','_self','Article_Class2.asp?ClassID=6','逻辑修复资料','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',1,'','',3,3,0,0,'#fffff7','#ff0000','#000000','#cc0000','9pt 宋体','9pt 宋体']);
stm_bp('p1',[1,4,0,0,2,3,6,7,100,'progid:DXImageTransform.Microsoft.Fade(overlap=.5,enabled=0,Duration=0.43)',-2,'',-2,67,2,3,'#999999','#ffffff','',3,1,1,'#aca899']);
stm_aix('p1i0','p0i0',[0,'存储原理资料','','',-1,-1,0,'Article_Class2.asp?ClassID=1','_self','Article_Class2.asp?ClassID=1','存储原理资料','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',0,'','',3,3,0,0,'#fffff7','#ff0000','#000000','#cc0000','9pt 宋体']);
stm_aix('p1i1','p0i0',[0,'数据恢复实例','','',-1,-1,0,'Article_Class2.asp?ClassID=2','_self','Article_Class2.asp?ClassID=2','数据恢复实例','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',0,'','',3,3,0,0,'#fffff7','#ff0000','#000000','#cc0000','9pt 宋体']);
stm_aix('p1i2','p0i0',[0,'数据恢复工具教程','','',-1,-1,0,'Article_Class2.asp?ClassID=7','_self','Article_Class2.asp?ClassID=7','数据恢复工具教程','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',0,'','',3,3,0,0,'#fffff7','#ff0000','#000000','#cc0000','9pt 宋体']);
stm_ep();
stm_aix('p0i2','p0i0',[0,'|','','',-1,-1,0,'','_self','','','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',1,'','',3,3,0,0,'#fffff7','#000000','#000000','#000000','9pt 宋体','9pt 宋体',0,0]);
stm_aix('p0i4','p0i0',[0,'磁盘物理修复','','',-1,-1,0,'Article_Class2.asp?ClassID=3','_self','Article_Class2.asp?ClassID=3','磁盘物理修复','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',1,'','',3,3,0,0,'#fffff7','#ff0000','#000000','#cc0000','9pt 宋体','9pt 宋体']);
stm_bp('p1',[1,4,0,0,2,3,6,7,100,'progid:DXImageTransform.Microsoft.Fade(overlap=.5,enabled=0,Duration=0.43)',-2,'',-2,67,2,3,'#999999','#ffffff','',3,1,1,'#aca899']);
stm_aix('p1i0','p0i0',[0,'维修技术资料','','',-1,-1,0,'Article_Class2.asp?ClassID=8','_self','Article_Class2.asp?ClassID=8','维修技术资料','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',0,'','',3,3,0,0,'#fffff7','#ff0000','#000000','#cc0000','9pt 宋体']);
stm_aix('p1i1','p0i0',[0,'维修工具教程','','',-1,-1,0,'Article_Class2.asp?ClassID=9','_self','Article_Class2.asp?ClassID=9','维修工具教程','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',0,'','',3,3,0,0,'#fffff7','#ff0000','#000000','#cc0000','9pt 宋体']);
stm_ep();
stm_aix('p0i2','p0i0',[0,'|','','',-1,-1,0,'','_self','','','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',1,'','',3,3,0,0,'#fffff7','#000000','#000000','#000000','9pt 宋体','9pt 宋体',0,0]);
stm_aix('p0i5','p0i0',[0,'底层程序设计','','',-1,-1,0,'Article_Class2.asp?ClassID=5','_self','Article_Class2.asp?ClassID=5','底层程序设计','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',1,'','',3,3,0,0,'#fffff7','#ff0000','#000000','#cc0000','9pt 宋体','9pt 宋体']);
stm_aix('p0i2','p0i0',[0,'|','','',-1,-1,0,'','_self','','','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',1,'','',3,3,0,0,'#fffff7','#000000','#000000','#000000','9pt 宋体','9pt 宋体',0,0]);
stm_aix('p0i6','p0i0',[0,'其他精彩资料','','',-1,-1,0,'Article_Class2.asp?ClassID=4','_self','Article_Class2.asp?ClassID=4','其他精彩资料','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',1,'','',3,3,0,0,'#fffff7','#ff0000','#000000','#cc0000','9pt 宋体','9pt 宋体']);
stm_aix('p0i2','p0i0',[0,'|','','',-1,-1,0,'','_self','','','','',0,0,0,'','',0,0,0,0,1,'#f1f2ee',1,'#cccccc',1,'','',3,3,0,0,'#fffff7','#000000','#000000','#000000','9pt 宋体','9pt 宋体',0,0]);
stm_em();
//-->
</SCRIPT>
</TD></TR><!-- <tr Class="nav_main">
<td></td>
</tr>
<tr>
<td class="nav_bottom"></td>
</tr> --></TBODY></TABLE>
<TABLE class=txt_css cellSpacing=0 cellPadding=0 width=760 align=center
bgColor=#ffffff border=0>
<TBODY>
<TR vAlign=center>
<TD>
<DIV align=right></DIV> 您现在的位置: <A
href="http://www.sjhf.net/">数据恢复网</A> >> <A
href="http://www.sjhf.net/Article_Index.asp">技术资料</A> >> <A
href="http://www.sjhf.net/Article_Class2.asp?ClassID=6&LayoutID=1">逻辑修复资料</A> >> <A
href="http://www.sjhf.net/Article_Class2.asp?ClassID=1">存储原理资料</A> >> 正文
</TD>
<TD align=right width=158>
<SCRIPT language=JavaScript type=text/JavaScript>
var day="";
var month="";
var ampm="";
var ampmhour="";
var myweekday="";
var year="";
mydate=new Date();
myweekday=mydate.getDay();
mymonth=mydate.getMonth()+1;
myday= mydate.getDate();
myyear= mydate.getYear();
year=(myyear > 200) ? myyear : 1900 + myyear;
if(myweekday == 0)
weekday=" 星期日 ";
else if(myweekday == 1)
weekday=" 星期一 ";
else if(myweekday == 2)
weekday=" 星期二 ";
else if(myweekday == 3)
weekday=" 星期三 ";
else if(myweekday == 4)
weekday=" 星期四 ";
else if(myweekday == 5)
weekday=" 星期五 ";
else if(myweekday == 6)
weekday=" 星期六 ";
document.write(year+"年"+mymonth+"月"+myday+"日 "+weekday);
</SCRIPT>
</TD></TR></TBODY></TABLE>
<TABLE class=border2 cellSpacing=0 cellPadding=0 width=760 align=center
border=0>
<TBODY>
<TR>
<TD vAlign=top>
<TABLE class=border cellSpacing=0 cellPadding=2 width="100%" align=center
border=0>
<TBODY>
<TR>
<TD class=title>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=title_maintxt vAlign=center width="82%"> <IMG
height=14 src="FAT文件系统原理(三).files/arrow.gif" width=11
align=absMiddle> FAT文件系统原理(三) </TD>
<TD class=title_maintxt width="18%"> <FONT
color=red>热</FONT> <FONT
color=#009900>★★★</FONT> </TD></TR></TBODY></TABLE></TD></TR>
<TR vAlign=center align=middle>
<TD colSpan=2 height=40><FONT
size=4><STRONG>FAT文件系统原理(三)</STRONG></FONT> </TD></TR>
<TR class=tdbg_rightall align=middle>
<TD colSpan=2>[ 作者:<A
href="mailto:zymail@vip.sina.com">菜刀</A> 转贴自:本站原创 点击数:367 更新时间:2004-4-20 文章录入:admin
]</TD></TR>
<TR>
<TD colSpan=2>
<TABLE style="WORD-BREAK: break-all" cellSpacing=5 cellPadding=0
width=740 align=center border=0>
<TBODY>
<TR>
<TD vAlign=top height=200>
<TABLE cellSpacing=0 cellPadding=10 align=left border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE>
<P>
<P>4.3 FAT表和数据的存储原则。</P>
<P> FAT表(File Allocation
Table
文件分配表),是Microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。假如把磁盘比作一本书,FAT表可以认为相当于书中的目录,而文件就是各个章节的内容。但FAT表的表示方法却与目录有很大的不同。<BR>
在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。</P>
<P> ★存储过程假想:<BR>
我们模拟对一个分区存储数据的过程来说明FAT文件系统中数据的存储原则。<BR>
假定现在有一个空的完全没有存放数据的磁盘,大小为100KB,我们将其想象为线形的空间地址。为了存储管理上的便利,我们人为的将这100KB的空间均分成100份,每份1KB。我们来依次存储这样几个文件:A.TXT(大小10KB),B.TXT(大小53.6KB),C.TXT(大小20.5KB)。<BR>
最起码能够想到,我们可以顺序的在这100KB空间中存放这3个文件。同时不要忘了,我们还要记下他们的大小和开始的位置,这样下次要用时才能找的到,这就像是目录。为了便于查找,我们假定用第1K的空间来存储他们的特征(属性)。还有,我们设计的存储单位是1KB,所以,A.TXT我们需要10个存储单位(为了说明方便,我们把存储单位叫做“簇”吧。也能少打点字,呵呵。),B.TXT需要54个簇,C.TXT需要21个簇。可能有人会说B.TXT和C.TXT不是各自浪费了不到1簇的空间吗?干嘛不让他们紧挨着,不是省地方吗?我的回答是,如果按照这样的方式存储,目录中原本只需要记下簇号,现在还需要记下簇内的偏移,这样会增加目录的存储量,而且存取没有了规则,读取也不太方便,是得不偿失的。<BR>
根据上面所说的思想,我们设计了这样的图4.3.1所示的存储方式。</P>
<P><A title=新窗口打开 onfocus=this.blur()
href="FAT文件系统原理(三).files/2004420124422734.gif"
target=_blank><IMG
src="FAT文件系统原理(三).files/2004420124422734.gif"
border=0></A></P>
<P>
我们再考虑如何来写这三个文件的目录。对于每个文件而言,一定要记录的有:文件名,开始簇,大小,创建日期、时间,修改日期、时间,文件的读写属性等。这里大小能不能用结束簇来计算呢?一定不能,因为文件的大小不一定就是整数个簇的大小,否则的话像B.TXT的内容就是54KB的内容了,少了固然不行,可多了也是不行的。那么我们怎么记录呢?可以想象一下。为了管理上的方便,我们用数据库的管理方式来管理我们的目录。于是我把1KB再分成10份,假定开始簇号为0,定义每份100B的各个位置的代表含义如图4.3.2</P>
<P><A title=新窗口打开 onfocus=this.blur()
href="FAT文件系统原理(三).files/2004420124422621.gif"
target=_blank><IMG
src="FAT文件系统原理(三).files/2004420124422621.gif"
border=0></A></P>
<P>
这样设计的结构绝对可以对文件进行正确的读写了。接着让我们设计的文件系统工作吧。先改动个文件,比如A.TXT,增加点内容吧!咦?增加后往哪里放呀,虽然存储块的后面有很多空间,但紧随其后B.TXT的数据还顶着呢?要是把A.TXT移到后边太浪费处理资源,而且也不一定解决问题。这个问题看来暂时解决不了。<BR>
那我们换个操作,把B.txt删了,b.txt的空间随之释放。这时候空间如图4.3.3,目录如图4.3.4</P>
<P><A title=新窗口打开 onfocus=this.blur()
href="FAT文件系统原理(三).files/2004420124423371.gif"
target=_blank><IMG
src="FAT文件系统原理(三).files/2004420124423371.gif"
border=0></A></P>
<P>
这个操作看来还可以,我们接着做,在存入一个文件D.txt(大小为60.3KB),总共100簇的空间只用了31簇,还有68簇剩余,按说能放下。可是?往那里放呢?没有61个连续的空间了,目录行没办法写了,看来无连续块存储暂时也不行。<BR>
你一定能够想到我们可以在连续空间不够或增加文件长度的时候转移影响我们操作的其他文件,从而腾出空间来,但我要问你,那不是成天啥也不要干了,就是倒腾东西了吗?</P>
<P>
看来我们设计的文件系统有致命的漏洞,怎么解决呢?。。。。<BR>。。。。。。</P>
<P> 其实可以这样解决:<BR>
首先我们允许文件的不连续存储。目录中依然只记录开始簇和文件的大小。那么我们怎么记录文件占用那些簇呢,以文件映射簇不太方便,因为文件名是不固定的。我们换个思想,可以用簇来映射文件,在整个存储空间的前部留下几簇来记录数据区中数据与簇号的关系。对于上例因为总空间也不大,所以用前部的1Kb的空间来记录这种对应,假设3个文件都存储,空间分配如图4.3.5,同时修改一下目录,如图4.3.6</P>
<P><A title=新窗口打开 onfocus=this.blur()
href="FAT文件系统原理(三).files/2004420124423112.gif"
target=_blank><IMG
src="FAT文件系统原理(三).files/2004420124423112.gif"
border=0></A></P>
<P>
第一簇用来记录数据区中每一簇的被占用情况,暂时称其为文件分配表。结合文件分配表和文件目录就可以达到完全的文件读取了。我们想到,把文件分配表做成一个数据表,以图4.3.7的形式记录簇与数据的对应。<BR>
用图4.3.7的组织方式是完全可以实现对文件占有簇的记录的。但还不够效率。比如文件名在文件分配表中记录太多,浪费空间,而实际上在目录中已经记录了文件的开始簇了。所以可以改良一下,用链的方式来存放占有簇的关系,变成图4.3.8的组织方式。</P>
<P><A title=新窗口打开 onfocus=this.blur()
href="FAT文件系统原理(三).files/2004420124423833.gif"
target=_blank><IMG
src="FAT文件系统原理(三).files/2004420124423833.gif"
border=0></A></P>
<P>
参照图4.3.8来理解一下文件分配表的意义。如文件a.txt我们根据目录项中指定的a.txt的首簇为2,然后找到文件分配表的第2簇记录,上面登记的是3,我们就能确定下一簇是3。找到文件分配表的第3簇记录,上面登记的是4,我们就能确定下一簇是4......直到指到第11簇,发现下一个指向是FF,就是结束。文件便丝毫无误读取完毕。</P>
<P>
我们再看上面提到的第三种情况,就是将b.txt删除以后,存入一个大小为60.3KB的d.txt。利用簇链可以很容易的实现。实现后的磁盘如图4.3.9
4.3.10 4.3.11</P>
<P><A title=新窗口打开 onfocus=this.blur()
href="FAT文件系统原理(三).files/2004420124424140.gif"
target=_blank><IMG
src="FAT文件系统原理(三).files/2004420124424140.gif"
border=0></A></P>
<P>
上面是我们对文件存储的一种假设,也该揭开谜底的时候了。上面的思想其实就是fat文件系统的思想的精髓(但并不是,尤其像具体的参数的意义与我们所举的例子是完全不同的。请忘掉上边细节,努力记忆下边)。</P>
<P></P></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2>
<TABLE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -