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

📄 fat32中文版.txt

📁 FAT32中英文标准及源代码,文档包括英文原版和本人翻译的
💻 TXT
📖 第 1 页 / 共 5 页
字号:
                                                                                   Microsoft 

           Hardware White Paper 

Designing Hardware for Microsoft Operating Systems 

Microsoft Extensible Firmware Initiative 
FAT32 File System Specification 
FAT: General Overview of On-Disk Format 
Version 1.03, December 6, 2000 
Microsoft Corporation 




译注: 

    刚完成的项目内容涉及 FAT 文件系统,因此在查阅手册的同时把文档翻译了一下,希望能对那些和我 

一样初次使用 FAT 的朋友有所帮助。因本人对 FAT 并不十分了解,翻译所做的也只是文字表面工作,出现 

各种错误在所难免,因此:本文只适用于初学者作为了解材料,需要获得技术信息的朋友请查阅原版英文 

资料! 

    发现错误的朋友请mail yuwh@amoi.com.cn指正,本人将不胜感激。 


Microsoft Extensible Firmware Initiative FAT32 File System Specification 


IMPORTANT-READ CAREFULLY: 
…… 

原文长 5 页,大意是告诫人们不要使用 D 版云云,此略。 



本文的一些约定 


    以字符“0x”开头的数字为 16 进制,若开头没有字符“0x”则表明该数字为 10 进制。 

    本文的程序使用 C 语言书写,书写风格可能与教科书中严格定义的有所出入。 

    一些变量在程序中没有注明其数据类型是 16-bit 还是 32-bit,因为我们知道你有能力正确地完成这 

些数据类型之间的转换,并保证在转换 32-bit 为 16-bit 的过程中不会造成数据丢失。同时请注意,所有 

的数据类型均是无符号类型(UNSIGNED),不要尝试使用有符号整形(signed integer types)来进行 FAT 

运算,否则一些 FAT 卷将会因此而出错。 



概述(适用于所有 FAT 类型) 


    起先所有的 FAT 文件系统都是为 IBM PC 机器而设计的,这说明了一个重要的问题:FAT 文件系统在磁 

盘上的数据是以“小端” (little-endian) 结构存储的。我们使用 4 个 8-bit 的字节 -- 起始字节为 

                                                             FAT: General Overview of On-Disk Format 



byte[0],结束字节为 byte[3] -- 来存储一个 32-bit 的 FAT 项(FAT entry)。然后分别给这 32 位编号为 

00-31,从下表我们可以清楚地看到这 32 位是如何排序的(最低位为 00). 


    byte[3]     3 3 2 2 2 2 2 2 
               1 0 9 8 7 6 5 4 

    byte[2]     2 2 2 2 1 1 1 1 
               3 2 1 0 9 8 7 6 

    byte[1]     1 1 1 1 1 1 0 0 
               5 4 3 2 1 0 9 8 

    byte[0]     0 0 0 0 0 0 0 0 
               7 6 5 4 3 2 1 0 


    这对于那些使用“大端”(big-endian)存储结构的机器就显得尤为重要,因为在磁盘存取数据之前, 

必须先完成 big-endian 和 little-endian 之间的转换。 

    每个 FAT 文件系统由 4 部分组成,这些基本区域按如下顺序排列: 

    0 – 保留区(Reserved Region) 

    1 – FAT 区(FAT Region) 

    2 – 根目录区(Root Directory Region, FAT32 卷没有此域) 

    3 – 文件和目录数据区(File and Directory Data Region) 




启动扇区与 BPB 


    BPB(BIOS Parameter Block)是 FAT 文件系统中第一个重要的数据结构,它位于该 FAT 卷的第一个扇区, 

同时也属于 FAT 文件系统基本区域的保留区。这个扇区又叫做“启动扇区”、“保留扇区”、“0 扇区”,众多 

的叫法都说明一个相同的问题:该扇区是 FAT 卷的第一个扇区。 

    这是 FAT 文件系统中第一个让人感到迷惑的地方,对于 MS-DOS 1.x 的版本,启动扇区中并没有 BPB 这 

么一个东西,FAT 文件系统的最早期版本只有两种不同的格式:使用于单面或双面的 360K 5 寸软盘。这两 

