MBR
之前为了让MCU能够读取SD卡的数据,研究了很久FAT文件系统,查了很多资料,走了很多弯路,比如MBR和DBR的区别,就花了很久才弄清楚。
MBR(主引导记录)严格说并不属于FAT文件系统的部分,但如果没有MBR,MCU是没有办法找到DBR的,而DBR是FAT的引导。如果不了解这点,就没办法理解FAT文件系统采用双引导是什么意思。
FAT文件系统下,一个磁盘的结构如下
MBR | 若干空扇区 | DBR | FSinfo | 若干空扇区 | FAT表区 | FAT备份扇区 | 若干空扇区 | 根目录区 | 文件夹及文件数据区 |
---|---|---|---|---|---|---|---|---|---|
1 sector | N sectors | 1 sector | 1 sector | N sectors | N sectors | N sectors | N sectors | N sectors | |
512bytes | 512bytes | ||||||||
物理0扇区 | 逻辑0扇区 | 簇2 |
winhex打开硬盘时,默认打开逻辑0扇区,即DBR所在扇区,需要打开物理磁盘,才能看见MBR。
这里需要理解两个名词:扇区和簇,一个扇区一般包含512个字节, 一个簇包含若干个扇区,一个簇的大小,在DBR中有记录,比如64个扇区为一个簇,那么一个簇就是32kb,但簇的第一个扇区并不是64*N个扇区,因为簇0和簇1,是不用的,根目录所在的簇为簇2,簇3第一个扇区位置= 根目录扇区+64扇区。
FAT表,就是一个簇链表,每4个字节表示一个簇,它的值指向下一个簇,这样就能存放大文件,并实现随机存储。FAT表对应值为0时,表示该簇未被占用,FSinfo扇区中,记录了下一个可分配的簇。FAT表中对应值为特定值时,表示该簇是坏簇,这样可以软件层面规避磁盘坏道。
MBR结构
446字节bootloader | 64字节DPT | 2字节有效标致 |
---|
64字节的DPT实际是由4个16字节的磁盘分区信息构成的
所以采用MBR引导的磁盘,只能分成4个主分区,大于4个分区,就必须用逻辑分区。
偏移 | 长度 | 所表达的意义 |
---|---|---|
0x0 | 1 字节 | 分区状态:如0–>非活动分区 80–> 活动分区 |
0x1 | 1 字节 | 该分区起始头(HEAD) |
0x2 | 2 字节 | 该分区起始扇区和起始柱面 |
0x4 | 1 字节 | 该分区类型:如82–> Linux Native分区 83–> Linux Swap 分区 "0B"表示分区的系统类型是FAT32,其他比较常用的有04(FAT16)、07(NTFS) |
0x5 | 1 字节 | 该分区终止头(HEAD) |
0x6 | 2 字节 | 该分区终止扇区和终止柱面 |
0x8 | 4 字节 | 该分区起始绝对扇区 |
0xc | 4 字节 | 该分区扇区数 |
一般使用FAT文件系统时,我们只用到0x8的分区起始绝对扇区,这个扇区就是DBR所在扇区。