文件系统学习实例(之exFAT)

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字节。

今天先分析到此结束!

猜你喜欢

转载自blog.csdn.net/wangzhiqin365/article/details/107713789
今日推荐