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

📄 fat32中文版.txt

📁 FAT32中英文标准及源代码,文档包括英文原版和本人翻译的
💻 TXT
📖 第 1 页 / 共 5 页
字号:
                                          同时必须可以调用 BIOS 的 0x13 中断得到此数值 

                                          磁头数,用于 BIOS 的 0x13 中断, 类似于上面的 

    BPB_NumHeads            26        2      BPB_SecPerTrk,只有对特殊的介质才有效,此域包含一个至 

                                          少为 1 的数值,比如 1.4M 的软盘此域为 2 

                                          在此 FAT 分区之前所隐藏的扇区数,必须使得调用 BIOS 的 

     BPB_HiddSec            28        4      0x13 中断可以得到此数值,对于那些没有分区的存储介质, 

                                          此域必须为 0,具体使用什么值由操作系统决定。 

                                          该卷总扇区数(32-bit),这里的总扇区数包括 FAT 卷上四 

                                          个基本区的全部扇区, 此域可以为 0,若此域为 0, 

    BPB_TotSec32            32        4      BPB_TotSec16 必须为非 0,对于 FAT32,此域一定是非 0。对 

                                          于 FAT12/FAT16,如果总扇区数大于或等于 0x10000 的话, 

                                          此域就是总扇区数,同时 BPB_TotSec16 的值为 0 




    从 Offset 36 开始 FAT12/FAT16 的内容开始区别于 FAT32,现在分两个表格列出,下表为 FAT12/FAT16 

的内容: 




                                                                                          第 4 页 

                                                     FAT: General Overview of On-Disk Format 



                      Offset  大小 
      名称                                                   描述 
                      (byte)  (byte) 

                                   用于 BIOS 中断 0x13 得到磁盘驱动器参数,(0x00 为软盘, 

    BS_drvNum           36       1    0x80 为硬盘)。 

                                   NOTE:此域的值实际上由操作系统来决定 

