📄 fat32中文版.txt
字号:
FSI_LeadSig 0 4 值为0x41615252,这个标记用来表示该扇区为FSInfo扇区。
保留为以后扩展使用,FAT32 格式化程序应该把此域全部设
FSI_Reserved1 4 480
置为 0,当前版本的 FAT 程序不可以访问该域。
FSI_StrucSig 484 4 值为 0x61417272, 更具体地表明该扇区已经被使用
保存最新的剩余簇数量,如果为 0xFFFFFFFF 表示剩余簇未
FSI_Free_Count 488 4 知,需要重新计算,初此之外其他的值都可以用,而且不要
求十分精确,但必须保证其值<=磁盘所有的簇数。
该域为 FAT 驱动程序提供一条有利的线索,它告诉驱动程序
从哪里开始寻找剩余簇。因为 FAT32 的 FAT 表可能非常的庞
大,如果已经分配的簇很多的话要从头开始查找剩余簇将耗
FSI_Nxt_free 492 4 费大量时间。通常这个值被设定为驱动程序最后分配出去的
簇号。如果值为 0xFFFFFFFF,那么驱动程序必须从簇 2 开
始查找,除此之外其他的值都可以使用,当然前提是这个值
必须合法的。
保留为以后扩展使用,FAT32 格式化程序应该把此域全部设
FSI_Reserved2 496 12
置为 0,当前版本的 FAT 程序不可以访问该域。
值为0xAA550000, 此结束标记用来表示这是一个FSInfo扇
FSI_TrailSig 508 4 区,注意次域的高两位的偏移量为 510 和 511,这和启动扇
区在相同偏移处的标记是一样的。
FAT32 区别于 FAT12/FAT16 另外一个地方就是 BPB_BkBootSec,FAT12/FAT16 有可能由于丢失启动扇区
的内容而使得整个卷都无法访问,这是一个“单点错误(single point of failure)”,为了避免这种严重
的后果,FAT32 中引进了 BPB_BkBootSec,FAT32 在扇区号为 6 的地方完整地拷贝了一份启动扇区的备份,
包括 BPB 的内容。
当启动扇区的内容被损坏后,磁盘修复程序只需要把启动备份扇区中的数据拷回到启动扇区即可,即
使在启动扇区被损坏的情况下,磁盘驱动程序仍然可以在更换硬盘之前正常访问该卷。
在第二种情况下——扇区 0 被损坏——这就是为什么 BPB_BkBootSec 的值为什么必须为 6 的原因,当
扇区 0 不可读时,很多不同的操作系统都是硬性检查 FAT32 卷在扇区 6 的启动备份。保存在扇区 6 中的是
一个完整的启动记录。Microsoft 的 FAT32 的“启动扇区”实际上是由 3 个长度为 512 字节的扇区组成,
在 BPB_BkBootSec 扇区开始的启动备份中完整地包含了这 3 个扇区。FSInfo 也在其中,虽然在备份中
BPB_FSInfo 的内容和 0 扇区中 BPB_FSInfo 所指向的是同一个 FSInfo 结构。
NOTE: 这三个扇区和启动扇区一样也在偏移量为 510 和 511 的地方包含标记 0xAA55(参看前面的叙
第 14 页
FAT: General Overview of On-Disk Format
述)。
FAT 目录结构(FAT Directory Structure)
这里我们先忽略长目录项的情况,只讨论短目录项。
FAT 目录其实就是一个由 32-bytes 的线性表构成的“文件”。根目录(root directory)是一个特殊
的目录,它存在于每一个 FAT 卷中。对于 FAT12/16,根目录存储在磁盘中固定的地方,它紧跟在最后一个
FAT 表后。根目录的扇区数也是固定的,可以根据 BPB_RootEntCnt 计算得出(参见前文计算公式),对于
FAT12/16,根目录的扇区号是相对该 FAT 卷第一个扇区(0 扇区)的偏移量。
FirstRootDirSecNum = BPB_RsvdSecCnt + (BPB_NumFATs * BPB_FATSz16);
FAT32 的根目录由簇链组成,其扇区数不确定,这点和普通的文件相同,根目录的第一个扇区号存储
在 BPB_RootClus 中,根目录不同于其他的目录,没有日期和时间戳,也没有目录名( “/” 并不是其目录
名),同时根目录里没有 “.” 和 “..”这两个目录项,根目录另一个特殊的地方在于,根目录中有一个设
置了 ATTR_VOLUME_ID 位(见下表)的文件,这个文件在整个 FAT 卷中是唯一的.
FAT 的 32-byte 目录项结构
Offset 大小
名称 描述
(byte) (byte)
DIR_Name 0 11 短文件名
文件属性:
ATTR_READ_ONLY 0x01
ATTR_HIDDEN 0x02
ATTR_SYSTEM 0x04
ATTR_VOLUME_ID 0x08
ATTR_DIRECTORY 0x10
DIR_Attr 11 1 ATTR_ARCHIVE 0x20
ATTR_LONG_NAME ATTR_READ_ONLY |
ATTR_HIDDEN |
ATTR_SYSTEM |
ATTR_VOLUME_ID
前两个属性位为保留位,在文件创建时应把这两位设为 0,
在以后的使用中不能读写和更改.
保留给 Window NT 使用,在文件创建时设置该位为 0, 在以
DIR_NTRes 12 1
后的使用中不能读写和更改.
文件创建时间的毫秒级时间戳, 由于 DIR_CrtTime 的精度
DIR_CrtTimeTeenth 13 1 为 2 秒,所以此域的有效值在 0-199 之间
DIR_CrtTime 14 2 文件创建时间
DIR_CrtDate 16 2 文件创建日期
最后访问日期,请注意并没有最后访问时间域,而只有日期,
DIR_LastAccDate 18 2 这日期是指文件被读或写的日期,如果是写,该日期还应该
被写到 DIR_WrtDate 中
DIR_FstClusHI 20 2 该目录项簇号的高位字(FAT12/16 此位为 0)
DIR_WrtTime 22 2 最后写的时间,文件创建被认作写.
第 15 页
FAT: General Overview of On-Disk Format
DIR_WrtDate 24 2 最后写的日期,文件创建被认作写.
DIR_FstClusLO 26 2 该目录项簇号的低位字.
DIR_FileSize 28 2 文件大小,由 32-byte 双字组成.
DIR_NAME[0]
此处特别注释目录项的第一个字节(DIR_NAME[0]).
如果 DIR_Name[0] == 0xE5, 则此目录为空(目录项不包含文件和目录)
如果 DIR_Name[0] == 0x00, 则此目录为空(同 0xE5),并且此后的不再分配有目录项(此后所有的
DIR_Name[0]均为 0).
不同于 0xE5,如果 DIR_Name[0]的值为 0,那么 FAT 程序将不会再去检测其后续的磁盘空间,因为这些
空间都是空闲的。
如果 DIR_Name[0] == 0x05,则文件名在该位的实际值为 0xE5,0xE5 是日文中合法的字符,当需要用
0xE5 来作为 DIR_Name[0]时使用 0x05 来代替,避免程序误认为该目录项为空。
DIR_Name 域实际由两部分组成:8 个字符的主文件名和 3 个字符的扩展名。两部分如果字符数不够的
话由空格(0x20)填充(trailing space padded).
DIR_Name[0]不允许为 0x20,主文件名和扩展名之间的间隔 ‘.’并不真实的存在于 DIR_Name 中,小
写字母不允许出现在 DIR_Name 中(这些字符因不同的国家和地区而已).
以下字符不允许出现在 DIR_Name 中的任何位置:
0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5C,
0x5D,还有 0x7C。
以下是一些例子显示用户输入的文件名如何以 DIR_Name 对应:
“foo.bar” -> “FOO BAR”
“FOO.BAR” -> “FOO BAR”
“Foo.Bar” -> “FOO BAR”
“foo” -> “FOO ”
“foo.” -> “FOO ”
“PICKLE.A” -> “PICKLE A ”
“prettybg.big” -> “PRETTYBGBIG”
“ .big” -> 非法, DIR_Name[0] 不能为 0x20。
在 FAT 的目录中,所有的文件名都是唯一的,上面例子中的三个文件名看起来似乎各有千秋,事实上它
们都是相同的文件名,在同一个目录中,只能有一个 DIR_Name 被设置为 “FOO BAR”。
文件属性(DIR_Attr):
ATTR_READ_ONLY : 对这个文件的写操作将会失败.
ATTR_HIDDEN: 正常模式显示该目录列表时不显示该文件.
ATTR_SYSTEM: 是系统文件.
ATTR_VOLUME_ID: 在一个 FAT 卷中,只能有一个 “文件”设置此位,并且该文件必须在根目录中,
该文件的文件名实际上就是该卷的卷标,并且该文件的 DIR_FstClusHI 和
DIR_FstClusLO 必须为 0(卷标文件不分配空间).
ATTR_DIRECTORY: 目录
ATTR_ARCHIEVE 此属性用于支持一些备份程序,当文件创建,改名或写入时,FAT 文件系统会设置
此位,备份程序可以利用此位来判断卷中的哪些程序在上次备份到现在有更改
过.
另外 ATTR_LONG_NAME 位实际上表明此 “文件”实际上为另外一个有长文件名的文件的一部分,在下
第 16 页
FAT: General Overview of On-Disk Format
个章节我们会详细讨论长文件名的情形
创建一个目录时,该“文件” 的 ATTR_DIRECTORY 位被置位同时 DIR_FileSize 被设置为 0,
ATTR_DIRECTORY 被置位的文件不使用 DIR_FileSize 域并且该域通常为 0(目录所占空间为其起始簇到 EOC
结束的簇链所占的空间),每个目录项分配一个簇(除非是 FAT12/16 的根目录),将 DIR_FstClusLO 和
DIR_FstClusHI 的值设置为该簇的簇号,然后在 FAT 表中为该簇设置一个 EOC 标志,并把该簇的每一个字节
设置为 0,如果这是根目录,那么你的工作就完成了(根目录没有‘.’和 ‘.. ’),否则,你必须在该
目录空间(就是刚刚分配的那个簇)的头两个 32-bytes 创建两个特殊的目录项。
第一个目录项的 DIR_Name 设置为:
“. “
第二个目录项的 DIR_NAME 设置为:
“.. “
我们称这两个目录为“点”和“点点”,这两个目录的 DIR_FileSize 均设置为 0,同时两个目录的时
间和日期标志也设置为以包含它们本身的目录相同,将”.”目录项的 DIR_ClusLO 和 DIR_ClusHI 设置为与
它自身所在的目录(包含这两个“.”和“..”目录项的目录)相同。
最后把“..”目录项的 DIR_ClusLO 和 CLUS_ClusHI 设置为与刚刚创建的目录项所在目录的第一个簇号
(如果刚创建的目录在根目录则这些值为 0,FAT32 也是如此)。
“.”和”..”的特征可以概括如下:
“.”目录指向该目录本身。
“..”目录指向该目录的上级目录。
时间和日期格式(Date and Time Formats)
很多 FAT 文件系统不支持时间/日期而只支持 DIR_WrtTime 和
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -