|
最新的 eMMC 5.1 版本提供更高的读写速度、命令队列(CMDQ)、高优先级数据处理等功能。虽然 eMMC 仍然广泛用于嵌入式设备,但 UFS(Universal Flash Storage)正在逐步取代它,特别是在高端设备中。
emmc:全称为embeded MultiMedia Card,是一种嵌入式非易失性存储器系统,由Nand flash和Nand flash控制器组成,以BGA方式封装在一款chip上。
Nand flash:一种存储数据介质;若要读取其中的数据,需要外接的主控电路。
Nor flash:也是一种存储介质;它的存储空间一般比较小,但它可以不用初始化,可以在其内部运行程序,一般在其存储一些初始化内存的固件代码。
在功能上:eMMC则在其内部集成了 Flash Controller,包括了协议、擦写均衡、坏块管理、ECC校验、电源管理、时钟管理、数据存取等功能。相比于直接将NAND Flash接入到Host 端,eMMC屏蔽了 NAND Flash 的物理特性,可以减少 Host 端软件的复杂度,让 Host 端专注于上层业务,省去对 NAND Flash 进行特殊的处理。同时,eMMC通过使用Cache、Memory Array 等技术,在读写性能上也比 NAND Flash要好很多。而NAND Flash 是直接接入 Host 端的,Host 端通常需要有 NAND Flash Translation Layer,即 NFTL 或者 NAND Flash 文件系统来做坏块管理、ECC等的功能。另一方面,emmc的读写速度也比NAND Flash的读写速度快,emmc的读写可高达每秒50MB到100MB以上;
在eMMC器件里,有两种存储器,SRAM(静态随机访问存储器)和NAND闪存。SRAM是位于控制器ASIC里面为了数据暂时保存以及被控制器微处理器快速访问的易失性存储器。NAND阵列是由一个或者多个晶片组成的非易失性存储器
从功能角度来看,NAND阵列空间可以被分成两类,一个是用户可以访问的,一个是用户不可见的。一些用户不可以见的空间被eMMC器件自己用来存储一些重要信息,比容控制金额映射表,固件,寄存器。另外一些用户不可见的NAN存储块可以被用来做加速的SLC块,或者为实时产生的坏块做备份用的保留块。 至于说用户可访问存储空间,隐入了一个新的概念,分区。在一个分区里面,逻辑块的起始地址总是0x00000000; 访问不同的分区需要用到切换指令CMD6;每个分区里面支持的指令是是不完全相同的。eMMC规范一共有四种不同的分区,用户区域分区,通用目的分区,启动分区和RPMB分区。通用目的分区(也叫GPP)是可选的,由用户配置,而其他的三个分在eMMC器件出厂的时候是强制要求的。 启动分区包含两个驱动区域来存储启动代码,这两个启动区域是独立的,可以被用来存储彼此的冗余备份数据。 RPMB分区用来存储保密信息。 启动分区和RPMB分区的大小都是128KB的整数倍。
1. Boot Partition(引导分区) - 作用:用于存储引导加载程序(如U-Boot),系统启动时可以直接从该区域加载引导代码。当系统上电复位后,SoC(处理器)内部的 ROM Code(BootROM) 会检测 eMMC 设备,并尝试从 Boot 分区 读取 Bootloader。
- 特点:
- eMMC通常提供两个Boot分区(Boot Partition 1 和 Boot Partition 2)。
- 每个Boot分区的大小通常是固定的(如128KB、512KB或4MB,取决于eMMC规格)。
- 可以通过EXT_CSD[179] BOOT_CONFIG配置哪个Boot分区用于启动。关于EXT_CSD[179] BOOT_CONFIG的详细介绍见本博文后面。
- 只能通过特殊方式(如u-boot中的eMMC命令mmc bootpart enable或 Linux 系统下的命令dd if=uboot.img of=/dev/mmcblkXboot0)写入。
- 不能用于普通数据存储。
2. RPMB(Replay Protected Memory Block,防重放保护存储区) - 作用:
- 主要用于存储安全相关数据,例如加密密钥、认证信息、防篡改数据等。
- 具有防重放保护机制,可防止存储数据的回滚攻击。防重放保护通常是指防止攻击者通过回滚存储器内容,恢复到较早的状态,从而绕过安全检查或重现旧的、可能已被撤销的凭据。
- 特点:
- 只能通过安全认证的方式访问,不能像普通块设备一样读写。
- 通常容量较小,例如512KB或更大。
- 不能直接挂载或用于普通存储。
3. General Purpose Partitions(通用分区) - 作用:
- 额外的可由用户定义的分区,可用于存储操作系统、应用程序或其他数据。
- 特点:
- eMMC允许创建最多4个通用分区。
- 大小可配置,但一旦分配就不能动态调整。
- 适用于某些特殊用途,例如存放文件系统、日志或者特定数据。
4. User Data Area(用户数据区域) - 作用:
- 特点:
- 这个区域是eMMC中容量最大的部分,相当于普通SD卡的存储空间。
- 可以划分多个逻辑分区(如ext4、FAT等)。
- 直接映射为Linux设备,例如 /dev/mmcblkX(裸设备)或 /dev/mmcblkXpY(分区)。
- 采用可磨损均衡(Wear Leveling)和坏块管理机制,以提高eMMC的寿命和稳定性。
5. Enhanced User Data Area(增强型用户数据区) - 作用:
- 允许将部分User Data Area转换为SLC模式,以提升写入寿命和可靠性。
- 特点:
- 通过配置EXT_CSD寄存器来分配。
- 牺牲存储容量换取更高的耐久性。
- 适用于高频写入的数据,如日志、数据库等。
eMMC启动过程的两个阶段 读下面的内容的时候会涉及到EXT_CSD[179] 这个重要的配置寄存器字节,下个目录正是对EXT_CSD[179] 的介绍。 eMMC 启动过程通常分为两个阶段: 1. Boot 读取阶段(ROM Code 加载 Bootloader) - 触发方式:当系统上电复位后,SoC(处理器)内部的 ROM Code(BootROM) 会检测 eMMC 设备,并尝试从 Boot 分区 读取 Bootloader。
- 数据来源:由 EXT_CSD[179] (BOOT_PARTITION_ENABLE) 决定,可能是:
- Boot 分区 1
- Boot 分区 2
- User Area(少见)
- 数据传输模式:
- 普通模式(默认):SoC 使用 eMMC 标准读命令(如 CMD17)。
- 快速启动模式(eMMC 4.4+ 支持):eMMC 直接将 Boot 分区数据发送到 SoC,无需主机发送额外的读命令。
- Boot Acknowledge(可选):如果 EXT_CSD[179].BOOT_ACK=1,eMMC 会在 Boot 过程中发送确认信号。
2. 正常数据操作阶段(OS 加载并运行) - Bootloader 运行后,它会进一步初始化硬件,并从 eMMC 加载 OS(如u-boot 或 Linux)。
- 访问数据区域:操作系统通过标准 eMMC 命令访问 User Area 或 其他分区,此时访问的数据分区称为叫当前访问分区(也称为叫“当前活动分区”)。
- 分区切换:
- PARTITION_ACCESS(EXT_CSD[179] 低 3 位)控制当前访问的分区(当前活动分区)为哪个分区。
- 默认 OS 访问 User Area(PARTITION_ACCESS=0x0)。
- 若 OS 需要访问 Boot 分区或 RPMB,则需修改EXT_CSD[179] 的 PARTITION_ACCESS字段。
eMMC的EXT_CSD[179] BOOT_CONFIG是什么东西? 名字来源 EXT_CSD这个名字的来源是Extended CSD。CSD是Card-Specific Data的缩写,直译为“卡指定数据”,即为为设置存储卡指定的数据,实际上就是存储器的寄存器。
所以我们通常说:“eMMC 设备的 EXT_CSD寄存器。” eMMC 设备的 EXT_CSD寄存器是一个 512 字节大小的寄存器空间,用于存储 eMMC 设备的各种扩展配置参数。EXT_CSD[179] 表示 EXT_CSD 寄存器的第 179 个字节(从 0 开始计算)。在 eMMC 规格中,EXT_CSD[179] 这个字节被定义为 BOOT_CONFIG(引导配置),所以出现了标题中的EXT_CSD[179] BOOT_CONFIG这个名字。 eMMC的哪些分区是不可调整的?哪些是可以调整的? 问:eMMC的存储区域是出厂时就划分好的,还是后来根据需要用工具或命令划分的? 答: 1. 出厂默认划分的区域 在 eMMC 出厂时,制造商已经预先划分了以下区域: eMMC 区域出厂时状态
Boot Partition 1预设大小(如 4MB),无法调整
Boot Partition 2预设大小(如 4MB),无法调整
RPMB Partition预设大小(如 512KB),无法调整
User Data Area整个剩余容量,可以重新分区
General Purpose Partitions(通用分区)默认不存在,需要手动创建
2. 后续可手动调整的部分 虽然 Boot 分区和 RPMB 分区的大小是固定的,但用户可以使用工具或命令进行如下调整: - 用户数据区(User Area)划分逻辑分区 → 用 fdisk、parted 等工具对User Area区划分逻辑分区,如 /dev/mmcblk0p1(rootfs)、/dev/mmcblk0p2(data)。
- 创建通用分区(General Purpose Partitions) → 通过修改 eMMC 的 EXT_CSD 寄存器,将一部分用户数据区转换为通用分区。
- 转换部分用户数据区为增强型存储(Enhanced User Data Area, SLC模式) → 提升可靠性,但会减少容量。
1. eMMC 启动的基本原理 - 分区结构:
eMMC设备通常具有特定的分区结构,常见分区包括:
- Boot Partition: 存储启动程序(Bootloader),通常有两个独立的启动分区(Boot Partition 0 和 Boot Partition 1),用于冗余或备份。
- RPMB Partition: 安全区域,用于存储加密数据和访问控制信息。
- User Area: 存储用户数据和操作系统。
- 启动过程:
- 硬件上电:系统上电后,处理器初始化。
- ROM代码执行:处理器运行固化在芯片中的启动代码(Boot ROM),用于识别和初始化eMMC。
- 选择启动分区:根据eMMC设备的配置寄存器,处理器选择从 Boot Partition 0 或 Boot Partition 1 加载启动程序。
|