种格式是通过 FAT 的第一个字节(FAT[0]的低 8 位)来区分的。 

    在 MS-DOS 2.x 以后,启动扇区里增加了 BPB 用于区分磁盘介质,同时不再支持老的磁盘介质区分方式 

(用 FAT 的第一个字节来区分),所有的 FAT 文件系统卷必须在启动扇区中包含 BPB。 

    这又是一个迷惑人的地方,BPB 具体是什么样的?在 MS-DOS 2.x 的定义中,每个 FAT 卷的扇区数不能 

多于 65536(每个扇区 512 字节的话最多 32M),这一限定是由于定义“总扇区数”的变量本身是一个 16-bit 

的数据类型。这一个限制在 MS-DOS 3.x 中有所改进,它使用一个 32-bit 的变量来存储“总扇区数”。 

    在 Win95 操作系统,确切的说应该是在 OSR2(OEM Service Release 2)出现的时候 BPB 的内容有了 

新的变化,在这一版本中引入了新的 FAT 类型 —— FAT32。在 FAT16 中,由于 FAT 表的大小限制了有效的 

簇数(cluster),同时也就限制了磁盘空间的大小,如果每个扇区为 512 字节的话,那么 FAT16 格式只能 

支持到 2G。FAT32 的引入改变了这一状况,不再需要增加分区来管理大于 2G 的硬盘。 

    FAT32 的 BPB 内容和 FAT12/FAT16 的内容在 BPB_ToSet32 区域以前完全一致,而从偏移量 36 开始他们 

的内容有所区别,具体内容要看 FAT 类型为 FAT12/FAT16 还是 FAT32(后面的内容会提到如何区分 FAT 格式) 

这点保证了在启动扇区中包含一个完整的 FAT12/FAT16 或 FAT32 的 BPB 内容,这么做是为了达到最好的兼 

容性,同时也为了保证所有的 FAT 文件系统驱动程序能正确地识别和驱动不同 FAT 格式,并让他们良好地 

工作,因为他们包含了现有的全部内容。 

    NOTE: 在以下的描述中,凡名称与 BPB_开头的域都是 BPB 的一部分,凡名称与 BS_开头的项都是启动 


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



扇区(boot sector)的一部分,而不是真正属于 BPB 内容。下面是 FAT 0 扇区的内容,BPB 也包含其中。 