BS_Reserved1 (壹)       37       1    保留(供 NT 使用),格式化 FAT 卷时必须把此域设置为 0 

   BS_BootSig           38       1    扩展引导标记(0x29),用于指明此后的 3 个域可用 

                                   卷标序列号,此域以 BS_VolLab 一起可以用来检测磁盘是否 

    BS_VolID            39       4    正确,FAT 文件系统可以用此判断连接的可移动磁盘是否正 

                                   确,此域往往是由时间和日期组成的一个 32 位值。 

                                   磁盘卷标,此域必须与根目录中 11 字节长的卷标一致。 

                                   NOTE: FAT 文件系统必须保证在根目录的卷标文件更改或 
    BS_VolLab           43      11 
                                   是创建的同时,此域的内容能得到及时的更新,当 FAT 卷没 

                                   有卷标时,此域的内容为“NO NANM        ” 

                                   以下的几种之一:“ FAT12 ”、“FAT16      ”、“FAT32     ”. 

                                   NOTE: 不少人错误的认为 FAT 文件系统的类型由此域来 

                                   确定,仔细点你就能发现此域并不是 BPB 的一部分,只是一 

                                   个字符串而已,Microsoft 的操作系统并不使用此域来确定 
  BS_FilSysType         54       8 
                                   FAT 文件的类型,因为它常常被写错或是根本就不存在,后 

                                   面将讨论如何来检测一个 FAT 文件系统的类型,但不管如 

                                   何,建议您在此域填写正确的信息,因为一些非 Microsoft 

                                   的操作系统会检测此域。 

 下表为 FAT32 的内容: 

                      Offset  大小 
      名称                                                   描述 
                      (byte)  (byte) 

                                   一个 FAT 表所占的扇区数,此域为 FAT32 特有,同时 
   BPB_FATSz32          36       4 
                                   BPB_FATSz16 必须为 0。 

                                   此域 FAT32 特有。 

                                   Bits 0-3:不小于 0 的活动 FAT(active FAT)数目,只有 

                                   在镜像(mirroring)禁止时才有效。 

                                   Bits 4-6: 保留。 
  BPB_ExtFlags          40       2 
                                   Bits 7: -- 0 表示 FAT 实时镜像到所有的 FAT 表中。 

                                            -- 1 表示只有一个活动的 FAT 表,这个表就是 

                                            bits 0-3 所指定的那个。 

                                   Bits 8-15: 保留 

                                   此域 FAT32 特有。高位为 FAT32 的主版本号,底位为次版本 

                                   号,这个版本号是为了以后更高级 FAT 版本考虑,假设当前 

    BPB_FSVer           42       2    的操作系统所能支持的 FAT32 版本号为 0:0。那么该操作系 

                                   统检测到此域不为 0 时,它便会忽略这个 FAT 卷,因为它的 

                                   版本号比系统能支持的版本要高。 

                                   此域 FAT32 特有。根目录所在第一个簇的簇号,通常该数值 

                                   为 2,但不是必须为 2。 
  BPB_RootClus          44       4 
                                   NOTE: 磁盘工具在改变根目录的位置时,必须想办法让磁 

                                   盘上第一个非坏簇作为根目录的第一个簇(比如第 2 簇,除 


                                                                                      第 5 页 

                                                            FAT: General Overview of On-Disk Format 



                                           非它已经被标记为坏簇),这样的话,如果此域正好为 0 的 

                                           话磁盘检测工具也能轻松的找到根目录所在簇的位置。 

                                           此域 FAT32 特有。保留区中 FAT32 卷 FSINFO 结构所占的扇 

                                           区数,通常为 1。 

      BPB_FSInfo            48         2      NOTE: 在 Backup Boot 中会有一个 FSINFO 的备份,但该备 

                                           份只是更新其中的指针,也就是说无论是主引导记录还是备 

                                           份引导记录都是指向同一个 FSINFO 结构 

                                           此域 FAT32 特有。如果不为 0,表示在保留区中引导记录的 

    BPB_BkBootSec           50         2      备份数据所占的扇区数,通常为 6。同时不建议使用 6 以外 

                                           的其他数值。 

                                           此域 FAT32 特有。用于以后 FAT 的扩展使用,对于 FAT32, 
     BPB_Reserved           52        12 
                                           此域用 0 填充。 

                                           与 FAT12/FAT16 的定义相同,只不过两者位于启动扇区不同 
      BS_DrvNum             64         1 
                                           位置而已。 

                                           与 FAT12/FAT16 的定义相同,只不过两者位于启动扇区不同 
     BS_Reserved1           65         1 
                                           位置而已。 

                                           与 FAT12/FAT16 的定义相同,只不过两者位于启动扇区不同 
      BS_BootSig            66         1 
                                           位置而已。 

                                           与 FAT12/FAT16 的定义相同,只不过两者位于启动扇区不同 
       BS_VolID             67         4 
                                           位置而已。 

                                           与 FAT12/FAT16 的定义相同,只不过两者位于启动扇区不同 
    BS_FilSysType           71        11 
                                           位置而已。 

                                           通常设置为“FAT32 ”,请参照 FAT12/FAT16 部分关于此 
    BS_FilSysType           82         8 
                                           域的陈述,该域的内容和 FAT 类型的判定无关。 

    关于 FAT 启动扇区还有一点重要的说明:我们假设里面的内容是按字节排序的,那么扇区[510]的内容 

一定是 0x55,扇区[511]的内容一定是 0xAA。 

    NOTE: 很多 FAT 的资料文档会错误地把 0xAA55 说成是“启动扇区最后两字节的内容”,这样的陈述是 

正确的如果 -- 仅仅是如果 -- BPB_BytsPerSec 的值为 512 的话。若是 BPB_BytsPerSec 的值大于 512, 

该标记的位置并没有变(虽然在启动扇区的最后两个字节写上 0xAA55 完全没有问题)。 

    关于 BPB_TotSec16/32 这里再作一点补充:假设现在我们有一块磁盘或一个分区,它的扇区数为 DskSz, 

如果 BPB_aTotSec(BPB_TotSec16 或是 BPB_TotSec32 其中不为 0 的那个)的值小于或等于 DskSz 并不会使 

该 FAT 卷在使用中出现什么错误,实际上,BPB_TotSec16/32 的值不要比 DskSz 小得离谱就不会有什么错 

误。 

    这样做将造成磁盘空间的浪费,程序本身并不会认为该 FAT 卷存在什么错误。但是,如果 

