我的github: https://github.com/WHJWNAVY

SD卡分区详解

嵌入式编程 WHJWNAVY 357℃

MBD主引导记录和DPT分区表

参考资料:MBR分区结构、DPT分区表、EBR扩展引导

参考资料:
文件系统原理

EasyARM IMX280A开发板的SD卡分区使用MBR格式记录分区信息.MBR信息位于SD卡第一个扇区中,

并且该扇区的最后两个字节必须是 0x55,0xAA才能被开发板识别为可启动的SD卡.

MBR主引导记录格式:


 
 

DPT磁盘分区结构信息:

DPT从MBR的第0x01BE字节偏移地址处开始,每个分区一个分区表,每个分区表占16个字节,MBR型分区结构最大支持4个磁盘分区.


 
 

常见文件系统标志:


 
 

关于磁头,柱面,扇区的计算

参考资料: 百度百科:硬盘分区表

MBR的大小端模式:

MBR格式采用的是小端模式,即数据的高字节保存在内存的低地址中,而数据的低字节保存在内存

的高地址中.比如:如果分区表的分区起始相对扇区号为(3F 00 00 00),转换为十进制前要先反一下字节顺序,

为(00 00 00 3F)然后在转换为十进制,即63.

 
 

逻辑扇区号与(柱面,磁头,扇区)的相互转换:

令L=逻辑扇区号, C=柱面号, H=磁头号, S=扇区号.

每道最大扇区数 = 63.

每柱面最大磁头数 = 255.

每柱面扇区数 = 每道扇区数 * 每柱面磁头数 = 63×255 = 16065.

柱面号下标从0开始, 磁头号[0-254], 扇区号[1-63], 逻辑扇区号下标也从0开始.

(柱面,磁头,扇区)转换成逻辑扇区号的公式为:

L = C × 16065 + H × 63 + S – 1;

 
 

SD卡分区实例分析

如图所示为已经制作好的可引导SD卡的第一扇区,其DPT分区表中有三个DPT分区条目.

第四个分区表条目数组全为0,其文件系统标志位为0,表示其不是一个正常的DPT条目.


 
 

第一分区,主分区,W95 FAT32文件系统(0x0B):

80

04

05

00

0B

4C

FB

51

00

01

00

00

00

30

D0

00

 
 

分区起始磁头号H

0x04

4

分区起始扇区号S

0x05&0x3f=0x05

5

分区起始磁柱号C

((0x05&0xc0)*0x04)+0x00 = 0x00

0

分区起始逻辑扇区号

0*16065+4*63+5-1=256

0x100

分区结束磁头号H

0x4c

76

分区结束扇区号S

0xfb&0x3f=0x3b

59

分区结束磁柱号C

((0xfb&0xc0)*0x04)+0x51 = 0x0351

849

分区结束逻辑扇区号

849*16065+76*63+59-1=13644031

0xd030ff

 
 

第二分区,逻辑分区,OnTrack DM6 Aux文件系统(0x53):

00

4C

FB

51

53

6D

DF

51

00

31

D0

00

03

08

00

00

 
 

分区起始磁头号H

0x4c

76

分区起始扇区号S

0xfb&0x3f=0x3b

59

分区起始磁柱号C

((0xfb&0xc0)*0x04)+0x51 = 0x0351

849

分区起始逻辑扇区号

849*16065+76*63+59-1=13644031

0xd030ff

分区结束磁头号H

0x6d

109

分区结束扇区号S

0xdf&0x3f=0x1f

31

分区结束磁柱号C

((0xdf&0xc0)*0x04)+0x51 = 0x0351

849

分区结束逻辑扇区号

849*16065+109*63+31-1=13646082

0xd03902

 
 

 
 

第三分区,逻辑分区,OPUS文件系统类型(0x10):

00

71

E0

51

10

FB

E8

D3

00

3A

D0

00

00

00

20

00

 
 

分区起始磁头号H

0x71

113

分区起始扇区号S

0xe0&0x3f=0x20

32

分区起始磁柱号C

((0xe0&0xc0)*0x04)+0x51 = 0x0351

849

分区起始逻辑扇区号

849*16065+113*63+32-1=13646335

