常见分区类型:系统分区、用户数据分区、缓存分区、恢复分区、扩展分区

分区这玩意儿,说白了就是给存储芯片画格子。每个格子干不同的活,互不干扰。我刚开始做嵌入式那会儿,总觉得分区越多越麻烦,后来吃过亏才明白——分区规划得好,后面能省一大半的调试时间。

今天咱们就把最常见的五种分区类型掰开揉碎了讲。你想想看,一个设备从开机到正常运行,中间要经历多少环节?每个环节对应哪个分区?搞清楚这个,烧录地址设置才不会出错。

核心认知:分区不是随便画的。每个分区都有固定的职责、大小要求和烧录地址约束。选错分区类型,轻则系统启动慢,重则直接变砖。

2.1 系统分区(System Partition)

系统分区,就是存放操作系统内核、驱动、核心库和系统应用的地方。说白了,设备的大脑在这儿。

我记得有一次做智能网关项目,客户要求OTA升级。我一开始把系统分区只留了8MB,结果内核一更新就爆了。后来我学乖了——系统分区至少留出30%的冗余空间。

属性 说明
典型大小 16MB ~ 256MB(视芯片和OS而定)
文件系统 通常为只读(如 squashfs、EROFS)
烧录地址 一般从 Flash 起始偏移 0x100000 之后开始
挂载点 /system 或 /

我的习惯:系统分区我一般放在 Flash 的前半段,离 Bootloader 近一些。这样启动时读取速度快,而且不容易被用户数据区的坏块影响。

2.2 用户数据分区(User Data Partition)

用户数据分区,就是存用户文件、应用配置、日志的地方。这个分区最容易被写满,也最容易出问题。

你想想看,用户装App、拍照、下载文件,全往这里塞。如果分区规划不合理,设备用着用着就提示“存储空间不足”。

我在做行车记录仪项目时,就遇到过用户数据分区碎片化严重导致写入变慢的问题。后来我强制在分区格式化时预留了5%的备用块,才把问题压下去。

属性 说明
典型大小 64MB ~ 数GB(取决于产品定位)
文件系统 可读写(如 ext4、F2FS、FAT32)
烧录地址 紧跟在系统分区之后
挂载点 /data 或 /userdata

注意:用户数据分区在OTA升级时通常不会被擦除。但如果分区表变了,数据就会全部丢失。所以改分区大小前,一定要提醒用户备份。

2.3 缓存分区(Cache Partition)

缓存分区,很多人觉得可有可无。其实不然。系统升级包下载、OTA差分补丁、日志临时存储,都靠它。

我见过不少工程师把缓存分区砍掉,结果OTA升级时因为没地方放临时文件,升级到一半就失败了。嗯,这里要注意——缓存分区的大小,直接决定了你能做多大的OTA升级包。

属性 说明
典型大小 8MB ~ 64MB
文件系统 可读写(ext4 或 raw 分区)
烧录地址 通常在用户数据分区之前或之后
挂载点 /cache

我的建议:缓存分区至少留16MB。如果产品支持A/B无缝升级,缓存分区可以更大一些,用来存放升级包校验文件。

2.4 恢复分区(Recovery Partition)

恢复分区,是设备的“急救室”。当系统分区坏了、启动不了,用户可以通过恢复模式刷机、恢复出厂设置。

我曾经在一个项目里,把恢复分区和系统分区放在同一个擦除块上。结果系统分区坏了,恢复分区也跟着读不出来——直接变砖。从那以后,我坚持把恢复分区放在独立的物理块上。

属性 说明
典型大小 8MB ~ 32MB
文件系统 只读(squashfs 或 raw image)
烧录地址 通常放在 Flash 末尾或独立区域
挂载点 不挂载,由 Bootloader 直接启动

避坑指南:恢复分区一定要做校验。我曾经遇到过恢复分区镜像损坏,用户进恢复模式直接黑屏。现在我的做法是——在烧录时加CRC校验,启动时再校验一次。

2.5 扩展分区(Extended Partition)

扩展分区,是MBR分区表时代的产物。因为MBR主分区最多只能有4个,所以用扩展分区来“套娃”——在扩展分区里面再创建逻辑分区。

不过说实话,现在嵌入式设备大多用GPT分区表了,扩展分区用得越来越少。但老项目、老芯片上还是会碰到。

属性 说明
典型大小 取决于剩余空间
文件系统 无(仅作为容器)
烧录地址 最后一个主分区之后
挂载点 不直接挂载

我的经验:如果芯片支持GPT,就别用扩展分区了。GPT支持128个主分区,省心得多。只有遇到老芯片(比如某些ARM Cortex-A7方案)才需要保留MBR兼容。

2.6 分区布局总览

说了这么多,咱们用一张图把五种分区的关系理清楚。这张图是我做项目时常用的布局模板,你可以直接参考。

嵌入式 Flash 分区布局示意图 Bootloader 系统分区 缓存分区 用户数据分区 恢复分区 扩展分区(可选,MBR 模式下用于容纳逻辑分区) 说明: • 分区顺序不是固定的,但 Bootloader 必须在最前面 • 恢复分区建议放在最后,避免被其他分区擦除操作影响

2.7 分区选择决策树

实际项目中,不是所有分区都要用。怎么选?我总结了一个简单的决策逻辑:

  • 系统分区——必须有。没有它,设备跑不起来。
  • 用户数据分区——必须有。用户数据总得有个地方存。
  • 缓存分区——建议有。OTA升级、日志存储都靠它。
  • 恢复分区——建议有。万一系统崩了,这是最后的救命稻草。
  • 扩展分区——看情况。GPT分区表不需要,MBR分区表超过4个分区才需要。

总结一下:分区规划是嵌入式开发的“地基”。地基没打好,后面烧录地址、启动流程、OTA升级全都会出问题。我建议你在项目初期就画好分区布局图,把每个分区的起始地址、大小、文件系统类型都写清楚。这样后面写烧录脚本、配地址的时候,心里才有底。