eMMC分区管理

1.分区概述

eMMC标准中,将内部的Flash Memory划分为4类区域,最多可以支持8个硬件分区,如下图所示:

1.1.概述

一般情况下,Boot Area Partitions和RPMB Partition的容量大小通常都为4MB,部分芯片厂家也会提供配置的机会。General Purpose Partitions (GPP)则在出厂时默认不被支持,即不存在这些分区,需要用户主动使能,并配置其所要使用的GPP的容量大小,GPP的数量可以为1-4个,各个GPP的容量大小可以不一样。User Data Area(UDA)的容量大小则为总容量大小减去其他分区所占用的容量。更多各个分区的细节将在后续小节中描述。

1.2.分区编址

eMMC的每一个硬件分区的存储空间都是独立编址的,即访问地址为0-partition size。具体的数据读写操作实际访问哪一个硬件分区,是由eMMC的Extended CSD register的PARTITION_CONFIG Field中的Bit[2:0]: PARTITION_ACCESS决定的,用户可以通过配置PARTITION_ACCESS来切换硬件分区的访问。也就是说,用户在访问特定的分区前,需要先发送命令,配置PARTITION_ACCESS,然后再发送相关的数据访问请求。更多数据读写相关的细节,请参考eMMC总线协议章节。

eMMC的各个硬件分区有其自身的功能特性,多分区的设计,为不同的应用场景提供了便利。

2.Boot Area Partitions

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

2.1.容量大小

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

Size = 128Kbytes x BOOT_SIZE_MULT

一般情况下,Boot Area Partition的大小都为4MB,即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。

2.2.从Boot Area启动

eMMC中定义了Boot State,在Power-up、HW reset或者SW reset后,如果满足一定的条件,eMMC就会进入该State。进入Boot State的条件如下:

Original Boot Operation:

CMD信号保持低电平不少于74个时钟周期,会触发Original Boot Operation,进入Boot State。

Alternative Boot Operation:

在74个时钟周期后,在CMD信号首次拉低或者Host发送CMD1之前,Host发送参数为0xFFFFFFFA的CMD0时,会触发Alternative Boot Operation,进入Boot State。

在Boot State下,如果有配置BOOT_ACK,eMMC会先发送"010"的ACK包,接着eMMC会将最大为128Kbytes x BOOT_SIZE_MULT的Boot Data发送给Host。传输过程中,Host可以通过拉高CMD信号(Original Boot中),或者发送Reset命令(Alternative Boot中)来中断eMMC的数据发送,完成Boot Data传输。

Boot Data根据Extended CSD register的PARTITION_CONFIG Field的Bit[5:3]:BOOT_PARTITION_ENABLE的设定,可以从Boot Area Partition 1、Boot Area Partition 2或者User Data Area读出。

Boot Data存储在Boot Area比在User Data Area中要更加的安全,可以减少意外修改导致系统无法启动,同时无法更新系统的情况出现。

2.3.写保护

通过设定Extended CSD register的BOOT_WP Field,可以为两个Boot Area Partition独立配置写保护功能,以防止数据被意外改写或者擦出。

eMMC中定义了两种Boot Area的写保护模式:

  • Power-on write protection,使能后,如果eMMC掉电,写保护功能失效,需要每次Power on后进行配置;
  • Permanent write protection,使能后,即使掉电也不会失效,主动进行关闭才会失效。

3.RPMB Partition

RPMB(Replay Protected Memory Block)Partition是eMMC中的一个具有安全特性的分区。eMMC在写入数据到RPMB时,会校验数据的合法性,只有指定的Host才能够写入,同时在读数据时,也提供了签名机制,保证Host读取到的数据是RPMB内部数据,而不是攻击者伪造的数据。

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

3.1.容量大小

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

size = 128kB x RPMB_SIZE_MULT

一般情况下,RPMB Partition的大小为4 MB,即RPMB_SIZE_MULT为32,部分芯片厂家会提供改写RPMB_SIZE_MULT的功能来改变RPMB Partition的容量大小。

RPMB_SIZE_MULT最大可以为128,即RPMB Partition的最大容量大小可以为128 x 128 KB = 16384 KB = 16 MB。

3.2.Replay Protect原理

使用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。

RPMB数据写入的流程如下:

  • Host按照上面的读数据流程,读取RPMB的Write Counter。
  • Host将需要写入的数据和Write Counter拼接到一起并计算签名,然后将数据、Write Counter以及签名一并发给eMMC。
  • eMMC接收到数据后,先对比Write Counter是否与当前的值相同,如果相同那么再对数据和Write Counter的组合进行签名,然后和Host发送过来的签名进行比较,如果签名相同则鉴权通过,将数据写入到RPMB 中。

通过上述的写入流程,可以保证RPMB不会被非法篡改。

4.General Purpose Partitions

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

4.1.容量大小

eMMC最多可以支持4个GPPs,每一个GPP的大小可以单独配置。用户可以通过设定Extended CSD register的以下三个Field来设GPPx(x=1~4)的容量大小:

  • GP_SIZE_MULT_x_2
  • GP_SIZE_MULT_x_1
  • GP_SIZE_MULT_x_0

GPPx的容量计算公式如下:

Size = (GP_SIZE_MULT_x_2 * 2^16 + GP_SIZE_MULT_x_1 * 2^8 + GP_SIZE_MULT_x_0 * 2^0) * (Write protect group size)
Write protect group size = 512KB * HC_ERASE_GRP_SIZE * HC_WP_GRP_SIZE
  • eMMC中,擦除和写保护都是按块进行的,上述表达式中的HC_WP_GRP_SIZE为写保护的操作块大小HC_ERASE_GRP_SIZE则为擦除操作的快的大小。
  • eMMC芯片的GPP的配置通常是只能进行一次(OTP),一般会在产品量产阶段,在产线上进行。

4.2.分区属性

eMMC标准中,为GPP定义了两类属性,Enhanced attribute和Extended attribute。每个GPP可以设定两类属性中的一种属性,
不可以同时设定多个属性。

Enhanced attribute:

  • Default,未设定Enhanced attribute。
  • Enhanced storage media,设定GPP为Enhanced storage media。

在eMMC标准中,实际上并未定义设定Enhanced attribute后对eMMC的影响。Enhanced attribute的具体作用,由芯片制造商定义。

在实际的产品中,设定Enhanced storage media后,一般是把该分区的存储介质从MLC改变为SLC,提高该分区的读写性能、寿命以及稳定性。由于1个存储单元下,MLC的容量是SLC的两倍,所以在总的存储单元数量一定的情况下,如果把原本为MLC的分区改变为SLC,会减少eMMC的容量,就是说,此时eMMC的实际总容量比标称的总容量会小一点。

Extended attribute:

  • Default,未设定Extended attribute。
  • System code,设定GPP为System code属性,该属性主要用在存放操作系统类的、很少进行擦写更新的分区。
  • Non-Persistent,设定GPP为Non-Persistent属性,该属性主要用于存储临时数据的分区,例如tmp目录所在分区、swap分区等。

在eMMC标准中,同样也没有定义设定Extended attribute后对eMMC的影响。Extended attribute的具体作用,由芯片制造商定义。Extended attribute主要是跟分区的应用场景有关,厂商可以为不用应用场景的分区做不同的优化处理。

5.User Data Area

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

5.1.容量大小

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

5.2.软件分区

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

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

MBR和GPT此处不展开详细介绍,更多的细节可以参考wikipedia上MBR和GPT相关介绍。

5.3.区域属性

eMMC标准中,支持为UDA中一个特定大小的区域设定Enhanced attribute。与GPP中的Enhanced attribute相同,eMMC标准也没有定义该区域设定Enhanced attribute后对eMMC的影响。Enhanced attribute的具体作用,由芯片制造商定义。

Enhanced attribute:

  • Default,未设定Enhanced attribute。
  • Enhanced storage media,设定该区域为Enhanced storage media。

在实际的产品中,UDA区域设定为Enhanced storage media后,一般是把该区域的存储介质从MLC改变为SLC。通常,产品中可以将某一个SW Partition设定为Enhanced storage media,以获得更好的性能和健壮性。

6.eMMC分区应用实例

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

  • mmcblk0为eMMC的块设备;
  • mmcblk0boot0和mmcblk0boot1对应两个Boot Area Partitions;
  • mmcblk0rpmb则为RPMB Partition;
  • mmcblk0px为UDA划分出来的SW Partitions;
  • 如果存在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 

7.参考资料

1.Embedded Multi-Media Card (e•MMC) Electrical Standard (5.1) [PDF]
2.Disk partitioning [Web]
3.Master Boot Record [Web]
4.GUID Partition Table [Web]

本文转自:蜗窝科技。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值