一、EMMC的框架eMMC的全称是Embedded MultiMedia Card,MMC协会所制定的内嵌式存储器标准规格,主要应用于智能手机和移动嵌入式产品。eMMC是一种嵌入式非易失性存储系统,由标准MMC接口、主控制器和NAND Flash三部分组成,采用JEDEC标准BGA封装。

eMMC的这种将Nand Flash芯片和控制芯片封装在一起的设计概念,就是为了简化产品内存储器的使用,客户只需要采购eMMC芯片放进产品中,不需要处理其它复杂的Nand Flash兼容性和管理问题,减少研发成本和研发周期。

查看emmc剩余空间指令(EMMC框架和分区管理介绍)(1)

图1-1 EMMC的框架

二、EMMC的分区

EMMC的分区主要分为四个部分,支持的硬件分区可以达到8个,具体的如下图所示:

查看emmc剩余空间指令(EMMC框架和分区管理介绍)(2)

图1-2 分区示意图

1、BOOT1&BOOT2 ROM

此分区的主要作用是支持emmc启动系统而设计的。该分区的数据,在EMMC上电后,可以通过很简单的协议读取出来,同时在各个platform中都可以支持将ROM代码在上电之后,将EMMC BOOT分区的内容加载到SOC内部的SRAM中执行。

2、RPMB partition

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

3、General Purpose Partition 1~4

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

4、User Data Area

此区域则主要用于存储系统和用户数据。UDA分区通常会进行更加细致的划分,在安卓系统中,通常会在此区域中分出BOOT/system/userdata等分区。

上面介绍的BOOT分区和RPMB的容量大小通常都为4MB,部分芯片厂家也会提供配置的机会,GPP分区在出厂时默认不被支持,即不支持这些分区,需要用户主动去使能,并配置其所有使用的GPP容量的大小,GPP的数量可以为1-4,各个GPP的容量大小可以不一样,UDA的分区的容量的大小则为总容量的大小减去其它分区所占用的容量。三、BOOT area partitons

Boot Area 包含两个 Boot Area Partitions,主要用于存储 Bootloader,支持 SOC 从 eMMC 启动系统。

两个 Boot Area Partitions 的大小是完全一致的,由 Extended CSD register 的 BOOT_SIZE_MULT Field 决定,大小的计算公式如下:

Size = 128Kbytes x BOOT_SIZE_MULT

一般情况下,Boot Area Partition 的大小都为 4 MB,即 BOOT_SIZE_MULT 为 32,部分芯片厂家会提供改写 BOOT_SIZE_MULT 的功能来改变 Boot Area Partition 的容量大小。BOOT_SIZE_MULT 最大可以为 255,即 Boot Area Partition 的最大容量大小可以为 255 x 128 KB = 32640 KB = 31.875 MB。

四、RPMB

RPMB(Replay Protected Memory Block)Partition 是 eMMC 中的一个具有安全特性的分区。

eMMC 在写入数据到 RPMB 时,会校验数据的合法性,只有指定的 Host 才能够写入,同时在读数据时,也提供了签名机制,保证 Host 读取到的数据是 RPMB 内部数据,而不是攻击者伪造的数据。

RPMB 在实际应用中,通常用于存储一些有防止非法篡改需求的数据,例如手机上指纹支付相关的公钥、序列号等。RPMB 可以对写入操作进行鉴权,但是读取并不需要鉴权,任何人都可以进行读取的操作,因此存储到 RPMB 的数据通常会进行加密后再存储。

两个 RPMB Partition 的大小是由 Extended CSD register 的 BOOT_SIZE_MULT Field 决定,大小的计算公式如下:

Size = 128Kbytes x BOOT_SIZE_MULT

一般情况下,Boot Area Partition 的大小为 4 MB,即 RPMB_SIZE_MULT 为 32,部分芯片厂家会提供改写 RPMB_SIZE_MULT 的功能来改变 RPMB Partition 的容量大小。RPMB_SIZE_MULT 最大可以为 128,即 Boot Area Partition 的最大容量大小可以为 128 x 128 KB = 16384 KB = 16 MB。

使用 eMMC 的产品,在产线生产时,会为每一个产品生产一个唯一的 256 bits 的 Secure Key,烧写到 eMMC 的 OTP 区域(只能烧写一次的区域),同时 Host 在安全区域中(例如:TEE)也会保留该 Secure Key。

在 eMMC 内部,还有一个RPMB Write Counter。RPMB 每进行一次合法的写入操作时,Write Counter 就会自动加一 。

通过 Secure Key 和 Write Counter 的应用,RMPB 可以实现数据读取和写入的 Replay Protect。

五、GPP

eMMC 提供了 General Purpose Partitions (GPP),主要用于存储系统和应用数据。在很多使用 eMMC 的产品中,GPP 都没有被启用,因为它在功能上与 UDA 类似,产品上直接使用 UDA 就可以满足需求。

六、UDA

User Data Area (UDA) 通常是 eMMC 中最大的一个分区,是实际产品中,最主要的存储区域。

UDA的容量大小不需要设置,在配置完其他分区大小后,再扣除设置Enhanced attribute所损耗的容量,剩下的就是UDA的容量。

软件分区:

为了更合理的管理数据,满足不同的应用需求,UDA 在实际产品中,会进行软件再分区。目前主流的软件分区技术有 MBR(Master Boot Record)和 GPT(GUID Partition Table)两种。这两种分区技术的基本原理类似。

查看emmc剩余空间指令(EMMC框架和分区管理介绍)(3)

软件分区技术一般是将存储介质划分成了多个SW partitions,然后通过一个partiton table来维护这些SW partitions,在partiton table中,每个条目都保存着一个SW partition的起始地址、大小等属性信息,软件系统在系统后,会去扫描partition table,获取存储介质上的各个SW partition信息,然后根据这些信息,将各个partitions加载到系统中,进行数据存储。

七、EMMC的分区实例

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

1、mmcblk0为eMMC的块设备

2、mmcblk0boot0和mmcblk0boot1对应两个BOOT分区

3、mmcblkrpmb则为RPMB partiton

4、mmcblk0px则为UDA划分出来的SW partitions

5、如果存在GPP,名称则为mmcblk0gp1/mmcblk0gp2/mmcblk0gp3/mmcblk0gp4

查看emmc剩余空间指令(EMMC框架和分区管理介绍)(4)

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

查看emmc剩余空间指令(EMMC框架和分区管理介绍)(5)

,