一、背景:逻辑地址与物理地址的映射
eMMC内部包含一个Flash控制器,主机通过逻辑地址(LBA)访问数据,控制器负责将逻辑地址翻译为NAND Flash上的物理地址。这一层映射关系带来两个重要特性:
磨损均衡:控制器可以将同一逻辑地址的数据映射到不同物理位置,避免某个物理块被过度擦写。
逻辑擦除与物理擦除分离:主机执行擦除时,控制器可能只修改映射表,而不立即清除物理NAND单元。
因此,eMMC的擦除操作可以分为两个层次:
逻辑擦除:仅修改映射表,物理数据保留。
物理擦除:真正清除NAND Flash单元上的数据。
理解这一区分,是理解所有eMMC擦除命令本质的基础。
二、擦除命令框架:CMD35 / CMD36 / CMD38
eMMC的Erase、Trim、Secure Erase、Secure Trim均使用相同的命令序列:
| 命令 | 作用 |
|---|---|
| CMD35 | 设置擦除起始地址 |
| CMD36 | 设置擦除结束地址 |
| CMD38 | 执行擦除,参数决定擦除类型 |
CMD38为R1b类型命令,设备在执行期间通过DAT0拉低表示忙,完成后释放。CMD38的参数位定义如下:
| 位 | 含义 |
|---|---|
| bit 31 | Secure request |
| bit 15 | Secure Trim Step 2 |
| bit 1 | Discard Enable |
| bit 0 | Identify Write Blocks for Erase / TRIM Enable |
不同参数组合对应不同的擦除操作。
三、Erase:以擦除组为单位的逻辑擦除
标准Erase使用CMD38参数0x00000000。
3.1 操作粒度:擦除组
擦除组(Erase Group)是eMMC的最小可擦除单位,由多个写块(Write Block)组成。写块是设备的基本可写单位,大小为512字节。擦除组的大小由设备厂商定义。
3.2 擦除组大小的计算
擦除组大小的计算分为两种模式,由ERASE_GROUP_DEF(EXT_CSD[175])寄存器决定使用哪一种。
模式一:传统模式(ERASE_GROUP_DEF = 0)
当ERASE_GROUP_DEF为0时,擦除组大小由CSD寄存器中的两个字段决定:
| 字段 | CSD中的位置 | 宽度 |
|---|---|---|
ERASE_GRP_SIZE | bit[46:42] | 5 bit |
ERASE_GRP_MULT | bit[41:37] | 5 bit |
计算公式为:
擦除组大小 = (ERASE_GRP_SIZE + 1) × (ERASE_GRP_MULT + 1) × 512 字节其中ERASE_GRP_SIZE和ERASE_GRP_MULT均为5位二进制编码值,计算结果以写块(512字节)为单位。在实际设备中,ERASE_GRP_MULT经常被固定为0x1F,而ERASE_GRP_SIZE则根据设备容量有所不同。
模式二:高容量模式(ERASE_GROUP_DEF = 1)
当ERASE_GROUP_DEF为1时,擦除组大小由Extended CSD中的HC_ERASE_GRP_SIZE(EXT_CSD[224])决定:
擦除组大小 = 512KB × HC_ERASE_GRP_SIZE该值以512KB为基本单位,而非写块数。
ERASE_GROUP_DEF是一个可读写的配置位,主机可以通过CMD6(SWITCH)命令将其置1,以启用高容量擦除组定义。eMMC规范要求:当设备被分区后,应启用高容量组大小定义。
3.3 行为本质
Erase是逻辑擦除。控制器将指定擦除组内的所有写块从映射表中移除,但不强制立即物理擦除NAND数据。物理擦除可能推迟到后台垃圾回收时进行。
3.4 工程问题
如果起始地址未对齐到擦除组边界,Erase会向下取整到整个擦除组,可能导致相邻分区的数据被意外擦除。这是Erase在实际系统中的一个重要限制。
四、Trim:以写块为单位的逻辑擦除
Trim使用CMD38参数0x00000001。
操作粒度:写块(Write Block),即512字节。
行为本质:与Erase相同,Trim也是逻辑擦除,仅修改映射表,不强制物理清除。
与Erase的核心区别:Trim的粒度更细。Erase以擦除组为单位,Trim以写块为单位。因此Trim可以精确擦除指定写块,不会影响同一擦除组内的其他写块。
由于擦除组对齐问题,U-Boot等系统在支持eMMC 4.0以上设备时,默认使用Trim替代Erase。
五、Discard:仅作提示的操作
Discard使用CMD38参数0x00000003。
操作粒度:写块。
行为本质:Discard向设备提示这些写块不再需要,但eMMC标准没有定义Discard 后读取应返回什么。数据可能是原始数据,也可能是0或1,完全取决于设备实现。
Discard更接近性能优化提示,不适合作为安全擦除手段。
六、Secure Erase与Secure Trim:试图物理擦除,但无法保证
Secure Erase和Secure Trim是eMMC 4.4引入的功能,目标是实现指定地址范围内的物理擦除。
6.1 Secure Erase
使用CMD38参数0x80000000,bit 31置位表示安全请求。设备被要求对CMD35/CMD36指定的擦除组及其所有副本执行物理清除,清除方式由EXT_CSD中的Secure Removal Type字段决定。
该操作要求设备支持SEC_ER_EN(EXT_CSD[231] bit 0)。
6.2 Secure Trim
Secure Trim分两步执行:
| 步骤 | CMD38参数 | 作用 |
|---|---|---|
| Step 1 | 0x80000001 | 标记写块,准备安全擦除 |
| Step 2 | 0x80008000 | 对已标记的写块执行安全清除 |
两步之间可以间隔任意时间,Step 1可多次调用标记多个区域,最后用一次Step 2统一清除。该操作要求设备同时支持SEC_ER_EN和SEC_GB_CL_EN(EXT_CSD[231] bit 4)。
6.3 为什么Secure Erase/Trim不可靠
JEDEC在eMMC 5.1规范中明确指出:
Secure Erase is included for backwards compatibility. New system level implementations (based on v4.51 devices and beyond) should use Erase combined with Sanitize instead of secure erase.
根本原因在于,Secure Erase/Trim无法在逐LBA范围内保证物理擦除。由于磨损均衡和垃圾回收机制,同一逻辑地址的数据可能在物理上有多个副本。主机无法验证设备是否真正清除了所有副本。
因此,Secure Erase和Secure Trim仅为了向后兼容而保留,已不推荐在新系统中使用。Linux内核注释也明确指出:“Secure erase feature is deprecated in eMMC v4.5 specification”。
七、Sanitize:设备级物理清除
Sanitize是eMMC 4.5引入的功能,也是JEDEC推荐的最终数据清除方案。
7.1 作用范围
Sanitize不针对特定地址范围,而是作用于设备中所有未映射区域。未映射区域是指曾经被写入、但后来通过Erase、Trim或Discard逻辑删除的数据所占的物理空间。这些数据在映射表中已不存在,但物理NAND单元上可能仍然残留。
7.2 触发方式
Sanitize通过向EXT_CSD[165](SANITIZE_START)写入值来触发,通常通过CMD6(SWITCH)写字节完成。设备随后保持DAT0忙状态,直到清除完成,并将SANITIZE_START自动清回0。
7.3 支持性判断
设备是否支持Sanitize,可通过SEC_SANITIZE(EXT_CSD[231] bit 6)判断。在Linux内核的mmc.h头文件中,该位定义如下:
#define EXT_CSD_SEC_SANITIZE BIT(6) /* v4.5 only */EXT_CSD[231](SEC_FEATURE_SUPPORT)中各位的定义如下:
| 位 | 名称 | 含义 |
|---|---|---|
| bit 0 | SEC_ER_EN | Secure Erase 支持 |
| bit 4 | SEC_GB_CL_EN | Secure 擦除组清除支持 |
| bit 6 | SEC_SANITIZE | Sanitize 支持(v4.5 only) |
注意:在eMMC v4.5规范中,bit 0被保留,bit 6才是secure sanitize支持位。代码中检查Sanitize支持时,应使用bit 6。
7.4 关键特性
全局性:一次操作清除所有未映射区域。
强制性:要求设备真正执行物理清除。
不可中断:如果被CMD0、CMD15或硬件复位中断,未映射空间的状态无法保证,主机必须重新发起完整的Sanitize操作。
超长超时:Linux内核为Sanitize设置的超时时间为240秒。
7.5 驱动实现注意事项
Sanitize通过CMD6触发时,应使用R1响应而非R1b。因为设备会长时间保持DAT0忙状态,R1b的硬件等待逻辑会因自身较短的超时先返回错误,无法进入软件轮询阶段。正确做法是用R1发送CMD6,然后轮询Card Status,等待设备从PROG状态回到TRAN状态。
此外,轮询过程中如果出现错误返回路径,必须清除驱动内部的忙标志,避免上层误认为设备仍在忙。
八、对比总结
| 操作 | 操作粒度 | 本质 | 物理清除 | 规范状态 |
|---|---|---|---|---|
| Erase | 擦除组 | 逻辑擦除 | 否 | 基础功能 |
| Trim | 写块 | 逻辑擦除 | 否 | 推荐替代Erase |
| Discard | 写块 | 提示设备,不保证结果 | 否 | 性能优化 |
| Secure Erase | 擦除组 | 试图物理清除指定范围 | 无法保证 | 已不推荐 |
| Secure Trim | 写块 | 试图物理清除指定范围 | 无法保证 | 已不推荐 |
| Sanitize | 全局未映射区域 | 强制物理清除所有未映射数据 | 是 | 推荐 |