注释:1、MBR(主引导记录)包含DPT;
2、winhex上MBR在物理扇区0,在逻辑扇区没有显示。
3、分区记录0的DPT分区表详解:
80:有效分区(00为无效);01:开始磁头;
01 00:开始扇区与开始界面;
0B:系统ID;
FE:结束磁头;
3F 1E:结束扇区与结束柱面;
3F 00 00 00:分区的开始扇区;
C1 9F 07 00:总扇区数。
4、DPT C语言结构体描述:
//DPT:分区记录结构如下
struct PartRecord
{
UINT8 Active; //0x80表示此分区有效
UINT8 StartHead; //分区的开始磁头
UINT8 StartCylSect[2];//开始柱面与扇区
UINT8 PartType; //分区类型
UINT8 EndHead; //分区的结束头
UINT8 EndCylSect[2]; //结束柱面与扇区
UINT8 StartLBA[4]; //分区的第一个扇区
UINT8 Size[4]; //分区的大小
};
//MBR:分区扇区(绝对0扇区)定义如下
struct PartSector
{
UINT8 PartCode[446]; //MBR的引导程序
struct PartRecord Part[4]; //4个分区记录
UINT8 BootSectSig0; //55
UINT8 BootSectSig1; //AA
};
注释:1、DBR包含BPB;
2、winhex上DBR在物理扇区63,在逻辑扇区0;
3、BPB表详解:
00 02:每扇区字节数(0X0200=512);
04:每簇扇区数(0x04=4);
26 00:保留扇区数(0x0026=38);
02:fat表数(0x02=2);
00 00:FAT32固定为0;
00 00:FAT32固定为0;
F8:存储介质类型;
00 00:FAT32固定为0;
3F 00:磁道扇区数(0x003F=63);
FF 00:磁头数(0x00FF=255);
3F 00 00 00:FAT区前隐扇区数(0x0000003f=63);
C1 9F 07 00:总扇区数(0x00079FC1=499649);
CD 03 00 00:FAT表所占扇区数(0x000003CD=973);
00 00:FAT32特有;
00 00:FAT32特有;
02 00 00 00:第一个目录的簇好(0x00000002=2);
01 00:FSINFO扇区数(0x0001=1);
06 00:通常为6;
00 00 00 00 00 00 00 00 00 00 00 00:12个零用于扩展;
00:驱动器号;
00:保留;
29:扩展引导标签;
B3 3B 28 AC:分区序列;
4E 4F 20 4E 41 4D 45 20 20 20 20:卷标;
46 41 54 33 32 20 20 20:系统ID
4、DBR C语言结构体描述:
//FAT32中对BPB的定义如下 一共占用90个字节
struct FAT32_BPB
{
UINT8 BS_jmpBoot[3]; //跳转指令 offset: 0
UINT8 BS_OEMName[8]; // offset: 3
UINT8 BPB_BytesPerSec[2];//每扇区字节数 offset:11
UINT8 BPB_SecPerClus[1]; //每簇扇区数 offset:13
UINT8 BPB_RsvdSecCnt[2]; //保留扇区数目 offset:14
UINT8 BPB_NumFATs[1]; //此卷中FAT表数 offset:16
UINT8 BPB_RootEntCnt[2]; //FAT32为0 offset:17
UINT8 BPB_TotSec16[2]; //FAT32为0 offset:19
UINT8 BPB_Media[1]; //存储介质 offset:21
UINT8 BPB_FATSz16[2]; //FAT32为0 offset:22
UINT8 BPB_SecPerTrk[2]; //磁道扇区数 offset:24
UINT8 BPB_NumHeads[2]; //磁头数 offset:26
UINT8 BPB_HiddSec[4]; //FAT区前隐扇区数 offset:28
UINT8 BPB_TotSec32[4]; //该卷总扇区数 offset:32
UINT8 BPB_FATSz32[4]; //一个FAT表扇区数 offset:36
UINT8 BPB_ExtFlags[2]; //FAT32特有 offset:40
UINT8 BPB_FSVer[2]; //FAT32特有 offset:42
UINT8 BPB_RootClus[4]; //根目录簇号 offset:44
UINT8 FSInfo[2]; //保留扇区FSINFO扇区数offset:48
UINT8 BPB_BkBootSec[2]; //通常为6 offset:50
UINT8 BPB_Reserved[12]; //扩展用 offset:52
UINT8 BS_DrvNum[1]; // offset:64
UINT8 BS_Reserved1[1]; // offset:65
UINT8 BS_BootSig[1]; // offset:66
UINT8 BS_VolID[4]; // offset:67
UINT8 BS_FilSysType[11]; // offset:71
UINT8 BS_FilSysType1[8]; //"FAT32 " offset:82
};
计算:
第一个FAT表开始扇区=DBR开始扇区+保留扇区数=63+38=101;
第二个FAT表开始扇区=第一个FAT表开始扇区+FAT表所占扇区数=101+973=1074(上图画错啦);
首目录簇开始开始扇区=第一个FAT表开始的扇区+2*FAT表所占扇区数=101+2*973=2047;
第N簇开始扇区=(N-首目录簇)*簇所占扇区数+首目录簇开始扇区=(N-2)*4+2047;
注意:FAT32首先研发为PC上的文件系统,是小端模式;而我们单片机一般为大端模式;