博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【手机闪存】手机UFS类型闪存GPT(GUID磁盘分区表)初始化
阅读量:4203 次
发布时间:2019-05-26

本文共 4909 字,大约阅读时间需要 16 分钟。

 

扇区:扇区是磁盘最小的物理存储单元(物理性,即物理扇区)

簇(块):由于操作系统无法对数目众多的扇区进行寻址,所以操作系统就将相邻的扇区组合在一起,形成一个簇,然后再对簇进行管理。每个簇可以包括2、4、8、16、32或64个扇区。显然,簇是操作系统所使用的逻辑概念,而非磁盘的物理特性

存储器一般需要经过如下几个步骤之后才可进行文件管理:

  1. 低级格式化,此过程由硬件厂商完成,主要划分磁盘可供使用的扇区,磁道(用于形成簇),并记录有问题的扇区
  2. 闪存MBR或GPT格式设置,并形成分区
  3. 高级格式化,主要将分区格式化成文件系统
  4. 挂载,将分区挂载到文件夹下,将分区与此文件夹关联起来,访问文件夹就等同于访问分区

这里主要记录下UFS类型闪存初始化GPT,在此之前先了解下MBR和GPT格式磁盘:

MBR结构

MBR(Main Boot Record),主引导记录,1983年IBM提出的分区表格式,位于硬盘开始部分的一个特殊(0号)扇区(512字节),其数据结构中包含如下4个部分(顺序的):

  1. 引导程序:占MBR扇区的前446字节,用于硬盘启动时将系统控制转给用户指定的并在中登记了的某个操作系统
  2. MBR分区表:占MBR扇区64个字节,是整个磁盘的分区表。(MBR只适用于最大容量为2TB硬盘,同时MBR也只支持最大4个主分区,如果想要创建更多的分区,就必须把其中一个主分区做一个“扩展分区”,并在其中创建逻辑分区)
  3. MBR结束符:占MBR扇区最后2个字节,一直为“55 AA”

MBR磁盘启动过程

系统上电====>主板上固化启动程序====>读取MBR磁盘中的引导记录程序====>启动分别表中登记的某个操作系统

MBR磁盘结构

 

GPT结构

GPT(GUID Partition Table),GUID磁盘分区表,它是()标准(被用于替代个人计算机的)的一部分,被用于替代BIOS系统中的一个扇区来存储逻辑块地址和大小信息的主开机纪录(MBR)分区表。

GPT磁盘分区结构解决了MBR只能分4个主分区的的缺点,理论上说,GPT磁盘分区结构对分区的数量好像是没有限制的。但某些操作系统可能会对此有限制。同时相对MBR方式将引导程序和分区表存在同一个区域,GPT在磁盘上存储了这些数据的多个副本,因此更加安全稳定,可在数据损坏情况进行修复。

GPT磁盘分区结构由6部分组成,如下图:

跟现代的MBR一样,GPT也使用逻辑区块位址(LBA)取代了早期的寻址方式。传统MBR信息存储于LBA 0,GPT头存储于LBA 1,接下来才是分区表本身。

  • 保护MBR

在GPT分区表的最开头,处于兼容性考虑仍然存储了一份传统的MBR,用来防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR也叫做保护MBR。在支持从GPT启动的操作系统中,这里也用于存储第一阶段的启动代码。

EFI部分又可以分为4个区域:EFI信息区(GPT头)、分区表、GPT分区、备份区域(备份GPT头和分区表)

  • GPT头

GPT头位于GPT磁盘的第二个磁盘,也就是1号扇区,该扇区是在创建GPT磁盘时生成,GPT头会定义分区表的起始位置,分区表的结束位置、每个分区表项的大小、分区表项的个数及分区表的校验和等信息。

相对字节偏移量
(十六进制)
字节数 说明[整数皆以little endian方式表示]
00~07 8 GPT头签名“45 46 49 20 50 41 52 54”(ASCII码为“EFI PART”)
08~0B 4 版本号,目前是1.0版,其值是“00 00 01 00”
0C~0F 4 GPT头的大小(字节数),通常为“5C 00 00 00”(0x5C),也就是92字节。
10~13 4 GPT头CRC校验和(计算时把这个字段本身看做零值)
14~17 4 保留,必须为“00 00 00 00”
18~1F 8 EFI信息区(GPT头)的起始扇区号,通常为“01 00 00 00 00 00 00 00”,也就是LBA1。
20~27 8 EFI信息区(GPT头)备份位置的扇区号,也就是EFI区域结束扇区号。通常是整个磁盘最末一个扇区。
28~2F 8 GPT分区区域的起始扇区号,通常为“22 00 00 00 00 00 00 00”(0x22),也即是LBA34。
30~37 8 GPT分区区域的结束扇区号,通常是倒数第34扇区。
38~47 16 磁盘GUID(全球唯一标识符,与UUID是同义词)
48~4F 8 分区表起始扇区号,通常为“02 00 00 00 00 00 00 00”(0x02),也就是LBA2。
50~53 4 分区表总项数,通常限定为“80 00 00 00”(0x80),也就是128个。
54~57 4 每个分区表项占用字节数,通常限定为“80 00 00 00”(0x80),也就是128字节。
58~5B 4 分区表CRC校验和
5C~* * 保留,通常是全零填充
  • 分区表

分区表区域包含分区表项。这个区域由GPT头定义,一般占用磁盘LBA2~LBA33扇区。分区表中的每个分区项由起始地址、结束地址、类型值、名字、属性标志、GUID值组成。分区表建立后,128位的GUID对系统来说是唯一的。每个分区表项大小为128字节,每个分区表项管理一共分区。

相对字节偏移量
(十六进制)
字节数 说明[整数皆以little endian方式表示]
00~0F 16 用GUID表示的分区类型
10~1F 16 用GUID表示的分区唯一标示符
20~27 8 该分区的起始扇区,用LBA值表示。
28~2F 8 该分区的结束扇区(包含),用LBA值表示,通常是奇数。
30~37 8 该分区的属性标志
38~7F 72 UTF-16LE编码的人类可读的分区名称,最大32个字符。

 

  • GPT分区

最大的区域,由分配给分区的扇区组成。这个区域的起始和结束地址由GPT分区表定义。GPT分区区域就是用户使用的分区,也是用户进行数据存储的区域。

  • 备份区(GPT头备份和分区表备份)

备份区域位于磁盘的尾部,包含GPT头和分区表的备份。它占用GPT结束扇区和EFI结束扇区之间的33个扇区。其中最后一个扇区用来备份1号扇区的EFI信息,其余的32个扇区用来备份LBA2~LBA33扇区的分区表。

 GPT头有一个备份,放在GPT磁盘的最后一个扇区,但这个GPT头备份并非完全GPT头备份,某些参数有些不一样。复制的时候根据实际情况更改一下即可

分区区域结束后就是分区表备份,其地址在GPT头备份扇区中有描述。分区表备份是对分区表32个扇区的完整备份。如果分区表被破坏,系统会自动读取分区表备份,也能够保证正常识别分区

UFS

前面转载了一篇《》博客,可知UFS设备有若干个LU,每个LU都是独立的,“独立”表现在下面几个方面:

逻辑地址空间是独立的,都是从LBA 0开始;

逻辑块大小可以不同,可以为4KB,..;

可以有不同的安全属性,比如可以设置不同的写保护属性;

每个LU可以有自己的命令队列;

不同的LU可以存储不同的数据,比如有的LU存储系统启动代码,有的LU存储普通的应用数据,有的LU存储用户特殊数据...

。。。

UFS2.1中可以有最多32个普通LU和“四大名撸”(四个Well known LU,众所周知的LU)。

普通LU的逻辑块大小至少是4KB,但RPMB LU逻辑块大小为256B。

普通LU我觉得没有什么好讲的,就是分别用来存储用户数据的。我们主要来讲讲“四大名撸”。

最近手上刚好有一个高通项目,使用UFS结构磁盘做为闪存,拥有6个普通LU(作为user area,使用高通工具进行划分),借着这个来理解下GPT结构分区初始化过程。由于每个LU都是独立的,逻辑空间都是独立,都是从LB0开始,所以6个LU,一共需要6个GPT,每一个GPT数据结构对应一个gpt.img,此项目中分别为gpt_main_sda.img、gpt_main_sdb.img、gpt_main_sdc.img、gpt_main_sdd.img、gpt_main_sde.img和gpt_main_sdf.img。分析其中一个,另外5个原理一样,以gpt_main_sda.img数据来分析GPT的结构:

GPT:MBR

此次分析的UFS磁盘普通LU的逻辑块大小4K(4096byte,对应十六机制为1000),且GPT中扇区采用了一个逻辑块,即4K。保护MBR占用LBA0,size为4K,对应地址为:其gpt_main_sda.img的中MBR数据如下:

