eMMC分区方案设计:Boot分区、系统分区、数据分区怎么分才合理

做嵌入式产品开发,很多人在画完原理图、调完驱动之后,会遇到一个说简单不简单、说难不难的问题:eMMC怎么分区?

有人直接把整个eMMC当一个分区用,系统、程序、用户数据、日志全塞在一起。结果用一段时间就出问题:系统OTA升级失败、用户数据损坏、日志把存储写满、恢复出厂设置把系统也清了。

这些问题,十有八九是分区方案设计不合理。

这篇文章讲清楚eMMC分区方案怎么设计:eMMC自带的硬件分区是什么、瑞芯微平台的分区表怎么排、分区大小怎么定、有哪些坑要避开。文章末尾配一张eMMC分区架构与分区方案汇总图,一图看懂怎么分。

一、先搞清楚:eMMC本身自带哪些分区

很多人以为eMMC就是一块"大硬盘",想怎么用怎么用。实际上,eMMC内部不是一整块,它自带分区结构,由eMMC控制器管理,写CSD(Card Specific Data)寄存器来配置。

eMMC的分区结构,从上到下分四层:

第一层:Boot Area Partition(启动分区)

eMMC自带两个Boot分区,Boot Area Partition 1和Boot Area Partition 2,各4MB(标准配置)。这两个分区是给SoC启动用的------SoC上电后,可以从Boot分区读取启动代码。

关键特性:

  1. 默认写保护,要发专用命令(CMD25之后设置)才能写。

  2. 启动时SoC通过硬件引脚(BOOT模式)或命令(CMD0后发CMD1)从Boot分区启动。

  3. 可以配置成只用Boot1、只用Boot2、或两个都用。

第二层:RPMB(Replay Protected Memory Block,重放保护内存块)

RPMB是eMMC里最特殊的分区,一般4MB。它提供"带认证的安全存储"------每次读写都要做HMAC认证,防止重放攻击。

关键特性:

  1. 用于存密钥、安全配置、防篡改数据。

  2. 读写需要密钥(每颗eMMC的RPMB密钥出厂时写死,或由厂商配置)。

  3. 写RPMB前要先Program Key,之后才能正常读写。

第三层:GPP(General Purpose Partition,通用分区)

eMMC最多支持4个通用分区(GPP1至GPP4),每个分区大小可配置。GPP是可选的------如果不做多媒体、大文件特殊管理,可以不用GPP,把空间全给用户数据区。

第四层:User Data Area(用户数据区)

用户数据区是eMMC的大头,占绝大部分容量。系统、程序、用户数据、日志都在这里。用户数据区还可以再划分成多个逻辑分区(逻辑分区数量、大小由主控端的分区表决定,不是eMMC本身决定)。

一句话总结:eMMC自带4MB Boot1 + 4MB Boot2 + RPMB + (可选)GPP + 用户数据区。Boot和RPMB是硬件分好的,用户数据区是留给系统自由分配的。

二、用户数据区为什么还要再分区

搞清楚了eMMC自带分区,下面说用户数据区。用户数据区是整个eMMC的主体,但大部分人直接把它当成一个整块用------这不对。

用户数据区需要再分成多个逻辑分区,原因有三:

原因一:隔离,防止相互影响

系统、程序、用户数据、日志混在一个分区里,谁出问题都会连累谁。系统分区被用户数据写满,系统就起不来;日志无限增长,把存储空间耗尽,程序就崩。分区隔离后,各管各的,一个分区满/坏,不影响其他分区。

原因二:OTA升级需要

OTA升级的本质是"用新系统替换旧系统"。如果系统只有一份,升级中途断电、写一半失败,系统就变砖了。所以要做A/B分区或recovery分区------A系统升级失败,还能从B系统或recovery启动。这就必须有独立分区。

原因三:恢复出厂设置需要

恢复出厂设置(Factory Reset),应该是"清掉用户数据,保留系统",而不是"把系统也清了"。系统分区和数据分区分开,恢复出厂只要清数据分区,系统分区不受影响。

一句话总结:用户数据区再分区,是为了隔离、升级、恢复出厂这三个基本需求。

三、瑞芯微平台的分区表怎么排

瑞芯微平台(RK3568、RK3588等)的分区方案,是在parameter.txt(或RKParameter)里定义的。这是一个文本分区表,定义了每个分区的名字、起始地址、大小。

