📄 子目录fdt的簇链结构.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0044)http://cracker2003.nease.net/htm/disk008.htm -->
<HTML><HEAD><TITLE>子目录FDT的簇链结构</TITLE>
<META http-equiv=Content-Language content=zh-cn>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1400" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId></HEAD>
<BODY background=子目录FDT的簇链结构.files/back01.jpg>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD width="100%"></TD></TR>
<TR>
<TD width="100%">当前位置:<A
href="http://cracker2003.nease.net/index.htm">首页</A>-<A
href="http://cracker2003.nease.net/htm/disk001.htm">磁盘文件</A>-子目录FDT的簇链结构</TD></TR></TBODY></TABLE>
<P>子目录FDT的簇链结构</P>
<P>在FAT文件系统中的目录结构是层次性的树形结构,根目录下可以包含文件和子目录,子目录下可以包含文件并且还可以再包含子目录。如图6-7所示就是一个树形目录结构的例子。<BR>
<IMG height=135 src="子目录FDT的簇链结构.files/mulu.gif" width=301 border=0></P>
<P>
图6-7
FAT文件系统中的数形目录结构<BR>在FDT中,子目录的管理与普通文件相同,一个子目录文件在FDT表中也占据32个字节的目录项。但是,子目录项中的文件长度总为零,尽管它的文件长度实际上不为零,它的意义在于不能使用不同的DOS读写命令来读写一个子目录文件。<BR>1.子目录FDT中的目录项<BR>当前目录为子目录时,在使用DOS命令DIR列文件目录清单时,通常可以看到前两项特殊文件:<BR>“·”表示当前目录<BR>“··”表示上一级目录<BR>这两项同其它子目录一样也没有长度。“·”项所报告的“首簇号”是子目录FDT第一个扇区所在的簇;“··”所报告的“首簇号”是上一级目录的开始簇号。如果上一级目录是根目录,则该簇号值被置成0。系统利用此结构来实现目录之间的双向联系。<BR>只有当文件需要时,系统才给文件分配数据区空间。存放数据的空间是按每次一个簇的方式来分配的。分配的时候,系统跳过已分配的簇,第一个遇到的空簇就是下一个将要分配的簇,此时系统并不考虑簇在磁盘上的物理位置。同时,文件已被删除后空出来的簇也可以分配给新的文件,这样做可使磁盘空间得到有效的利用。<BR>可以说,数据区空间的使用是在文件分配表和文件目录表的统一控制下完成,每个文件所有的簇在文件分配表中都是链接在一起的。<BR>需要注意的是:若使用DOS命令“MD”在磁盘上建立子目录SUB1,我们在FDT中可查到SUB1目录项的第0字节的值不是2E,而是“S”的ASCII码值53(如表6-7所示),<BR>并且子目录SUB1中的所有文件不占根目录的FDT,而是按SUB1的首簇号2AH在相应的逻辑扇区中建立子SUB1自己的文件目录表FDT。这是因为DOS是将子目录作为一个普通文件的文件目录项来处理的。只是在第11字节的文件属性位设为10H,以表示为子目录项。在文件目录项中的第0字节为2EH,也仅是出现在子目录FDT中的第一、第二两个目录项中(如表6-8所示)。<BR>假设一个FAT16结构逻辑硬盘根目录的文件目录表FDT的起始扇区为129(81H),共32(20H)个扇区。用DEBUG中的命令“L
100 2 81
20”读出硬盘逻辑81H扇区开始的20H个扇区,来查看硬盘根目录的FDT,可得到一个如表6-7所示的根目录文件目录表(FDT)。<BR>表6-7
根目录文件目录表(FDT)<BR></P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD align=middle width="15%">
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">xxxx:0000</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">xxxx:0010</P></TD>
<TD align=middle width="59%">
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">49 4F 20 20 20 20 20 20-53
59 53 27 00 00 00 00</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">00 00 00 00 00 00 C0 32-BF
1C 07 00 46 9F 00 00</P></TD>
<TD align=middle width="26%">
<P
style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">IO
SYS'...</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">
.....2....F..</P></TD></TR>
<TR>
<TD align=middle width="15%">
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">xxxx:0020</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">xxxx:0030</P></TD>
<TD align=middle width="59%">
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">4D 53 44 4F 53 20 20 20-53
59 53 27 00 00 00 00</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">00 00 00 00 00 00 C0 32-BF
1C 4F 00 FA 94 00 00</P></TD>
<TD align=middle width="26%">
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">MSDOS
SYS'...</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">
......2..O...</P></TD></TR>
<TR>
<TD align=middle width="15%">
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">xxxx:0040</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">xxxx:0050</P></TD>
<TD align=middle width="59%">
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">43 4F 4D 4D 41 4E 44 20-43
4F 4D 20 00 00 00 00</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">00 00 00 00 00 00 C0 32-BF
1C 5B 00 75 D5 00 00</P></TD>
<TD align=middle width="26%">
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">COMMAND COM....</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">
......2..[.u.</P></TD></TR>
<TR>
<TD align=middle width="15%">
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">xxxx:0060</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">xxxx:0070</P></TD>
<TD align=middle width="59%">
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">53 55 42 31 20 20 20 20-20
20 20 10 00 00 00 00</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">00 00 00 00 00 00 DD 8C-8B
28 03 00 00 00 00 00</P></TD>
<TD align=middle width="26%">
<P
style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">SUB1
....</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px">
.......(.....</P></TD></TR></TBODY></TABLE>
<P><BR>从显示结果可以看出,SUB1表项的第11字节的值为10H,表明SUB1不是一个文件,而是一个子目录,其首簇号为第3簇。<BR>在根目录下的文件或子目录在磁盘上的存储位置(逻辑扇区号)按以下公式计算:<BR>逻辑扇区号=1+2*FAT的扇区数+根FDT+(首簇号-2)*每簇扇区数<BR>所以,子目录SUB1的FDT存放的首扇区号应该是:<BR>首扇区号=1+2*201扇区+32扇区+(3-2)*8扇区<BR>=443扇区(1BBH扇区)<BR>用DEBUG命令"-L
00 2 1BB 1"将第1BBH扇区的SUB1子目录FDT的1个扇区内容读入00开始的内容,然后用"-D
00"命令显示子目录SUB1的FDT部分内容。<BR>2.子目录下FDT表的扩充<BR>根目录FDT表和子目录中的FDT表有两个最大的区别:<BR>·根FDT表的扇区数是固定不变的,所以根目录下能够存放的文件或子目录数量是有限的,而子目录FDT表的扇区数是固定的,因而其存放的文件或目录数量也
没有限制。<BR>·根FDT表的所有扇区在物理上是连续存放的,而子目录FDT表的所有扇区在物理是不连续存放的,这些FDT的扇区之间存在一种逻辑上的链接关系。<BR>我们知道,文件系统是将子目录作为一个普通文件的文件目录项来管理的。FDT中的一个扇区最多只能存放16个文件项,对于子目录FDT的首扇区来说,子目录下的两个特殊目录“·”和“··”要占该扇区的前64字节,也就是说该扇区只能存放14个文件的文件目录项。显然,子目录不止有14个文件,那么14个文件以后的那些子目录中,文件的文件目录项又是存放在什么地方呢?操作系统又是如何查找它们的呢?<BR>与普通文件在FAT中的簇号一样,子目录FDT的第一个扇区的簇号及其扩展扇区的簇号在FAT中也会形成一个簇号链,并且也是以FF8H---FFFH(或FFF8H---FFFFH)作为最后一个FDT扇区的结束标志。<BR>例如,假设一个子目录的FDT共有3个扇区组成,在根FDT中查得该子目录的首簇号为a,再从FAT表中查得该子目录FDT扇区的簇链关系为“a=>b=>c”。假如该子目录下有一个文件Text.txt,系统查找该文件的步骤如下:<BR>步骤1:在根FDT中查得子目录的目录项,从该目录项中得到该子目录的首簇号为a,该簇所在的扇区即为子目录FDT的首扇区。并在该扇区中查找文件Text.txt。<BR>步骤2:如果没有找到,则在FAT表中从簇号a开始查得该子目录FDT的下一个扇区的簇号为b,然后再在该扇区中查找文件Text.txt。<BR>步骤3:如果在簇号b扇区中仍然没有找到,则在FAT表中从簇号b查得该子目录FDT的下一个扇区的簇号为c,然后再在该扇区中查找文件Text.txt。<BR>步骤4:如此继续,直到查到该文件的目录表项。<BR>如果直到该子目录FDT簇链的最后一个扇区仍然没有找到该文件,就报告查找失败。<BR><BR></P>
<P align=center><BR><A
href="http://cracker2003.nease.net/htm/disk007.htm">上一页</A> <A
href="http://cracker2003.nease.net/htm/disk001.htm">返回</A> <A
href="http://cracker2003.nease.net/htm/disk009.htm">下一页</A> </P></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -