概述
eMMC(embedded Multi-Media Card)是一种软硬件结合的存储解决方案,物理载体为 NAND Flash,外部封装了一层 eMMC 协议控制器,负责管理 NAND 的 ECC、均衡算法、指令管理、低功耗、坏块等方面的管理。
eMMC 使用 BGA 封装了 NAND Flash 和 Flash 控制器,向外提供标准 MMC 接口。
eMMC 模块内部框图
eMMC 芯片内部主要包含以下组件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| ┌─────────────────────────────────────────────┐ │ eMMC Package │ │ ┌─────────────────────────────────────────┐ │ │ │ eMMC Controller │ │ │ │ ┌──────┐ ┌──────┐ ┌────────────────┐ │ │ │ │ │ ECC │ │ FTL │ │ Wear Leveling │ │ │ │ │ │Engine│ │ │ │ Engine │ │ │ │ │ └──────┘ └──────┘ └────────────────┘ │ │ │ │ ┌──────┐ ┌──────┐ ┌────────────────┐ │ │ │ │ │ CMD │ │ Bad │ │ Power Mgmt │ │ │ │ │ │Parser│ │Block │ │ │ │ │ │ │ │ │ │ Mgmt │ │ │ │ │ │ │ └──────┘ └──────┘ └────────────────┘ │ │ │ └─────────────────────────────────────────┘ │ │ ┌─────────────────────────────────────────┐ │ │ │ NAND Flash Array │ │ │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ │ │ Die 0 │ │ Die 1 │ │ Die N │ │ │ │ │ └────────┘ └────────┘ └────────┘ │ │ │ └─────────────────────────────────────────┘ │ │ ┌─────────────────────────────────────────┐ │ │ │ BGA Ball Interface │ │ │ │ VCC VCCQ CLK CMD DAT[7:0] │ │ │ └─────────────────────────────────────────┘ │ └─────────────────────────────────────────────┘
|
eMMC 与 Raw NAND 对比
| 特性 |
eMMC |
Raw NAND |
| 控制器 |
内置 Flash 控制器 |
需要外部控制器 |
| ECC |
控制器内部处理 |
主机端或外部控制器处理 |
| 坏块管理 |
控制器自动管理 |
需要软件实现 |
| 磨损均衡 |
控制器自动处理 |
需要软件实现 |
| FTL |
内置 FTL 层 |
需要外部 FTL |
| 接口 |
标准 MMC/SD 接口 |
芯片级接口(8/16-bit) |
| 封装 |
BGA(易于焊接) |
TSOP/BGA(需要复杂布线) |
| 开发难度 |
低(标准接口) |
高(需要驱动开发) |
| 成本 |
较高 |
较低 |
| 适用场景 |
嵌入式系统、手机 |
大容量存储、SSD |
eMMC 总线接口
信号定义
| 信号 |
方向 |
说明 |
| CLK |
Host → Device |
时钟信号,驱动总线操作 |
| CMD |
双向 |
命令/响应信号,半双工 |
| DAT[7:0] |
双向 |
数据线,支持 1/4/8-bit 模式 |
| Data Strobe |
Device → Host |
HS400模式下的数据选通信号 |
| VCC |
电源 |
NAND Flash 供电(2.7V-3.6V) |
| VCCQ |
电源 |
控制器 I/O 供电(1.7V-1.95V 或 2.7V-3.6V) |
| VSS |
地 |
接地引脚 |
| RST_n |
Host → Device |
硬件复位信号 |
总线模式
| 模式 |
数据宽度 |
时钟频率 |
最大速率 |
eMMC 版本 |
| Legacy |
1-bit |
0-26 MHz |
26 MB/s |
4.3 |
| High Speed |
4/8-bit |
0-52 MHz |
52 MB/s |
4.4 |
| HS200 |
4/8-bit |
200 MHz |
200 MB/s |
4.5 |
| HS400 |
8-bit |
200 MHz |
400 MB/s |
5.0 |
| HS400ES |
8-bit |
200 MHz |
400 MB/s |
5.1 |
eMMC 内部分区
eMMC 设备内部包含多个逻辑分区:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| ┌────────────────────────────────────────────┐ │ eMMC Device │ │ ┌──────────────────────────────────────┐ │ │ │ User Data Area (UDA) │ │ │ │ 主用户数据区域 │ │ │ │ (可通过 GPP 进一步划分) │ │ │ └──────────────────────────────────────┘ │ │ ┌──────────┐ ┌──────────┐ │ │ │ Boot │ │ Boot │ │ │ │ Area 1 │ │ Area 2 │ │ │ │(128KB- │ │(128KB- │ │ │ │ 128MB) │ │ 128MB) │ │ │ └──────────┘ └──────────┘ │ │ ┌──────────────────────────────────────┐ │ │ │ RPMB (Replay Protected │ │ │ │ Memory Block) │ │ │ │ 安全存储区域 │ │ │ └──────────────────────────────────────┘ │ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │GPP1 │ │GPP2 │ │GPP3 │ │GPP4 │ │ │ │通用 │ │通用 │ │通用 │ │通用 │ │ │ │分区1│ │分区2│ │分区3│ │分区4│ │ │ └─────┘ └─────┘ └─────┘ └─────┘ │ └────────────────────────────────────────────┘
|
| 分区 |
说明 |
| User Data Area (UDA) |
主数据区域,存储用户数据 |
| Boot Area 1/2 |
启动分区,存储 Bootloader |
| RPMB |
重放保护存储块,用于安全存储(如密钥) |
| GPP 1-4 |
通用分区,可根据需求自定义 |
eMMC 命令集
命令分类
| 类别 |
命令号 |
名称 |
说明 |
| 基本命令 |
CMD0 |
GO_IDLE_STATE |
复位至空闲状态 |
| 基本命令 |
CMD1 |
SEND_OP_COND |
发送操作条件 |
| 基本命令 |
CMD2 |
ALL_SEND_CID |
获取 CID 寄存器 |
| 基本命令 |
CMD3 |
SET_RELATIVE_ADDR |
设置相对地址 |
| 基本命令 |
CMD7 |
SELECT/DESELECT_CARD |
选中/取消选中设备 |
| 基本命令 |
CMD8 |
SEND_EXT_CSD |
读取扩展 CSD 寄存器 |
| 基本命令 |
CMD13 |
SEND_STATUS |
读取设备状态 |
| 读命令 |
CMD17 |
READ_SINGLE_BLOCK |
读取单个块 |
| 读命令 |
CMD18 |
READ_MULTIPLE_BLOCK |
读取多个块 |
| 写命令 |
CMD24 |
WRITE_BLOCK |
写入单个块 |
| 写命令 |
CMD25 |
WRITE_MULTIPLE_BLOCK |
写入多个块 |
| 擦除命令 |
CMD35 |
ERASE_GROUP_START |
设置擦除组起始地址 |
| 擦除命令 |
CMD36 |
ERASE_GROUP_END |
设置擦除组结束地址 |
| 擦除命令 |
CMD38 |
ERASE |
执行擦除操作 |
| 安全命令 |
CMD44 |
SET_WRITE_PROT |
设置写保护 |
关键寄存器
| 寄存器 |
大小 |
说明 |
| CID |
128-bit |
设备标识信息(制造商、产品名、序列号等) |
| CSD |
128-bit |
设备特性信息(容量、速度等级等) |
| EXT_CSD |
512-byte |
扩展设备特性(详细配置参数) |
| OCR |
32-bit |
操作条件寄存器(电压范围等) |
| RCA |
16-bit |
相对地址寄存器 |
eMMC 操作特性
读写性能参考
| 操作 |
典型时间 |
说明 |
| 页读取 |
~100 μs |
从 NAND 读取到页缓存 |
| 页编程 |
~250 μs - 3 ms |
将页缓存写入 NAND |
| 块擦除 |
~1.5 ms - 5 ms |
擦除一个 Block |
| 缓存读取 |
~25 ns |
从页缓存读取到 I/O |
生命周期管理
| 参数 |
EXT_CSD 字段 |
说明 |
| 设备寿命估算 A |
DEVICE_LIFE_TIME_EST_TYP_A |
UDA 区域寿命估算 |
| 设备寿命估算 B |
DEVICE_LIFE_TIME_EST_TYP_B |
Boot 和 RPMB 区域寿命估算 |
| 预 EOL 信息 |
PRE_EOL_INFO |
设备预估到达使用寿命 |
嵌入式安全研究视角
常见攻击面
| 攻击类型 |
方法 |
风险 |
| 固件提取 |
通过 eMMC 读取器直接读取固件 |
固件被逆向分析 |
| 数据恢复 |
从 User Area 恢复已删除数据 |
敏感数据泄露 |
| Boot 分区篡改 |
修改 Boot Area 注入恶意代码 |
设备被植入后门 |
| RPMB 绕过 |
尝试绕过 RPMB 认证机制 |
安全存储被破坏 |
安全建议
- 启用写保护:对 Boot 分区启用永久或临时写保护
- 使用 RPMB:将关键安全数据存储在 RPMB 分区
- 安全擦除:使用 Secure Erase/Trim 命令确保数据不可恢复
- 固件加密:对存储在 eMMC 中的固件进行加密
相关知识
eMMC 是嵌入式系统中最常用的存储解决方案之一,理解其内部架构、分区结构和命令集,对于嵌入式设备安全研究和固件分析至关重要。本文与 NAND Flash 基础、JTAG/SWD/DAP 调试接口等文章共同构成硬件安全研究的知识体系。
⚠️ 安全提示:
- 对 eMMC 芯片的直接读写操作应在合法授权范围内进行
- 固件提取和分析应遵守相关法律法规
- 本文仅用于学术研究和安全评估目的