瑞芯微平台常见分区布局(以8GB eMMC为例):

  1. uboot分区(约4MB)

存U-Boot引导代码。系统上电,SoC先从Boot分区(或从uboot分区的镜像)启动U-Boot,U-Boot再加载内核。

注意:瑞芯微的方案里,U-Boot镜像既可以放eMMC的Boot分区,也可以放用户数据区的uboot分区。前者叫Boot分区启动,后者叫普通分区启动,两种都支持,要看方案怎么配。

  1. misc分区(约4MB)

存系统启动控制信息------比如"进入recovery模式"、"进入loader模式"、OTA升级标志等。系统重启时读misc分区判断要正常启动还是进recovery。

  1. boot分区(约64MB)

存内核(kernel)镜像和设备树(DTB)。U-Boot加载boot分区的内核和DTB启动系统。

  1. recovery分区(约64MB)

存恢复系统镜像。系统坏了进recovery,从recovery恢复或刷机。

  1. system分区(约2GB)

存根文件系统(rootfs)。系统正常运行时的程序、库、配置都在这里。瑞芯微的方案里,system分区通常是只读的(squashfs或ext4只读挂载)。

  1. cache分区(约512MB)

存系统缓存、OTA升级的临时数据。OTA升级时,新系统包先下载到cache分区,校验通过后再写入system分区。

  1. userdata分区(剩余空间)

存用户数据------应用数据、用户文件、日志、下载等。恢复出厂设置清的就是这个分区。

  1. (可选)A/B分区

如果做A/B无缝升级,把system、boot各做两份(system_a/system_b、boot_a/boot_b),当前系统从A跑,升级写到B,写完切到B,下次从B启动。A/B分区能实现"升级失败自动回滚",但需要双倍系统空间。

分区表怎么定大小:分区大小按实际需求定,但要遵守两个原则------分区起始地址对齐(一般1MB对齐,性能好),大小给足裕量(系统分区、数据分区都要留余量,防止用满)。

四、分区方案设计的6条原则

讲了瑞芯微默认分区,下面说设计原则。不管用什么主控,分区方案设计都遵守这6条:

原则1:系统只读,数据可写

system、boot这类系统分区,能只读就只读(挂载时用ro参数,或文件系统用squashfs)。系统只读,能防止运行中被改坏、被病毒木马篡改,升级也简单------直接整体替换。

原则2:日志单独分区,或用tmpfs

日志是最容易出问题的------无限增长,写满存储。方案:日志单独分一个分区(满了自动覆盖旧日志),或者干脆用tmpfs(内存文件系统,重启自动清空)。千万不要让日志和系统、数据混在一起。

原则3:数据分区给足裕量

userdata分区是用户数据的主要存放地,一定要留足裕量------建议至少留30%空闲空间。空间越满,文件系统性能越差、碎片越多、越容易损坏。

原则4:分区对齐,性能更好

分区起始地址、分区大小都做对齐(至少1MB对齐,最好对齐到eMMC的擦除块大小)。不对齐会导致读写跨越擦除块边界,性能下降、寿命变短。

原则5:OTA升级要留后路

要么用A/B分区(升级失败自动回滚),要么用recovery分区(升级失败进recovery恢复)。千万不要只留一份系统,升级失败就变砖。

原则6:RPMB和Boot分区用起来

安全数据(密钥、防篡改配置)放RPMB,不要放普通分区------普通分区任何人都能读,RPMB有认证保护。启动代码放Boot分区或独立uboot分区,不要和系统程序混在一起。

五、常见坑和排查方法

分区方案设计的坑,大部分在投产之后才暴露。下面列最常见的5个坑和排查方法。

坑1:分区太小,OTA升级失败

表现:OTA升级下载到一半失败,或校验不通过。原因:cache分区(或升级缓存分区)太小,装不下整个升级包。

排查方法:查升级日志,看是不是"no space left on device"。解决:加大cache分区,或升级包下载到数据分区(但要校验,防止篡改)。

坑2:日志写满存储,系统卡死

表现:设备运行几个月后越来越慢,存储空间100%,系统频繁报错。原因:日志无限增长,写满了数据分区或系统分区。

