📄 fat32中文版.txt
字号:
同时必须可以调用 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 + -