闪存分区(6)

编译生成镜像文件(5)中,我们通过编译生成了img文件,这些文件最后都需要被烧录到设备的闪存中。
而烧录过程就是把镜像文件(system.img/recovery.img/userdata.img等)按照分区表烧写在对应地址的闪存(Flash Memory)上。所以在研究烧录之前,我们先了解一下闪存。

闪存简介

闪存是一种非易失性的存储器,在嵌入式设备中用于存放系统,应用和数据等。在PC中,主要用于固态硬盘以及主板的BIOS中。另外,大多数U盘,SDCard等也是使用闪存作为存储介质。
与传统的硬盘存储器相比,闪存具有质量轻、能耗低、体积小、抗震能力强等的优点,但也有不少局限性,主要如下:
1.需要先擦除再写入
Flash Memory 写入数据时有一定的限制。它只能将当前为 1 的比特改写为 0,而无法将已经为 0 的比特改写为 1,只有在擦除的操作中,才能把整块的比特改写为 1。
2.块擦除次数有限
3 读写干扰
4 电荷泄漏

闪存分类

而我们常听到的SSD,eMMC,UFS都是闪存的不同种类,区别在于控制器,接口标准以及底层的闪存芯片标准。
SSD主要用于PC端,eMMC和UFS主要用于移动端。

闪存硬件分区

在eMMC标准中,将其内部的闪存划分为4类区域,最多可以支持8个硬件分区

BOOT Area Partition 1 & 2

此分区主要是为了支持从 eMMC 启动系统而设计的。
该分区的数据,在 eMMC上电后,可以通过很简单的协议就可以读取出来。同时,大部分的 SOC 都可以通过 GPIO 或者 FUSE 的配置,让 ROM 代码在上电后,将 eMMC BOOT 分区的内容加载到 SOC 内部的 SRAM 中执行。

RPMB Partition

RPMB是Replay Protected Memory Block的简称,它通过HMAC SHA-256和Write Counter来保证保存在 RPMB 内部的数据不被非法篡改。
在实际应用中,RPMB分区通常用来保存安全相关的数据,例如指纹数据、安全支付相关的密钥等。

General Purpose Partition 1~4

此区域则主要用于存储系统或者用户数据。GPP在芯片出厂时,通常是不存在的,需要主动进行配置后,才会存在。

User Data Area

UDA的容量大小不需要设置,在配置完其他分区大小后,再扣除设置Enhanced attribute所损耗的容量,剩下的容量就是 UDA 的容量。
此区域则主要用于存储系统和用户数据。
UDA通常会进行再分区,例如 Android 系统中,通常在此区域分出 boot、system、userdata 等分区。

以高通为例:
BOOT1:bootloader
BOOT2:boot.img
RPMB:未用(指纹相关)
UDA:剩余文件

UDA软件分区

为了更合理的管理数据,满足不同的应用需求,UDA 在实际产品中,会进行软件再分区。目前主流的软件分区技术有 MBR(Master Boot Record)和 GPT(GUID Partition Table)两种。
软件分区技术一般是将存储介质划分为多个区域,既SW Partitions,然后通过一个Partition Table来维护这些SW Partitions。在Partition Table中,每一个条目都保存着一个SW Partition的起始地址、大小等的属性信息。软件系统在启动后,会去扫描Partition Table,获取存储介质上的各个SW Partitions信息,然后根据这些信息,将各个Partitions加载到系统中,进行数据存取。

闪存分区实例

在一个 Android 手机系统中,各个分区的呈现形式如下:

  1. mmcblk0为eMMC的块设备;
  2. mmcblk0boot0和mmcblk0boot1对应两个Boot Area Partitions;
  3. mmcblk0rpmb则为RPMB Partition,
  4. mmcblk0px为UDA 划分出来的SW Partitions;
  5. 如果存在 GPP,名称则为mmcblk0gp1、mmcblk0gp2、mmcblk0gp3、mmcblk0gp4;