0xd039ff

分区结束磁头号H

0xfb

251

分区结束扇区号S

0xe8&0x3f=0x28

40

分区结束磁柱号C

((0xe8&0xc0)*0x04)+0xd3 = 0x03d3

979

分区结束逻辑扇区号

979*16065+251*63+40-1=15743487

0xF039FF

实际上我们手动计算出来的分区起始逻辑扇区号分区结束逻辑扇区号与DPT条目中的最后8字节,

分区起始相对扇区号分区总的扇区数结果是一样的,这可以用于校验我们的计算结果.

 
 

在Linux系统中查看该SD卡的分区信息,和刚才分析的结果一致:


 
 

SD卡引导固件分区详细信息

下图是官方芯片手册中SD卡主引导记录MBR的说明:


官方芯片手册中介绍说,如果SD卡的MBR分区表条目中某一条的文件系统标志位(从分区表条目起址偏移0x04字节处)

0x53(‘S’),则表明该分区为SD卡引导固件分区, 并且该引导固件分区逻辑地址(单位:扇区)存放在该分区表条目从起始

偏移0x08字节处, 长度4字节.因此可以看出,系统引导固件分区在该SD卡的第二分区上,并且该引导固件分区的逻辑扇区地址为:

00

31

D0

00

由于是小端模式,所以实际为:

00

D0

31

00

即 在第0x00d03100=13644032个扇区处.跳到该扇区处看一看:


 
 

引导固件分区的第一个扇区用于存放系统引导控制块(BCB),该BCB块的定义如下:


 
 


 
 

typedef struct _DriveInfo_t

{

    uint32_t u32ChipNum; //!< Chip Select, ROM does not use it

    uint32_t u32DriveType; //!< Always system drive, ROM does not use it

    uint32_t u32Tag; //!< Drive Tag

    uint32_t u32FirstSectorNumber//!< Start sector/block address of firmware.

    uint32_t u32SectorCount//!< Not used by ROM

} DriveInfo_t;

 
 

typedef struct _ConfigBlock_t

{

    uint32_t u32Signature; //!< Signature 0x00112233

    uint32_t u32PrimaryBootTag; //!< Primary boot drive identified by this tag

    uint32_t u32SecondaryBootTag; //!< Secondary boot drive identified by this tag

    uint32_t u32NumCopies; //!< Num elements in aFWSizeLoc array

    DriveInfo_t aDriveInfo[]; //!< Let array aDriveInfo be last in this data

    //!< structure to be able to add more drives in future

    //!< without changing ROM code

} ConfigBlock_t;

 
 

 
 

由以上可知,BCB控制块从引导分区的第一个扇区的0地址处开始存放,

BCB块中的aDriveInfo[0].u32FirstSectorNumber用于存放主引导镜像文件(imx28_ivt_uboot.sb)的逻辑偏移地址(单位:扇区),

BCB块中的aDriveInfo[0].u32SectorCount用于存放主引导镜像文件(imx28_ivt_uboot.sb)的大小(单位:扇区).

BCB块中的aDriveInfo是一个数组,可以用于存放多个BCB块信息,此BCB块中包含了主启动器和第二启动器的BCB块信息,

因此支持多重启动,而且将来还可以扩展出更多.

 
 

aDriveInfo[0].u32FirstSectorNumber在BCB控制块中的偏移地址为0x1C(28),长度4字节.

aDriveInfo[0].u32SectorCount在BCB控制块中的偏移地址为0x20(32),长度4字节.如下:

04

31

D0

00

90

02

00

00

由于是小端模式,所以实际为:

00

D0

31

04

00

00

02

90

 
 

因此系统主引导镜像文件存放在第0x00D03104=13644036(扇区),大小为0x00000290=656(扇区)=328(KB).

跳到13644036扇区去看一看:


imx28_ivt_uboot.sb文件的前512字节对比一下:


可以看出完全一致,表明我们的分析是正确的.

<<EasyArm_IMX280A SD分区详解.docx>>

<<EasyArm_IMX280A SD分区详解.pdf>>

转载请注明:胡椒小兄弟 » SD卡分区详解

喜欢 (0)or分享 (0)