4、eMMC分区概述:标准分区类型与访问权限

eMMC(Embedded Multi Media Card)作为嵌入式系统中应用最广泛的非易失性存储介质,其内部并非一个单一连续的存储空间,而是由JEDEC(Joint Electron Device Engineering Council)标准明确定义的多个功能分区组成。理解这些分区的结构、用途与访问权限,是进行固件设计、系统启动、数据安全保护以及后续坏块管理的基础。若将eMMC比作一座大型图书馆,那么Boot Area是只允许特定管理员进入的“珍本库”,RPMB是需密钥才能开启的“保险库”,User Area是面向所有读者的“公共阅览室”,而General Purpose Partitions则是可灵活规划的“预留研究室”。本章将逐一拆解这些分区的标准定义、硬件逻辑与软件交互规则。

eMMC 标准分区架构与访问控制模型 eMMC 控制器 内部Flash阵列管理 / ECC / 坏块映射 Boot Area 1 & 2 容量:各 128KB ~ 4MB 用途:存放Bootloader 权限:仅通过BOOT引脚访问 RPMB 容量:64KB ~ 16MB 用途:安全数据 / 防重放 权限:HMAC-SHA256认证 User Area 容量:占设备总容量大部分 用途:文件系统 / 用户数据 权限:普通读写命令 GP Partitions 1~4 容量:可配置(可选) 用途:多媒体 / 日志 / 扩展 权限:需切换分区命令 访问权限与切换机制 • Boot Area:上电后默认禁用,需将 eMMC 的 BOOT_BUS_WIDTH / BOOT_PARTITION_ENABLE 寄存器配置为 1 或 2 才能访问。 • RPMB:通过 CMD25(写入)与 CMD23(块计数)配合,发送带 HMAC-SHA256 认证帧的请求,密钥由 SoC 的 OTP/efuse 管理。 • User Area:默认分区,上电后即可通过 CMD17/CMD18/CMD24/CMD25 进行常规读写。 • GP Partitions:通过 CMD6(Switch)将 PARTITION_ACCESS 字段设置为 1~4 来切换访问目标。 关键寄存器: BOOT_PARTITION_ENABLE(EXT_CSD[179]) | PARTITION_ACCESS(EXT_CSD[179] 高 3 位) | BOOT_BUS_WIDTH(EXT_CSD[177])

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或安全密钥数据。

关键理解:eMMC分区不是“格式化出来的逻辑卷”,而是由控制器固件在出厂时或首次初始化时根据JEDEC规范建立的硬件映射。软件层面的分区表(如/MBR)仅存在于User Area内部,与eMMC硬件分区是两个完全不同的概念。硬件分区决定“谁能访问”,软件分区决定“数据如何组织”。

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)或安全协处理器驱动,普通操作系统内核无法直接访问。

风险提示:RPMB的认证密钥一旦丢失(例如SoC efuse损坏或eMMC更换),所有RPMB中的数据将永久无法访问。因此,在量产阶段必须建立密钥备份与恢复机制,且严禁将RPMB密钥存储在User Area或外部非易失存储器中。

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升级后,旧版本系统无法被重新刷入。

关键数据与操作流程:

  1. Boot Area 1写入:在产线阶段,通过JTAG或烧录工具将经过签名的ABOOT(Application Bootloader)写入Boot Area 1。写入后,将EXT_CSD[179]的BOOT_PARTITION_ENABLE设为1,使SoC BootROM能从Boot Area 1启动。
  2. RPMB密钥注入:在首次开机时,TEE(TrustZone)生成一个256位的随机密钥,通过RPMB Write Authentication Key命令写入RPMB。同时,将当前系统版本号(例如v1.0)作为防回滚计数器写入RPMB的Write Counter区域。
  3. OTA升级流程:当系统升级到v1.1时,TEE首先读取RPMB中的旧版本号(v1.0),验证新版本号大于旧版本号后,将新版本号写入RPMB。随后,Bootloader在启动时读取RPMB中的版本号,与boot.img头部的版本字段比对,若发现版本号低于RPMB记录值,则拒绝启动。
  4. 攻击场景模拟:攻击者尝试将系统降级到v1.0。由于RPMB中的版本号已更新为v1.1,Bootloader在验证阶段发现版本不匹配,启动流程终止。即使攻击者尝试直接修改User Area中的boot.img,由于Bootloader的签名验证(基于RPMB中存储的根密钥哈希),修改后的镜像无法通过校验。

结果与复盘:该方案成功实现了防回滚保护,且所有安全关键数据均存储在RPMB中,即使攻击者获得root权限并擦除User Area,也无法绕过验证。但代价是RPMB的写入次数有限(通常为10万次),频繁的OTA升级会消耗RPMB寿命。因此,在实际设计中,建议将版本号更新频率控制在每月一次以内,并监控RPMB的Write Counter剩余值。

工程经验:在量产阶段,务必对RPMB的写入操作增加超时重试机制。由于RPMB写入需要等待NAND擦写完成,极端情况下可能耗时数百毫秒。若主机在写入过程中断电,可能导致RPMB数据损坏。建议在TEE中实现“写入-验证-确认”的三步确认流程。

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),建立分区寿命监控机制。