root@xxx:/ # ls /dev/block/mmcblk0*
/dev/block/mmcblk0
/dev/block/mmcblk0boot0
/dev/block/mmcblk0boot1
/dev/block/mmcblk0rpmb
/dev/block/mmcblk0p1
/dev/block/mmcblk0p2
/dev/block/mmcblk0p3
/dev/block/mmcblk0p4
/dev/block/mmcblk0p5
/dev/block/mmcblk0p6
/dev/block/mmcblk0p7
/dev/block/mmcblk0p8
/dev/block/mmcblk0p9
/dev/block/mmcblk0p10
/dev/block/mmcblk0p11
/dev/block/mmcblk0p12
/dev/block/mmcblk0p13
/dev/block/mmcblk0p14
/dev/block/mmcblk0p15
/dev/block/mmcblk0p16
/dev/block/mmcblk0p17
/dev/block/mmcblk0p18
/dev/block/mmcblk0p19
/dev/block/mmcblk0p20
/dev/block/mmcblk0p21
/dev/block/mmcblk0p22
/dev/block/mmcblk0p23
/dev/block/mmcblk0p24
/dev/block/mmcblk0p25
/dev/block/mmcblk0p26
/dev/block/mmcblk0p27
/dev/block/mmcblk0p28
/dev/block/mmcblk0p29
/dev/block/mmcblk0p30
/dev/block/mmcblk0p31
/dev/block/mmcblk0p32

每一个分区会根据实际的功能来设定名称。

root@xxx:/ # ls -l /dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/
lrwxrwxrwx root root 2015-01-03 04:03 boot -> /dev/block/mmcblk0p22
lrwxrwxrwx root root 2015-01-03 04:03 cache -> /dev/block/mmcblk0p30
lrwxrwxrwx root root 2015-01-03 04:03 custom -> /dev/block/mmcblk0p3
lrwxrwxrwx root root 2015-01-03 04:03 devinfo -> /dev/block/mmcblk0p28
lrwxrwxrwx root root 2015-01-03 04:03 expdb -> /dev/block/mmcblk0p4
lrwxrwxrwx root root 2015-01-03 04:03 flashinfo -> /dev/block/mmcblk0p32
lrwxrwxrwx root root 2015-01-03 04:03 frp -> /dev/block/mmcblk0p5
lrwxrwxrwx root root 2015-01-03 04:03 keystore -> /dev/block/mmcblk0p27
lrwxrwxrwx root root 2015-01-03 04:03 lk -> /dev/block/mmcblk0p20
lrwxrwxrwx root root 2015-01-03 04:03 lk2 -> /dev/block/mmcblk0p21
lrwxrwxrwx root root 2015-01-03 04:03 logo -> /dev/block/mmcblk0p23
lrwxrwxrwx root root 2015-01-03 04:03 md1arm7 -> /dev/block/mmcblk0p17
lrwxrwxrwx root root 2015-01-03 04:03 md1dsp -> /dev/block/mmcblk0p16
lrwxrwxrwx root root 2015-01-03 04:03 md1img -> /dev/block/mmcblk0p15
lrwxrwxrwx root root 2015-01-03 04:03 md3img -> /dev/block/mmcblk0p18
lrwxrwxrwx root root 2015-01-03 04:03 metadata -> /dev/block/mmcblk0p8
lrwxrwxrwx root root 2015-01-03 04:03 nvdata -> /dev/block/mmcblk0p7
lrwxrwxrwx root root 2015-01-03 04:03 nvram -> /dev/block/mmcblk0p19
lrwxrwxrwx root root 2015-01-03 04:03 oemkeystore -> /dev/block/mmcblk0p12
lrwxrwxrwx root root 2015-01-03 04:03 para -> /dev/block/mmcblk0p2
lrwxrwxrwx root root 2015-01-03 04:03 ppl -> /dev/block/mmcblk0p6
lrwxrwxrwx root root 2015-01-03 04:03 proinfo -> /dev/block/mmcblk0p13
lrwxrwxrwx root root 2015-01-03 04:03 protect1 -> /dev/block/mmcblk0p9
lrwxrwxrwx root root 2015-01-03 04:03 protect2 -> /dev/block/mmcblk0p10
lrwxrwxrwx root root 2015-01-03 04:03 recovery -> /dev/block/mmcblk0p1
lrwxrwxrwx root root 2015-01-03 04:03 rstinfo -> /dev/block/mmcblk0p14
lrwxrwxrwx root root 2015-01-03 04:03 seccfg -> /dev/block/mmcblk0p11
lrwxrwxrwx root root 2015-01-03 04:03 secro -> /dev/block/mmcblk0p26
lrwxrwxrwx root root 2015-01-03 04:03 system -> /dev/block/mmcblk0p29
lrwxrwxrwx root root 2015-01-03 04:03 tee1 -> /dev/block/mmcblk0p24
lrwxrwxrwx root root 2015-01-03 04:03 tee2 -> /dev/block/mmcblk0p25
lrwxrwxrwx root root 2015-01-03 04:03 userdata -> /dev/block/mmcblk0p31

https://linux.codingbelief.com/zh/storage/flash_memory/emmc/emmc_partitions.html

    原文作者:xcz1899
    原文地址: https://www.jianshu.com/p/cd2e49abab75
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