【手机闪存】手机UFS类型闪存GPT(GUID磁盘分区表)初始化手机闪存「【手机闪存】手机UFS类型闪存GPT(GUID磁盘分区表)初始化」
扇区:扇区是磁盘最小的物理存储单元(物理性,即物理扇区)
簇(块):由于操作系统无法对数目众多的扇区进行寻址,所以操作系统就将相邻的扇区组合在一起,形成一个簇,然后再对簇进行管理。每个簇可以包括2、4、8、16、32或64个扇区。显然,簇是操作系统所使用的逻辑概念,而非磁盘的物理特性
存储器一般需要经过如下几个步骤之后才可进行文件管理:
- 低级格式化,此过程由硬件厂商完成,主要划分磁盘可供使用的扇区,磁道(用于形成簇),并记录有问题的扇区
- 闪存MBR或GPT格式设置,并形成分区
- 高级格式化,主要将分区格式化成文件系统
- 挂载,将分区挂载到文件夹下,将分区与此文件夹关联起来,访问文件夹就等同于访问分区
这里主要记录下UFS类型闪存初始化GPT,在此之前先了解下MBR和GPT格式磁盘:
MBR(Main Boot Record),主引导记录,1983年IBM提出的分区表格式,位于硬盘开始部分的一个特殊(0号)扇区(512字节),其数据结构中包含如下4个部分(顺序的):
- 引导程序:占MBR扇区的前446字节,用于硬盘启动时将系统控制转给用户指定的并在分区表中登记了的某个操作系统
- MBR分区表:占MBR扇区64个字节,是整个磁盘的分区表。(MBR只适用于最大容量为2TB硬盘,同时MBR也只支持最大4个主分区,如果想要创建更多的分区,就必须把其中一个主分区做一个“扩展分区”,并在其中创建逻辑分区)
- MBR结束符:占MBR扇区最后2个字节,一直为“55 AA”
系统上电====>主板上固化启动程序====>读取MBR磁盘中的引导记录程序====>启动分别表中登记的某个操作系统
GPT(GUID Partition Table),GUID磁盘分区表,它是可扩展固件接口(EFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一个扇区来存储逻辑块地址和大小信息的主开机纪录(MBR)分区表。
GPT磁盘分区结构解决了MBR只能分4个主分区的的缺点,理论上说,GPT磁盘分区结构对分区的数量好像是没有限制的。但某些操作系统可能会对此有限制。同时相对MBR方式将引导程序和分区表存在同一个区域,GPT在磁盘上存储了这些数据的多个副本,因此更加安全稳定,可在数据损坏情况进行修复。
GPT磁盘分区结构由6部分组成,如下图:
跟现代的MBR一样,GPT也使用逻辑区块位址(LBA)取代了早期的CHS寻址方式。传统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头会定义分区表的起始位置,分区表的结束位置、每个分区表项的大小、分区表项的个数及分区表的校验和等信息。
(十六进制)
- 分区表
分区表区域包含分区表项。这个区域由GPT头定义,一般占用磁盘LBA2~LBA33扇区。分区表中的每个分区项由起始地址、结束地址、类型值、名字、属性标志、GUID值组成。分区表建立后,128位的GUID对系统来说是唯一的。每个分区表项大小为128字节,每个分区表项管理一共分区。
(十六进制)
- 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的结构:
此次分析的UFS磁盘普通LU的逻辑块大小4K(4096byte,对应十六机制为1000),且GPT中扇区采用了一个逻辑块,即4K。保护MBR占用LBA0,size为4K,对应地址为:其gpt_main_sda.img的中MBR数据如下:
(十六进制)
GPT头占用LBA1,size为4K,起始地址为0x1000
(十六进制)
因GPT磁盘大小不同而不同(LBA数不同)
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)
因GPT磁盘大小不同而不同(LBA数不同)
其实扇区号为LB2,对应地址为0x2000(LBA0:4096+LBA1:4096),这里只分区第一个分区表,其他分区表以此类推
图木舒克版权声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com