启动扇区与 BPB 结构 

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

                                         跳转指令。指向启动代码,允许以下两种形式: 

                                         jmpBoot[0] = 0xEB, jmpBoot[1] = 0x??, jmpBoot[2] = 0x90 


                                         jmpBoot[0] = 0xE9, jmpBoot[1] = 0x??, jmpBoot[2] = 0x?? 

     BS_jmpBoot           0          3      0x??表示该字节可以为任意 8-bit 值,这是 Intel x86 架构 3 

                                         字节的无条件转移指令,跳转到操作系统的启动代码,这些 

                                         启动代码往往紧接 BPB 后面 0 扇区里的剩余字节,当然也 

                                         可能位于其他扇区。以上的两种形式任取。jmpBoot[0] = 

                                         0xEB 是较常用的一种格式 

                                         建议值为“MSWIN4.1” 此域经常引起人们的误解,其实这 

                                         只是一个字符串而已,Microsoft 的操作系统似乎并不关心 

                                         此域。但其他厂商的 FAT 驱动程序可能会检测此项,这就是 

     BS_OEMName           3          8      为什么建议将此域设为 “MSWIN4.1”的原因,这样可以尽 

                                         量避免兼容性的问题。你可以更改它的内容,但这有可能造 

                                         成某些 FAT 驱动程序无法识别该磁盘。很多情况下该域用于 

                                         显示格式化该 FAT 卷的操作系统的名称。 

                                         每扇区字节数,取值只能是以下的几种情况:512、1024、 

                                         2048 或是 4096,设置为 512 将取得最好的兼容性,目前有 

                                         很多的 FAT 代码都是硬性的规定每扇区字节数为 512,而不 

                                         是实际检测该此域的值,Microsoft 的操作系统能够很好地 

  BPB_BytsPerSec          11         2      支持 1024、2048 和 4096 各种数值。 

                                         NOTE: 请勿曲解此处“最好的兼容性”的意思,如果某些存 

                                         储介质的物体特性决定其值为 N,那么你就必须使用该数值 

                                         N,该 N 值一定是小于或是等于 4096。那么取得“最好的兼 

                                         容性”的办法就是使用该特定的 N 值。 

                                         每簇扇区数,其值必须是 2 的整数次方(该整数必须>=0), 

                                         如 1、2、4、8、16、32、64 或 128,同时还必须保证每簇 

                                         的 字 节 数 不 超 过 32K , 既 : 保 证 

  BPB_SecPerClus          13         1      (BPB_BytsPerSec * BPB_SecPerClus <= 32K (1024*32) 

                                         该值大于 32K 是绝对不允许的,虽然有些版本的操作系统支 

                                         持每簇字节数最大到 64K,但很多应用程序的安装程序都无 

                                         法在这样的 FAT 文件系统上正常运行。 

                                         保留区中保留扇区的数目,保留扇区从 FAT 卷的第一个扇区 

                                         开始,此域不能为 0,对于 FAT12 和 FAT16 必须为 1,FAT32 

  BPB_RsvdSecCnt          14         2      的典型取值为 32,目前很多 FAT 程序都是硬性规定 

                                         FAT12/FAT16 的保留扇区数为 1,而不对此域进行实际的检 

                                         测,Microsoft 的操作系统支持任何非零的值. 

                                         此卷中 FAT 表的份数。任何 FAT 格式此域都建议为2。虽 

     BPB_NumFATs          16         1      然此域取值为其他>=1 的数值也是合法的,但是很多 FAT 

                                         程序和部分操作系统对于此项不为2的时候将无法正常工 



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



                                          作。当不为2时,Microsoft 的操作系统仍能良好的工作。 

                                          但仍然强烈建议此域为2。 

                                          选择此项的标准值为2的原因是为了提供一份 FAT 表的备 

                                          份,当其中一个 FAT 表所在的扇区被损坏时我们可以从备 

                                          份的 FAT 表中读取正确的数据。但是对于一些非磁盘介质 

                                          的存储器(如 FLASH 卡)这一特性变得毫无用处,如果想 
                                                                    , 

                                          使用 1 个 FAT 表来节省空间,那么带来的问题将是某些操 

                                          作系统无法识别该 FAT 卷。 

                                          对于 FAT12 和 FAT16 此域包含根目录中的目录项数(每个 

                                          项长度为 32 bytes),对于 FAT32,此项必须为 0。对于 FAT12 
  BPB_RootEntCnt            17        2 
                                          和 FAT16,此数值乘以 32 必须为 BPB_BytsPerSec 的偶数倍, 

                                          为了达到最好的兼容性,FAT12/FAT16 应该取值为 512. 

                                          早期版本中 16-bit 的总扇区数,这里的总扇区数包括 FAT 

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

    BPB_TotSec16            19        2      那么 BPB_TotSec32 必须非 0,对于 FAT32,此域必须为 0。 

                                          对于 FAT12/FAT16,此域填写总扇区数, 如果该数值小于 

                                          0x10000 的话,BPB_TotSec32 必须为 0。 

                                          对于“固定”(不可移动)存储介质而言,0xF8 是标准值, 

                                          对于可移动存储介质,经常使用的数值是 0xF0,此域合法的 

                                          取值可以取 0xF0, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 
      BPB_Media             21        1 
                                          0xFE 和 0xFF。另外要提醒的一点是,无论此域写入什么数 

                                          值,同时也必须在 FAT[0]的低字节写入相同的值,这是因 

                                          为早期的 MSDOS 1.x 使用该字节来判定是何种存储介质。 

                                          FAT12/FAT16 一个 FAT 表所占的扇区数,对于 FAT32 此域必 
     BPB_FATSz16            22        2 
                                          须为零,在 BPB_FATSz32 中有指定其 FAT 表的大小 

                                          每磁道扇区数,用于 BIOS 中断 0x13,此域只对于有“特殊 

    BPB_SecPerTrk           24        2      形状”(由磁头和柱面分割为若干磁道)的存储介质有效, 

⌨️ 快捷键说明

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