
1. 认识eMMC的四大分区第一次拆解eMMC芯片时我发现它就像个精密的俄罗斯套娃——外表看着是个整体内部却划分了多个独立区域。这种分区设计让eMMC能同时满足启动、安全存储、用户数据等不同需求。最常用的分区有四个Boot分区相当于设备的启动钥匙通常包含boot1和boot2两个镜像。就像电脑的双系统当主启动镜像损坏时可以快速切换到备用镜像。RPMB分区这个区域相当于保险箱采用特殊的加密验证机制。我曾在智能门锁项目中发现指纹模板数据就存储在这里。UDA分区这是最大的用户数据仓库相当于手机的内置存储。我们平时看到的16GB/32GB容量主要就是UDA的空间。GPP分区可定制的多功能区域像乐高积木一样能自由划分。某次做工业控制器时我就用它来单独存储设备日志。这些分区在物理上是隔离的就像写字楼里不同公司的独立办公室。要访问特定分区需要通过CMD6命令切换类似用门禁卡刷开不同区域的门禁。2. Boot分区的双保险机制2.1 启动镜像的AB设计Boot分区最让我欣赏的是它的冗余设计。boot1和boot2就像飞机的双发动机当一个失效时系统仍能启动。它们的容量计算公式很简单Boot分区大小 BOOT_SIZE_MULT × 128KB举个例子当BOOT_SIZE_MULT32时 32 × 128KB 4096KB 4MB这个值记录在Extended CSD寄存器的[226]位置。有次调试时我误改了这里导致设备无法启动最后是通过JTAG重新烧录才恢复。2.2 分区切换实战切换boot分区的操作就像更换启动U盘。假设我们要从默认的UDA切换到boot1# 设置PARTITION_ACCESS为0x1 mmc bootpart enable 1 0 /dev/mmcblk0对应的寄存器操作是发送CMD6(Switch)命令修改PARTITION_CONFIG[179]寄存器将PARTITION_ACCESS[2:0]设为0x01注意boot分区禁用Class6/7命令这意味着不能使用块预擦除(CMD23)和写保护命令。有次我尝试用CMD23加速写入结果直接导致IO错误。3. RPMB分区的安全堡垒3.1 防篡改的奥秘RPMB的防护机制让我想起银行金库。它有三个关键要素安全密钥出厂时烧录的256位HMAC密钥计数器每次写入自动1的防重放值签名验证所有操作都需要HMAC-SHA256签名实测过一个案例某厂商直接读取RPMB数据复制到新芯片结果系统判定为非法数据。正确的做法应该是// 合法的读取流程 1. Host生成随机数Nonce 2. 发送读请求Nonce给eMMC 3. eMMC返回{数据NonceHMAC} 4. Host验证Nonce和HMAC3.2 容量配置技巧RPMB大小通过这个公式计算RPMB容量 RPMB_SIZE_MULT × 128KB在Android设备上查看实际配置cat /sys/class/mmc_host/mmc0/mmc0:0001/ext_csd | grep RPMB输出中的[168]字节就是RPMB_SIZE_MULT。曾有个项目需要8MB RPMB但芯片默认只支持4MB最后是通过定制固件才实现的。4. UDA分区的灵活管理4.1 容量计算原理UDA的容量是动态计算的UDA容量 总容量 - (BootRPMBGPP)这就解释了为什么同型号芯片开启GPP后可用空间会减少。有次客户抱怨容量缩水其实就是因为启用了4个GPP分区。4.2 软件再分区案例在Linux下对UDA分区的操作很直观# 查看分区表 fdisk -l /dev/mmcblk0 # 创建新分区 echo n p 1 2048 1026047 w | fdisk /dev/mmcblk0但要注意写保护组大小(Write Protect Group)的影响这个值由HC_ERASE_GRP_SIZE和HC_WP_GRP_SIZE决定。某次分区对齐错误导致擦除效率下降50%就是忽略了这两个参数。5. GPP分区的定制艺术5.1 容量计算公式GPP的容量计算最复杂Size (GP_SIZE_MULT_x_2×65536 GP_SIZE_MULT_x_1×256 GP_SIZE_MULT_x_0) × WP_Group_Size其中WP_Group_Size512KB×HC_ERASE_GRP_SIZE×HC_WP_GRP_SIZE建议用这个Python函数计算def calc_gpp_size(mult0, mult1, mult2, erase_grp, wp_grp): wp_group 512 * erase_grp * wp_grp return (mult2*65536 mult1*256 mult0) * wp_group5.2 属性优化实践GPP支持两种增强属性Enhanced Storage将MLC转为SLC提升速度和寿命Non-Persistent适合临时数据类似RAM磁盘在视频监控设备中我把GPP4设为Enhanced Storage专门存储关键事件录像写入延迟从15ms降到了3ms。6. 分区切换的底层原理6.1 寄存器配置详解PARTITION_CONFIG寄存器就像交通指挥灯Bit[2:0]选择分区000UDA, 001boot1, 010boot2, 011RPMBBit[5:3]启动分区使能Bit[6]ACK信号控制在uboot中切换分区的代码示例// 切换到boot2分区 mmc_switch(dev, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF, (0 6) | (1 3) | (2 0));6.2 异常处理经验有次批量升级时遇到切换失败最后发现是电压不稳导致CMD6超时。现在我的检查清单包括供电电压是否≥3.0V时钟是否稳定在0-52MHz上电后等待至少1ms再操作7. 实战Android系统的分区布局在Android设备上查看典型分区ls -l /dev/block/platform/soc/7824900.sdhci/by-name常见的关键分区boot内核和ramdisksystem系统镜像userdata用户数据cache临时文件特别要注意rpmb分区没有直接挂载需要通过特殊接口访问。某次系统升级失败就是因为rpmb的写计数器没有正确更新。