BPB_TotSec16/32 的值比 DskSz 大的话将会使 FAT 卷遭到严重的损坏,因为它超出了存储介质或是磁盘分 

区的边界。当 BPB_TotSec16/32 的值比 DskSz 大时,一些数据将不幸地被丢失。 



FAT 数据结构(FAT Data Structure) 


     接下来一个重要的数据结构就是 FAT 表(File Allocation Table) ,它是一一对应于数据区簇号的列 

表。 

     文件系统分配磁盘空间按簇来分配的。因此,文件占用磁盘空间时,基本单位不是字节而是簇,即使 

某个文件只有一个字节,操作系统也会给他分配一个最小单元——即一个簇。为了可以将磁盘空间有序地 

分配给相应的文件,而读取文件的时候又可以从相应的地址读出文件,我们把数据区空间分成 


                                                                                           第 6 页 

                                                             FAT: General Overview of On-Disk Format 



BPB_BytsPerSec * BPB_SecPerClus 字节长的簇来管理, FAT 表项的大小与 FAT 类型有关,FAT12 的 表项 

为 12-bit,FAT16 为 16-bit,而 FAT32 则为 32-bit。对于大文件,需要分配多个簇。同一个文件的数据并 

不一定完整地存放在磁盘中一个连续的区域内,而往往会分成若干段,像链子一样存放。这种存储方式称 

为文件的链式存储。为了实现文件的链式存储,文件系统必须准确地记录哪些簇已经被文件占用,还必须 

为每个已经占用的簇指明存储后继内容的下一个簇的簇号,对文件的最后一簇,则要指明本簇无后继簇。 

这些都是由 FAT 表来保存的,FAT 表的对应表项中记录着它所代表的簇的有关信息:诸如是否空,是否是 

坏簇,是否已经是某个文件的尾簇等。 

     以 FAT16 为例说明 FAT 区的结构如下: 



             表项        示例代码                            描述 

              0            FFF8         磁盘标识字,必须为 FFF8 

              1            FFFF         第一簇已经被占用 

              2            0003         0000h :                可用簇 

              3            0004         0002h – FFFEFh:      已用簇,表项中存放文件下 

             ……          ……                              个簇的簇号 

              N            FFFF         FFFF0h - FFF6h :      保留簇 

             N+1           0000         FFF7h :                坏簇 

             ……          ……         FFF8h – FFFFh :      文件的最后一簇 



     FAT 的项数与硬盘上的总簇数相关(因为每一个项要代表一个簇,簇越多当然需要的 FAT 表项越多), 

每一项占用的字节数也与总簇数有关(因为其中需要存放簇号,簇号越大当然每项占用的字节数就大) 

     这里说一下 FAT 目录,其实它和普通的文件并没有什么不一样的地方,只是多了一个表示它是目录的 

属性(attrib),另外就是目录所链接的内容是一个 32 字节的目录项(32-byte FAT directory entries 

后面有具体讨论)。除此之外,目录和文件没什么区别。FAT 表是根据簇数和文件对应的。第一个存放数据 

的簇是簇 2。 

     簇 2 的第一个扇区(磁盘的数据区)根据 BPB 来计算,首先我们计算根目录所占的扇区数: 

     RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec – 1)) / BPB_BytsPerSec; 

     因为 FAT32 的 BPB_RootEntCnt 为 0, 所以对于 FAT32 卷 RootDirSectors 的值也一定是 0。上式中的 

32 是每个目录项所占的字节数。计算结果四舍五入。 

     数据区的起始地址,簇 2 的第一个扇区由下面公式计算: 

     If(BPB_FATSz16 != 0) 

          FATSz = BPB_FATSz16; 

     Else 

          FATSz = BPB_FATSz32; 

     FirstDataSector = BPB_RsvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors; 

     NOTE: 扇区号指的是针对卷中包含 BPB 的第一个扇区的偏移量(包含 BPB 的第一个扇区是扇区 0), 

并不是必须直接和磁盘的扇区相对应。因为卷的扇区 0 并不一定就是磁盘的扇区 0。 

     给一个合法的簇号 N,该簇的第一个扇区号(针对 FAT 卷扇区 0 的偏移量)由下式计算: 

⌨️ 快捷键说明

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