相对字节偏移量
(十六进制)
字节数 说明
0000~01BE 446 引导程序,这里没有被使用,用全0填充
01BE~01CD 16 MBR分区表1:00 00 01 00 EE FF FF FF 01 00 00 00 FF FF FF FF
01CE~01DD 16 MBR分区表2:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
01DE~01ED 16 MBR分区表3:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
01EE~01FD 16 MBR分区表4:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
01FE-01FF 2 MBR结束标识符“55 AA

GPT:GPT头

GPT头占用LBA1,size为4K,起始地址为0x1000

相对字节偏移量
(十六进制)
字节数 说明[整数皆以little endian方式表示]
00~07 8 GPT头签名“45 46 49 20 50 41 52 54”(ASCII码为“EFI PART”)
08~0B 4 版本号,目前是1.0版,其值是“00 00 01 00”
0C~0F 4 GPT头的大小(字节数),通常为“5C 00 00 00”(0x5C),也就是92字节。
10~13 4 GPT头CRC校验和(计算时把这个字段本身看做零值)
14~17 4 保留,必须为“00 00 00 00
18~1F 8 EFI信息区(GPT头)的起始扇区号,通常为“01 00 00 00 00 00 00 00”,也就是LBA1。
20~27 8 EFI信息区(GPT头)备份位置的扇区号,也就是EFI区域结束扇区号。通常是整个磁盘最末一个扇区。
因GPT磁盘大小不同而不同(LBA数不同)
28~2F 8

GPT分区区域的起始扇区号,06 00 00 00 00 00 00 00

因分区数不同而不同(分区表所占用的LBA数不同)

这里总共有21个分区,分区表实际用128byte来记录一个分区信息,但一个分区表占用一个物理扇区(512byte)

,即一个LBA可以存放8个分区表,21个分区需要使用4个LBA(8+8+8+8),则GPT分区区域的其实扇区号为LBA6(1+1+4)

30~37 8 GPT分区区域的结束扇区号,通常是倒数第34扇区。
因GPT磁盘大小不同而不同(LBA数不同)
38~47 16 磁盘GUID(全球唯一标识符,与UUID是同义词)
48~4F 8 分区表起始扇区号,通常为“02 00 00 00 00 00 00 00”(0x02),也就是LBA2。
50~53 4 分区表总项数,通常限定为“80 00 00 00”(0x80),也就是128个。
54~57 4 每个分区表项占用字节数,通常限定为“80 00 00 00”(0x80),也就是128字节。
58~5B 4 分区表CRC校验和
5C~* * 保留,通常是全零填充

GPT:分区表

其实扇区号为LB2,对应地址为0x2000(LBA0:4096+LBA1:4096),这里只分区第一个分区表,其他分区表以此类推

 

 

你可能感兴趣的文章
Libpcap库编程指南--分析数据包
查看>>
LintCode 二叉树的路径和
查看>>
Android编译系统简要介绍和学习计划
查看>>
Android编译系统环境初始化过程分析
查看>>
user2eng 笔记
查看>>
美国Ivanpah太阳能发电站:飞经这里的鸟都被烧焦了
查看>>
DRM in Android
查看>>
Android 4.4特性说明(持续更新)
查看>>
《大话设计模式》之--第3章 拍摄UFO----单一职责原则
查看>>
《大话设计模式》之--第5章 会修电脑不会修收音机?----依赖倒转原则
查看>>
《大话设计模式》之--第6章 穿什么有这么重要?----装饰模式
查看>>
《大话设计模式》之--第7章 为别人做嫁衣----代理模式
查看>>
《大话设计模式》之--第8章 雷锋依然在人间----工厂方法模式
查看>>
《大话设计模式》之--第9章 简历复印----原型模式
查看>>
《大话设计模式》之--第10章 考题抄错会做也白搭----模板方法模式
查看>>
《大话设计模式》之--第11章 无熟人难办事?----迪米特法则
查看>>
《大话设计模式》之--第12章 牛市股票还会亏钱?----外观模式
查看>>
《大话设计模式》之--第13章 好菜每回味不同----建造者模式
查看>>
《大话设计模式》之--第14章 老板回来,我不知道----观察者模式
查看>>
《大话设计模式》之--第15章 就不能不换DB吗?----抽象工厂模式
查看>>