📄 fat32中文版.txt
字号:
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 + -