在介绍exfat文件系统之前,首先介绍一下MBR,MBR作为传统的DOS系统的引导扇区,其中可能存储有bootloader的code,但是如果用于linux这样的系统,这部分是不许要的,因此,一般是0.
0-0x88 | 主引导程序 | 引导程序 |
0x89– 0x1bd | 出错信息数据区 | 数据区 |
0x1be– 0x1cd | 分区1(16字节) | 分区1 |
0x1ce– 0x1dd | 分区2(16字节) | 分区2 |
0x1de– 0x1ed | 分区3(16字节) | 分区3 |
0x1ee– 0x1fd | 分区4(16字节) | 分区4 |
0x1fe | 0x55 | 结束标志 |
0x1ff | 0xaa | 结束标志 |
Table1
由table1,可以看到从0x1be开始,是分区表的信息,最后两个字节是结束标志,对于Linux系统来说,真正要用到的是分区表这部分的信息。
字节偏移 | 内容 |
0 | 引导标志,0x80(活动分区),0x00(非活动分区) |
1,2,3 | 分区起始的磁头号,扇区号,柱面号 磁头号:1 扇区号:第2字节的低6bit. 柱面号:第2字节高2bit+第3字节
|
4 | 分区类型: 00H :未指定 06H:FAT16 0BH:FAT32 05H:扩展分区 07H:NTFS 0FH:(LBA)扩展分区 83H:linux分区 |
5,6,7 | 分区的结束磁头号,扇区号,柱面号 磁头号: 第5字节 扇区号:第6字节的低6bit 柱面号:第6字节的高2bit+第7字节 |
8,9,10,11 | 本分区之前已经使用的扇区数,即分区的开始地址 |
12,13,14,15 | 分区的总的扇区数。 |
对于固态硬盘来说,扇区,磁头等物理上是不存在的,所以我们主要关注分区的开始地址和分区的长度。
下面是一个SD卡,大小是16G,通过fdisk分成两个分区
图1
从图1知,分区1的起始地址是10000,长度是10000000– 10000 + 1 = 9990001
分区2的起始地址是10000001,长度是31116287– 10000001 + 1 = 21116287.
下图是我通过一个小应用解析的MBR的数据内容,主要开分区表的信息。
图2
图3
图4
综合图2,图3,图4可获取如下信息:
分区1的起始地址是2710H,即十进制的10000,长度是986f71H,即十进制9990001
分区2的起始地址是989681H,即十进制10000001,长度是0142357fh,即十进制21116287.
这些数据和以上我们计算的完全吻合。
对于SD卡,MMC,SSD等,由于物理地址是线性的,因此没有磁头,柱面等概念,因此这些数据一般来说,没有意义。
Exfat文件系统。
Exfat文件系统是微软发布的一个类FAT的文件系统规范,支持大于4G的文件。