排查方法:df看哪个分区满了,du看哪个目录大。解决:日志单独分区+logrotate自动轮转,或改用tmpfs。

坑3:恢复出厂设置把系统清了

表现:用户点"恢复出厂设置",结果设备变砖,系统起不来。原因:系统分区和数据分区没分开,恢复出厂把整个用户数据区都清了。

排查方法:看恢复出厂脚本(如format分区列表),确认只清userdata。解决:恢复出厂只清数据分区,不动系统分区。

坑4:突然断电后,系统或数据损坏

表现:设备突然断电再上电,系统起不来,或用户数据丢失。原因:eMMC掉电保护不足,或文件系统在断电时写入不完整。

排查方法:查启动日志,看是不是文件系统错误(fsck)。解决:系统分区只读(减少断电损坏面),数据分区用带日志的文件系统(ext4、f2fs),关键产品用带掉电保护(PLP)的eMMC。

坑5:RPMB操作失败,安全功能不可用

表现:设备上电报RPMB读写错误,密钥功能、防篡改功能不可用。原因:RPMB密钥没配好,或RPMB读写流程不对。

排查方法:查U-Boot和内核日志里的RPMB错误。解决:确认RPMB密钥已Program,确认读写流程正确(先认证再读写)。

六、配图:eMMC分区架构与分区方案汇总图

下面这张图把eMMC的分区架构和瑞芯微平台的分区方案汇总起来,一图看懂怎么分。

图中要点:

  • 左侧是eMMC硬件分区:Boot1/Boot2(各4MB,启动用)、RPMB(安全存储)、GPP(可选)、User Data(用户数据区)。

  • 右侧是用户数据区的逻辑分区(瑞芯微方案):uboot、misc、boot、recovery、system、cache、userdata,以及可选的A/B分区。

  • 底部是6条设计原则:系统只读、日志独立、数据裕量、分区对齐、OTA留后路、RPMB/Boot用起来。

七、总结

eMMC分区方案设计,不是"把eMMC当一块硬盘随便用"。分对了,系统稳、升级安全、恢复出厂干净;分错了,日志写满、升级变砖、数据损坏。

核心要点总结:

  1. eMMC自带硬件分区:Boot1/Boot2(各4MB)、RPMB(安全存储)、GPP(可选)、用户数据区。

  2. 用户数据区要再分区:为了隔离、OTA升级、恢复出厂设置三个基本需求。

  3. 系统分区只读,数据分区可写:系统只读防止被改坏,数据可写满足用户需求。

  4. 日志单独分区或用tmpfs:防止日志无限增长写满存储。

  5. 数据分区留足裕量:至少30%空闲,防止文件系统变慢、损坏。

  6. 分区对齐:至少1MB对齐,性能更好、寿命更长。

  7. OTA升级要留后路:A/B分区或recovery分区,升级失败不变砖。

  8. RPMB和Boot分区用起来:安全数据放RPMB,启动代码独立分区。

最后一句话:分区方案不是技术细节,是产品可靠性的一部分。分对了,系统才经得起时间考验。

有eMMC分区方案设计相关的问题,欢迎评论区交流。

相关推荐
女神下凡3 小时前
芯参谋(68):ADC模数转换器电路设计指南
arm开发·单片机·嵌入式硬件·硬件工程·设计规范
chu_bingzhi12 小时前
ARM异常处理
arm开发
武汉万象奥科14 小时前
T153芯片解析:ARM+RISC-V异构架构,集成三路千兆网
arm开发·嵌入式硬件·物联网·arm核心板
黑马水牛1 天前
RK3588系列:01-系统烧录与开发环境搭建
arm开发·嵌入式硬件
像枫一样2 天前
STM32串口轮询收发实战教程
arm开发·c++·stm32·单片机·嵌入式硬件·fpga开发·51单片机
晚枫歌F2 天前
dpdk实现kni
arm开发
大叔学Linux2 天前
FreeRTOS任务切换笔记
arm开发·笔记
Chery11402 天前
DPE5500 SPI以太网协议栈芯片详解:10/100M以太网、硬件TCP/IP与国产替代方案
arm开发·网络协议·tcp/ip
a5986523 天前
原生ARM云手机实测|ARM服务器底座,主流手游兼容性、闪退、帧率专项测试
服务器·arm开发·智能手机·云手机