1 概述
关于ExFat 格式描述,请参考 http://www.ntfs.com/exfat-overview.htm
先看一下大致的exFAT 文件系统结构图:
本博文主要以一个SD卡插实例,展示exFAT 的一些技术细节,一边有更深刻的了解;从格式化SD卡开始;
相关软件: winHex
2 格式化后ExFAT
2.1 格式化SD卡
在格式化中,选择文件系统类型为exFAT, 使用默认分配单元大小32K, 请记住分配单元,即簇的大小,后续分析要用到;
2.2 格式化后的数据分析
DRB区域:
DRB主要关注4个区域,
0x0~0x03: 跳转码,基本固定位“EB7690"
0x02~0x0B: OEM, 固定位“EXFAT”, 根据这两个可以确定文件系统的类型;
0x40~0x70:BPB区域,之所以在这里,据说是为了和FAT16、FAT32等区分开,不放在一起;
0x1FE~0x1FF: 结束符, 固定位"55AA"
这里重点是BPB区域,根据定义,加上上述SD卡格式化数据,制作分析表格如下;
字节偏移 |
长度 |
字段名和定义 |
实际值(hex) | 字节偏移 |
长度 |
字段名和定义 |
实际值(hex) |
0x40 |
8 |
隐藏扇区数 |
2000 | 0x68 |
2 |
卷版本号 |
0100 |
0x48 |
8 |
分区总扇区数 |
01DAAC00 | 0x6A |
2 |
卷状态 |
0000 |
0x50 |
4 |
FAT表起始扇区号 |
0800 | 0x6C |
1 |
每扇区字节数描述 |
09 |
0x54 |
4 |
FAT表扇区数 |
0F00 | 0x6D |
1 |
每簇扇区数描述 |
06 |
0x58 |
4 |
首簇起始扇区号 |
1800 | 0x6E |
1 |
FAT表个数 |
01 |
0x5C |
4 |
分区内的总簇数 |
076A50 | 0x6F |
1 |
驱动标记 |
80 |
0x60 |
4 |
根目录首簇号 |
05 | 0x70 |
1 |
分区使用百分比 |
00 |
0x64 |
4 |
卷序列号 |
1862CCC8 |
|
|
|
上述好多信息都是以扇区来描述的,所以先要搞明白扇区、簇大小分配;
扇区大小: 由偏移0x6C决定, 值为2^N 字节, 这里N=9, 所以扇区大小为512 字节;
簇大小: 由偏移0x6E 决定, 值为2^N 个扇区, 这里N=6, 所以簇大小= 2^6 * 512 = 32 KB , 还记得格式化的时候选的最小分配单元吗? 选的默认值就是32KB,就是在这里对应的;
0x40偏移: 隐藏扇区数, 0x2000
0x48偏移: 分区总扇区数, 用于计算容量, 0x01DAAC00 * 512 = 15927345152(字节), 对应于我这16G的SD卡;
0x50偏移, FAT表的位置: 所以FAT表的位置为: 扇区0x800, 即偏移0x10000处;
0x58偏移,首簇起始扇区,首簇的编号为2, 通常2号簇是分配给簇位图文件使用,所以这里也是簇位图文件的起始位置;
即 本例子中,首簇位于 扇区0x1800位置, 偏移地址为 0x1800 * 512 = 0x30000
0x60偏移,根目录首簇号: 用于确定根目录位置, 通过0x58偏移可以知道首簇的位置,那么可以通过根目录的首簇号,推断出根目录的位置信息, 即 起始位于0x1800 + (5-2) *64= 6336 扇区,即偏移 0x318000;
其余的,比较简单,字面意思即可;
解析来继续看FAT区域吧。。。。。
FAT区域:
根据DRB中的计算, 找到FAT表的位置为: 扇区0x800, 即偏移0x10000处; 如下图所示
可以看出每个FAT项占用4字节:其中0号FAT项描述介质类型,其首字节为“F8”,表示介质类型为硬盘;1号FAT项写入4个“FF”;从2号FAT项开始对应2号簇,3号FAT项开始对应3号簇,一直到最后一个簇。目前2、3、4三个FAT项中都是结束标志,说明簇位图文件、大写字符文件、根目录各占一个簇。
根目录区域:
根据DRB中的计算, 找到根目录的位置为:0x1800 + (5-2) *64= 6336 扇区,偏移0x318000 如下图所示
根据目录项的作用和结构特点,可以把目录项分为四种类型:
◆卷标目录项; 类型03H, 固定32字节, 对应上图第一个红色框,
◆簇位图文件的目录项; 类型81H, 固定32字节, 对应上图第二个红色框
◆大写字符文件的目录项;类型82H, 固定32字节,对应于上图第三个红色框
◆用户文件的目录项。 类型85H , 根据文件名长度可变, 对应第四个红色框;
具体格式描述,请参看相关规范,不做详细描述
簇位图文件区域:
根据簇位图文件的目录项可以查到,一般位于2号簇;
大写字符文件区域:
簇位图文件结束后的下一个簇一般分配给 大写字符文件使用, 也可以通过大写字符文件目录查到,在该目录中,偏移0x14表示大写字符目录起始簇的位置
这里我们可以看到起始簇未 0x04; 计算位置为 0x1800 + (4-2)*64 =0x18 80扇区,偏移0x310000
大写字符文件是ExFAT文件系统中的第二个元文件,类似于NTFS文件系统中的元文件$UpCase。Unicode字母表中的每一个字符在这个文件中都有对应的条目,用于比较、排序、计算Hash值方面。
大写字符文件是在分区格式化时创建的,该文件不允许用户访问和修改。
大写字符文件的大小固定为5836字节。
今天先分析到此结束!