⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat文件系统原理(一).htm

📁 fat32文件系统的详细阐述
💻 HTM
📖 第 1 页 / 共 4 页
字号:
                  <P>&nbsp;&nbsp; 你的硬盘的MBR引导代码可能并非这样。不过即使不同,所执行的功能大体是一样的。<A 
                  href="http://www.sjhf.net/document/sjhf_fat/wowocock.htm">这是wowocock关于磁盘mbr的反编译</A>,已加了详细的注释,感兴趣可以细细研究一下。<BR>&nbsp;&nbsp;&nbsp; 
                  我们看DPT部分。操作系统为了便于用户对磁盘的管理。加入了磁盘分区的概念。即将一块磁盘逻辑划分为几块。磁盘分区数目的多少只受限于C~Z的英文字母的数目,在上图DPT共64个字节中如何表示多个分区的属性呢?microsoft通过链接的方法解决了这个问题。在DPT共64个字节中,以16个字节为分区表项单位描述一个分区的属性。也就是说,第一个分区表项描述一个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外的其余空间,一般而言,就是我们所说的扩展分区。这部分的大体说明见表1。</P>
                  <P>
                  <TABLE id=table2 width="47%" border=1>
                    <TBODY>
                    <TR>
                      <TD align=middle colSpan=4><FONT size=2>表1&nbsp; 
                        图2分区表第一字段</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="18%" height=22><FONT 
                        size=2>字节位移</FONT></TD>
                      <TD align=middle width="16%" height=22><FONT 
                        size=2>字段长度</FONT></TD>
                      <TD align=middle width="12%" height=22><FONT 
                        size=2>值</FONT></TD>
                      <TD align=middle width="42%" height=22><FONT 
                        size=2>字段名和定义</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="18%"><FONT 
                      size=2>0x01BE</FONT></TD>
                      <TD align=middle width="16%"><FONT size=2>BYTE</FONT></TD>
                      <TD align=middle width="12%"><FONT size=2>0x80</FONT></TD>
                      <TD align=middle width="42%"><FONT size=2>&nbsp;&nbsp; 
                        引导指示符(Boot Indicator)&nbsp;&nbsp; 
                    指明该分区是否是活动分区。</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="18%"><FONT 
                      size=2>0x01BF</FONT></TD>
                      <TD align=middle width="16%"><FONT size=2>BYTE</FONT></TD>
                      <TD align=middle width="12%"><FONT size=2>0x01</FONT></TD>
                      <TD align=middle width="42%"><FONT size=2>开始磁头(Starting 
                        Head)</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="18%"><FONT 
                      size=2>0x01C0</FONT></TD>
                      <TD align=middle width="16%"><FONT size=2>6位</FONT></TD>
                      <TD align=middle width="12%"><FONT size=2>0x01</FONT></TD>
                      <TD align=middle width="42%"><FONT size=2>开始扇区(Starting 
                        Sector) 只用了0~5位。后面的两位(第6位和第7位)被开始柱面字段所使用</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="18%"><FONT 
                      size=2>0x01C1</FONT></TD>
                      <TD align=middle width="16%"><FONT size=2>10位</FONT></TD>
                      <TD align=middle width="12%"><FONT size=2>0x00</FONT></TD>
                      <TD align=middle width="42%"><FONT size=2>开始柱面(Starting 
                        Cylinder)&nbsp;&nbsp; 
                        除了开始扇区字段的最后两位外,还使用了1位来组成该柱面值。开始柱面是一个10位数,最大值为1023</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="18%"><FONT 
                      size=2>0x01C2</FONT></TD>
                      <TD align=middle width="16%"><FONT size=2>BYTE</FONT></TD>
                      <TD align=middle width="12%"><FONT size=2>0x07</FONT></TD>
                      <TD align=middle width="42%"><FONT size=2>系统ID(System 
                        ID) 定义了分区的类型,详细定义,请参阅图4</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="18%"><FONT 
                      size=2>0x01C3</FONT></TD>
                      <TD align=middle width="16%"><FONT size=2>BYTE</FONT></TD>
                      <TD align=middle width="12%"><FONT size=2>0xFE</FONT></TD>
                      <TD align=middle width="42%"><FONT size=2>结束磁头(Ending 
                        Head)</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="18%"><FONT 
                      size=2>0x01C4</FONT></TD>
                      <TD align=middle width="16%"><FONT size=2>6位</FONT></TD>
                      <TD align=middle width="12%"><FONT size=2>0xFF</FONT></TD>
                      <TD align=middle width="42%"><FONT size=2>结束扇区(Ending 
                        Sector)&nbsp;&nbsp;&nbsp;&nbsp; 
                        只使用了0~5位。最后两位(第6、7位)被结束柱面字段所使用</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="18%"><FONT 
                      size=2>0x01C5</FONT></TD>
                      <TD align=middle width="16%"><FONT size=2>10位</FONT></TD>
                      <TD align=middle width="12%"><FONT size=2>0x7B</FONT></TD>
                      <TD align=middle width="42%"><FONT size=2>结束柱面(Ending 
                        Cylinder) 
                        除了结束扇区字段最后的两位外,还使用了1位,以组成该柱面值。结束柱面是一个10位的数,最大值为1023</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="18%"><FONT 
                      size=2>0x01C6</FONT></TD>
                      <TD align=middle width="16%"><FONT 
size=2>DWORD</FONT></TD>
                      <TD align=middle width="12%"><FONT 
                        size=2>0x0000003F</FONT></TD>
                      <TD align=middle width="42%"><FONT size=2>相对扇区数(Relative 
                        Sectors) 从该磁盘的开始到该分区的开始的位移量,以扇区来计算</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="18%"><FONT 
                      size=2>0x01CA</FONT></TD>
                      <TD align=middle width="16%"><FONT 
size=2>DWORD</FONT></TD>
                      <TD align=middle width="12%"><FONT 
                        size=2>0x00DAA83D</FONT></TD>
                      <TD align=middle width="42%"><FONT size=2>总扇区数(Total 
                        Sectors) 该分区中的扇区总数</FONT></TD></TR></TBODY></TABLE></P>
                  <P><FONT 
                  color=#c0c0c0></FONT>注:上表中的超过1字节的数据都以实际数据显示,就是按高位到地位的方式显示。存储时是按低位到高位存储的。两者表现不同,请仔细看清楚。以后出现的表,图均同。</P>
                  <P>也可以在winhex中看到这些参数的意义:<BR>&nbsp;&nbsp;&nbsp; <IMG height=963 
                  src="FAT文件系统原理(一).files/2004420123027621.gif" width=422 
                  border=0><BR><FONT color=#c0c0c0><SPAN 
                  style="FONT-WEIGHT: 700; BACKGROUND-COLOR: #ffff00"></SPAN></FONT><BR>&nbsp;&nbsp;&nbsp; 
                  说明: 
                  每个分区表项占用16个字节,假定偏移地址从0开始。如图3的分区表项3。分区表项4同分区表项3。<BR>&nbsp;&nbsp;&nbsp; 
                  1、0H偏移为活动分区是否标志,只能选00H和80H。80H为活动,00H为非活动。其余值对microsoft而言为非法值。 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  2、重新说明一下(这个非常重要):大于1个字节的数被以低字节在前的存储格式格式(little endian 
                  format)或称反字节顺序保存下来。低字节在前的格式是一种保存数的方法,这样,最低位的字节最先出现在十六进制数符号中。例如,相对扇区数字段的值0x3F000000的低字节在前表示为0x0000003F。这个低字节在前的格式数的十进制数为63。 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  3、系统在分区时,各分区都不允许跨柱面,即均以柱面为单位,这就是通常所说的分区粒度。有时候我们分区是输入分区的大小为7000M,分出来却是6997M,就是这个原因。 
                  偏移2H和偏移6H的扇区和柱面参数中,扇区占6位(bit),柱面占10位(bit),以偏移6H为例,其低6位用作扇区数的二进制表示。其高两位做柱面数10位中的高两位,偏移7H组成的8位做柱面数10位中的低8位。由此可知,实际上用这种方式表示的分区容量是有限的,柱面和磁头从0开始编号,扇区从1开始编号,所以最多只能表示1024个柱面×63个扇区×256个磁头×512byte=8455716864byte。即通常的8.4GB(实际上应该是7.8GB左右)限制。实际上磁头数通常只用到255个(由汇编语言的寻址寄存器决定),即使把这3个字节按线性寻址,依然力不从心。 
                  在后来的操作系统中,超过8.4GB的分区其实已经不通过C/H/S的方式寻址了。而是通过偏移CH~偏移FH共4个字节32位线性扇区地址来表示分区所占用的扇区总数。可知通过4个字节可以表示2^32个扇区,即2TB=2048GB,目前对于大多数计算机而言,这已经是个天文数字了。在未超过8.4GB的分区上,C/H/S的表示方法和线性扇区的表示方法所表示的分区大小是一致的。也就是说,两种表示方法是协调的。即使不协调,也以线性寻址为准。(可能在某些系统中会提示出错)。超过8.4GB的分区结束C/H/S一般填充为FEH 
                  FFH FFH。即C/H/S所能表示的最大值。有时候也会用柱面对1024的模来填充。不过这几个字节是什么其实都无关紧要了。 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  虽然现在的系统均采用线性寻址的方式来处理分区的大小。但不可跨柱面的原则依然没变。本分区的扇区总数加上与前一分区之间的保留扇区数目依然必须是柱面容量的整数倍。(保留扇区中的第一个扇区就是存放分区表的MBR或虚拟MBR的扇区,分区的扇区总数在线性表示方式上是不计入保留扇区的。如果是第一个分区,保留扇区是本分区前的所有扇区。<BR>&nbsp;&nbsp;&nbsp; 
                  附:分区表类型标志如图4<BR>&nbsp;&nbsp;&nbsp; <IMG height=630 
                  src="FAT文件系统原理(一).files/2004420123027360.gif" width=358 
                  border=0><BR><BR>3.2 扩展分区:<BR>&nbsp;&nbsp;&nbsp; 
                  扩展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导记录( Extended Boot Record, 
                  EBR),也有人称之为虚拟mbr或扩展mbr,意思是一样的。扩展引导记录包括一个扩展分区表和该扇区的标签。扩展引导记录将记录只包含扩展分区中每个逻辑驱动器的第一个柱面的第一面的信息。一个逻辑驱动器中的引导扇区一般位于相对扇区32或63。但是,如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区。第二项指向下一个逻辑驱动器的EBR。如果不存在进一步的逻辑驱动器,第二项就不会使用,而且被记录成一系列零。如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区。第二个逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的EBR。扩展分区表的第三项和第四项永远都不会被使用。<BR>&nbsp;&nbsp;&nbsp; 
                  通过一幅4分区的磁盘结构图可以看到磁盘的大致组织形式。如图5:<BR>&nbsp;&nbsp;&nbsp; <IMG 
                  height=570 src="FAT文件系统原理(一).files/2004420123027371.gif" 
                  width=265 border=0><BR><FONT color=#c0c0c0><SPAN 
                  style="FONT-WEIGHT: 700; BACKGROUND-COLOR: #ffff00"></SPAN></FONT><BR>&nbsp;&nbsp;&nbsp; 
                  关于扩展分区,如图6所示,扩展分区中逻辑驱动器的扩展引导记录是一个连接表。该图显示了一个扩展分区上的三个逻辑驱动器,说明了前面的逻辑驱动器和最后一个逻辑驱动器之间在扩展分区表中的差异。<BR><IMG 
                  height=535 src="FAT文件系统原理(一).files/2004420123027797.gif" 
                  width=316 border=0><BR><FONT color=#c0c0c0><SPAN 
                  style="FONT-WEIGHT: 700; BACKGROUND-COLOR: #ffff00"></SPAN></FONT>&nbsp;&nbsp;&nbsp; 
                  除了扩展分区上最后一个逻辑驱动器外,表2中所描述的扩展分区表的格式在每个逻辑驱动器中都是重复的:第一个项标识了逻辑驱动器本身的引导扇区,第二个项标识了下一个逻辑驱动器的EBR。最后一个逻辑驱动器的扩展分区表只会列出它本身的分区项。最后一个扩展分区表的第二个项到第四个项被使用。&nbsp;&nbsp;&nbsp;</P>
                  <P>
                  <TABLE id=table1 width="49%" border=1><!-- MSTableType="nolayout" -->
                    <TBODY>
                    <TR>
                      <TD align=middle colSpan=2>
                        <P><FONT size=2>&nbsp;&nbsp; </FONT><FONT 
                        size=2>表2&nbsp; 扩展分区表项的内容</FONT></P></TD></TR>
                    <TR>
                      <TD align=middle width="33%"><FONT 
                      size=2>扩展分区表项</FONT></TD>
                      <TD align=middle width="64%"><FONT 
                      size=2>分区表项的内容</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="33%"><FONT size=2>第一个项</FONT></TD>
                      <TD align=middle width="64%"><FONT 
                        size=2>包括数据的开始地址在内的与扩展分区中当前逻辑驱动器有关的信息</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="33%"><FONT size=2>第二个项</FONT></TD>
                      <TD align=middle width="64%"><FONT 
                        size=2>有关扩展分区中的下一个逻辑驱动器的信息,包括包含下一个逻辑驱动器的EBR的扇区的地址。如果不存在进一步的逻辑驱动器的话,该字段不会被使用</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="33%"><FONT size=2>第三个项</FONT></TD>
                      <TD align=middle width="64%"><FONT 
size=2>未用</FONT></TD></TR>
                    <TR>
                      <TD align=middle width="33%"><FONT size=2>第四个项</FONT></TD>
                      <TD align=middle width="64%"><FONT 
                    size=2>未用</FONT></TD></TR></TBODY></TABLE></P>
                  <P><FONT color=#c0c0c0></FONT>&nbsp;&nbsp;&nbsp; 
                  扩展分区表项中的相对扇区数字段所显示的是从扩展分区开始到逻辑驱动器中第一个扇区的位移的字节数。总扇区数字段中的数是指组成该逻辑驱动器的扇区数目。总扇区数字段的值等于从扩展分区表项所定义的引导扇区到逻辑驱动器末尾的扇区数。</P>
                  <P>&nbsp;&nbsp;&nbsp; 
                  有时候在磁盘的末尾会有剩余空间,剩余空间是什么呢?我们前面说到,分区是以1柱面的容量为分区粒度的,那么如果磁盘总空间不是整数个柱面的话,不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以一般无法利用。照道理说,磁盘的物理模式决定了磁盘的总容量就应该是整数个柱面的容量,为什么会有不够一个柱面的空间呢。在我的理解看来,本来现在的磁盘为了更大的利用空间,一般在物理上并不是按照外围的扇区大于里圈的扇区这种管理方式,只是为了与操作系统兼容而抽象出来CHS。可能其实际空间容量不一定正好为整数个柱面的容量吧。关于这点,如有高见,请告知<A 
                  href="http://www.sjhf.net/">http://www.sjhf.net/</A>或<A 
                  href="mailto:zymail@vip.sina.com">zymail@vip.sina.com</A>,<A 
                  href="mailto:sjhf@sjhf.net">sjhf@sjhf.net</A>。&nbsp; </P>
                  <P></P>
                  <P></P></TD></TR></TBODY></TABLE></TD></TR>
        <TR>
          <TD colSpan=2>
            <TABLE 
            style="BORDER-TOP: #6687ba 1px solid; BORDER-BOTTOM: #6687ba 1px solid" 
            height=50 cellSpacing=5 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD>
                  <LI>上一篇文章: 没有了 <BR>
                  <LI>下一篇文章: <A 
                  title="文章标题:FAT文件系统原理(二)&#13;&#10;作    者:菜刀|zymail@vip.sina.com&#13;&#10;更新时间:2004-4-20 12:33:18&#13;&#10;点击次数:546" 
                  href="http://www.sjhf.net/Article_Show.asp?ArticleID=3">FAT文件系统原理(二)</A> 
                  </LI></TD></TR></TBODY></TABLE></TD></TR>
        <TR class=tdbg_leftall align=right>
          <TD colSpan=2>【<A 
            href="http://www.sjhf.net/Article_Comment.asp?ArticleID=2" 
            target=_blank>发表评论</A>】【<A 
            href="http://www.sjhf.net/SendMail.asp?ArticleID=2" 
            target=_blank>告诉好友</A>】【<A 
            href="http://www.sjhf.net/Article_Print.asp?ArticleID=2">打印此文</A>】【<A 
            href="javascript:window.close();">关闭窗口</A>】</TD></TR></TBODY></TABLE>
      <TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
        <TBODY>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -