4、eMMC分区概述:标准分区类型与访问权限
eMMC(Embedded Multi Media Card)作为嵌入式系统中应用最广泛的非易失性存储介质,其内部并非一个单一连续的存储空间,而是由JEDEC(Joint Electron Device Engineering Council)标准明确定义的多个功能分区组成。理解这些分区的结构、用途与访问权限,是进行固件设计、系统启动、数据安全保护以及后续坏块管理的基础。若将eMMC比作一座大型图书馆,那么Boot Area是只允许特定管理员进入的“珍本库”,RPMB是需密钥才能开启的“保险库”,User Area是面向所有读者的“公共阅览室”,而General Purpose Partitions则是可灵活规划的“预留研究室”。本章将逐一拆解这些分区的标准定义、硬件逻辑与软件交互规则。
4.1 核心原理:JEDEC标准下的分区逻辑与硬件隔离
eMMC的分区设计并非简单的软件逻辑划分,而是基于硬件层面的物理地址映射与控制器内部管理策略。JEDEC eMMC 5.1规范(JESD84-B51)明确规定了设备内部必须包含至少两个Boot Area分区、一个RPMB分区、一个User Area分区,以及最多四个可选的General Purpose Partitions(GP1~GP4)。这些分区在eMMC控制器内部拥有独立的逻辑地址空间,且共享同一片NAND Flash物理介质,但通过控制器内部的地址译码与访问控制逻辑实现隔离。
从硬件视角看,eMMC的NAND Flash阵列被划分为多个物理块组(Block Group),每个分区对应一组连续的物理块。控制器维护一张分区映射表(Partition Mapping Table),将主机发送的线性地址(LBA)根据当前激活的分区上下文翻译为对应的物理块地址。这种设计使得不同分区可以独立进行坏块管理、擦写均衡(Wear Leveling)和垃圾回收(Garbage Collection),避免相互干扰。例如,Boot Area的擦写次数通常远低于User Area,控制器可以为其配置更保守的磨损均衡策略。
访问权限的控制核心在于eMMC的EXT_CSD(Extended CSD)寄存器组。主机通过CMD6(Switch Command)修改EXT_CSD[179](PARTITION_CONFIG)寄存器的值,从而切换当前可访问的分区。值得注意的是,Boot Area和RPMB在默认状态下是不可直接访问的,必须经过特定的使能流程。这种硬件级隔离机制确保了即使操作系统崩溃或恶意软件入侵,也无法轻易篡改Bootloader或安全密钥数据。
4.2 各分区详细用途与访问权限解析
4.2.1 Boot Area 1 & 2:系统启动的“第一级跳板”
Boot Area是eMMC中容量最小的分区(典型值为128KB~4MB),但承担着系统启动的关键职责。SoC(System on Chip)的BootROM在上电后,会通过eMMC的BOOT引脚(而非标准I/O数据线)发起Boot Read操作,直接从Boot Area 1或Boot Area 2读取启动代码。这种设计使得Bootloader可以独立于User Area存在,即使User Area的文件系统损坏,设备仍能进入恢复模式或下载模式。
访问Boot Area需要满足两个条件:第一,硬件上,SoC必须将eMMC的BOOT_BUS_WIDTH引脚配置为1-bit或4-bit模式,并设置BOOT_PARTITION_ENABLE字段(EXT_CSD[179]的bit[2:0])为1(选择Boot Area 1)或2(选择Boot Area 2);第二,软件上,主机在发送CMD1(MMC_CMD_SEND_OP_COND)进入数据传输模式后,需通过CMD6将PARTITION_ACCESS字段设置为0(Boot Area 1)或1(Boot Area 2)。一旦完成Bootloader加载,主机应切换回User Area继续执行后续启动流程。
| 分区名称 | 典型容量 | 访问触发条件 | 主要用途 | 擦写寿命要求 |
|---|---|---|---|---|
| Boot Area 1 | 128KB ~ 4MB | BOOT引脚 + EXT_CSD[179]=1 | Primary Bootloader (SPL/ABOOT) | 高(需支持10万次以上) |
| Boot Area 2 | 128KB ~ 4MB | BOOT引脚 + EXT_CSD[179]=2 | 备份Bootloader / 恢复模式 | 高 |
| RPMB | 64KB ~ 16MB | HMAC-SHA256认证 + 重放保护 | 安全密钥、防回滚计数器、设备证书 | 极高(需原子写) |
| User Area | 设备总容量减去其他分区 | 默认激活,无需特殊配置 | 文件系统、应用程序、用户数据 | 标准(受磨损均衡管理) |
| GP1 ~ GP4 | 可配置(0~设备容量) | CMD6切换PARTITION_ACCESS=2~5 | 多媒体流、日志、OTA暂存、扩展存储 | 可独立配置 |
4.2.2 RPMB:硬件级安全存储的“保险柜”
RPMB(Replay Protected Memory Block)是eMMC中最特殊的分区,其核心价值在于防重放攻击和数据完整性保护。RPMB的每次读写操作都需要通过HMAC-SHA256算法进行认证,认证密钥(Authentication Key)由SoC在安全启动流程中写入,通常存储在eMMC的OTP(One-Time Programmable)区域或SoC的efuse中。主机在写入数据时,需构造包含帧计数器(Write Counter)、数据区和MAC值的认证帧;eMMC控制器验证MAC正确且帧计数器大于上次写入值后,才执行物理写入。
RPMB的典型应用场景包括:存储设备唯一ID(Device Unique ID)、安全启动的根密钥哈希、防回滚的版本计数器(Anti-Rollback Counter)、DRM(数字版权管理)密钥等。由于RPMB的写入速度较慢(每次写入需完成完整认证流程),且容量有限,不适合存储大块数据。在实际工程中,RPMB的读写操作通常由TEE(Trusted Execution Environment)或安全协处理器驱动,普通操作系统内核无法直接访问。
4.2.3 User Area:主数据存储区
User Area是eMMC中容量最大的分区,占据设备总存储空间的绝大部分(例如64GB eMMC中User Area约为58GB)。该分区遵循标准MMC协议,支持CMD17/CMD18(读)、CMD24/CMD25(写)等常规命令,并允许主机通过(GUID Partition Table)或MBR(Master Boot Record)进行二次软件分区。User Area的访问无需任何特殊认证,上电后默认激活,因此是操作系统、文件系统和用户数据的承载者。
从性能角度看,User Area的读写性能受NAND Flash类型(SLC/MLC/TLC/QLC)和控制器调度策略影响。对于高可靠性场景(如汽车电子),建议在User Area中预留10%~20%的Over-Provisioning空间,以提升垃圾回收效率和延长使用寿命。此外,User Area的坏块管理由控制器透明处理,主机无需感知物理坏块位置,但可以通过CMD56(Read/Write EXT_CSD)查询健康状态信息(如Pre EOL信息、Wear_Leveling_Count)。
4.2.4 General Purpose Partitions:灵活的“自定义仓库”
General Purpose Partitions(GP1~GP4)是JEDEC规范中可选的分区类型,其存在与否及容量大小由eMMC制造商在出厂时配置。GP分区的主要价值在于:为特定应用提供独立的存储空间,避免与User Area的文件系统相互干扰。例如,在车载信息娱乐系统中,GP1可专门用于存储行车记录仪视频流,GP2用于存储OTA升级包,GP3用于存储系统日志。这种隔离设计使得高频率写入的日志数据不会触发User Area的频繁垃圾回收,从而提升整体系统稳定性。
访问GP分区需要主机通过CMD6将PARTITION_ACCESS字段设置为2(GP1)、3(GP2)、4(GP3)或5(GP4)。切换后,后续的读写命令将作用于目标GP分区。值得注意的是,GP分区不支持Boot操作,且其坏块管理策略与User Area独立。在部分eMMC型号中,GP分区可以配置为“增强型”(Enhanced)模式,使用SLC NAND块以提升可靠性和写入性能,但会牺牲容量。
4.3 案例拆解:基于RPMB的安全启动与防回滚设计
为深入理解分区协同工作方式,我们以一个典型的Android智能手机安全启动流程为例。该案例涉及Boot Area、RPMB和User Area的联合使用。
背景与约束:某手机厂商需要满足Google的Verified Boot 2.0要求,同时防止攻击者通过降级系统版本绕过安全补丁。硬件平台采用高通骁龙SoC,eMMC容量为128GB,其中Boot Area 1为2MB,RPMB为4MB,User Area为120GB,GP1为2GB(用于OTA缓存)。
初始现象与目标:设备在启动时需完成三级验证:BootROM验证Bootloader(Boot Area 1)、Bootloader验证boot.img(User Area)、系统启动后验证vendor.img和system.img。同时,需确保每次OTA升级后,旧版本系统无法被重新刷入。
关键数据与操作流程:
- Boot Area 1写入:在产线阶段,通过JTAG或烧录工具将经过签名的ABOOT(Application Bootloader)写入Boot Area 1。写入后,将EXT_CSD[179]的BOOT_PARTITION_ENABLE设为1,使SoC BootROM能从Boot Area 1启动。
- RPMB密钥注入:在首次开机时,TEE(TrustZone)生成一个256位的随机密钥,通过RPMB Write Authentication Key命令写入RPMB。同时,将当前系统版本号(例如v1.0)作为防回滚计数器写入RPMB的Write Counter区域。
- OTA升级流程:当系统升级到v1.1时,TEE首先读取RPMB中的旧版本号(v1.0),验证新版本号大于旧版本号后,将新版本号写入RPMB。随后,Bootloader在启动时读取RPMB中的版本号,与boot.img头部的版本字段比对,若发现版本号低于RPMB记录值,则拒绝启动。
- 攻击场景模拟:攻击者尝试将系统降级到v1.0。由于RPMB中的版本号已更新为v1.1,Bootloader在验证阶段发现版本不匹配,启动流程终止。即使攻击者尝试直接修改User Area中的boot.img,由于Bootloader的签名验证(基于RPMB中存储的根密钥哈希),修改后的镜像无法通过校验。
结果与复盘:该方案成功实现了防回滚保护,且所有安全关键数据均存储在RPMB中,即使攻击者获得root权限并擦除User Area,也无法绕过验证。但代价是RPMB的写入次数有限(通常为10万次),频繁的OTA升级会消耗RPMB寿命。因此,在实际设计中,建议将版本号更新频率控制在每月一次以内,并监控RPMB的Write Counter剩余值。
4.4 常见误区与总结复盘
误区一:将eMMC硬件分区与软件分区混淆。许多开发者误以为通过fdisk或parted工具创建的分区就是eMMC分区。实际上,这些工具操作的是User Area内部的/MBR逻辑分区,与Boot Area、RPMB等硬件分区无关。硬件分区的划分在eMMC出厂时已固定,无法通过软件修改(除非使用专用的eMMC初始化工具重新配置EXT_CSD)。
误区二:忽视Boot Area的写保护机制。Boot Area虽然容量小,但同样存在坏块问题。部分工程师在量产时反复擦写Boot Area导致其寿命耗尽。正确的做法是:在Bootloader开发阶段使用eMMC的“Boot Area Write Protection”功能(通过EXT_CSD[173]设置),在量产完成后锁定Boot Area,防止意外写入。
误区三:RPMB容量规划不足。RPMB的容量通常较小(4MB~16MB),但存储的数据可能包括多个密钥、证书链和计数器。若规划不当,可能出现RPMB空间耗尽导致安全功能无法启用。建议在设计初期列出所有需要存储在RPMB中的对象及其大小,预留30%的冗余空间。
误区四:GP分区使用不当导致性能下降。GP分区虽然提供了隔离性,但若将高随机写入负载(如数据库文件)放在GP分区,而该分区未配置为增强型(SLC模式),其性能可能低于User Area。在配置GP分区前,应通过eMMC的“Enhanced Area”属性(EXT_CSD[181])明确指定使用SLC块。
总结复盘:eMMC分区管理是嵌入式存储设计的基石。Boot Area保障系统可启动性,RPMB提供硬件级安全锚点,User Area承载主数据流,GP分区实现负载隔离。在实际项目中,建议遵循以下原则:第一,Boot Area容量宁大勿小,至少预留2MB以支持未来Bootloader功能扩展;第二,RPMB密钥管理必须与SoC的TEE/TrustZone深度集成,避免在Linux内核层直接操作;第三,GP分区的配置应在产品定义阶段完成,因为部分eMMC型号的GP分区容量在出厂后不可调整;第四,定期通过CMD56读取EXT_CSD中的健康信息(如Device Life Time Estimation A/B),建立分区寿命监控机制。