分区配置
备注
本节中 BL1 特指固化在芯片中的 BootROM,`BL2` 特指 Bootloader,即 mcuboot。
分区表
FLASH 分区表为 CSV 文件,下面为一个配置示例:
Name |
Offset |
Size |
Execute |
Read |
Write |
---|---|---|---|---|---|
bl2 |
128k |
TRUE |
TRUE |
||
primary_cpu0_app |
128k |
TRUE |
TRUE |
||
secondary_cpu0_app |
128k |
TRUE |
TRUE |
||
sys_rf |
0x3fe000 |
4k |
TRUE |
||
sys_net |
4k |
TRUE |
分区表固定为六列:
Name
- 必选项,表示分区名字。
分区名必须唯一。构建系统会依据分区名字来生成一组宏,只有分区名字唯一才能确保生成宏不会重复定义。
升级方式:ref:`升级策略 <_bk_config_ota_strategy>`使用 SWAP 或者 XIP 时,代码分区名格式必须为 一组 primary_binname 和 secondary_binname,两者需要 binname 对应且大小相同。 其中:
primary 前缀表示 OTA 升级时对应的主分区(在 XIP 升级时,对应 A 分区)。
secondary 前缀表示 OTA 升级时对应的次分区(在 XIP 升级时,对应 B 分区),当 secondary 分区不存在时表示该 BIN 不可升级。
binname 表示分区中放置的二进制文件名字,例如,primary_cpu0_app 分区中放置的二进制文件为 cpu0_app.bin。
升级方式使用 OVERWRITE 时,代码分区名格式为 primary_binname ,且需要包含名为 ota 的分区。 - primary 前缀表示存放可执行文件的区域,是该代码运行的分区。 - ota分区是存放用于升级的文件的区域,所有带有primary_前缀分区中的二进制文件会被压缩,并且通过OTA下载存放在该分区中。
保留分区,保留分区为 Armino 已用着特定用途的分区:
primary_cpu0_app 与 secondary_cpu0_app - 构建 app.bin 时会使用这两个分区生成的宏进行链接。
bl2 - 构建 bl2.bin 时会使用到这两个分区生成的宏进行链接。
primary_tfm_s 与 secondary_tfm_s - 构建 tfm_s.bin 时会使用到这两个分区生成的宏进行链接。
primary_tfm_ns 与 secondary_tfm_ns - 构建 tfm_ns.bin 时会使用到这两个分区生成的宏进行链接。
primary_all 与 secondary_all - 构建系统生成的虚拟分区,用于将多个分区合并成一个分区之后进行整体加签。
sys_ps,sys_its, sys_otp_nv - 这三个分区均为 tfm_s.bin 中的特有分区,当 primary_tfm_s 分区存在时,这个三分区必须存在。
sys_rf,sys_net - Armino 中特有分区,RF 校准,Wi-Fi/TCPIP 会用到这两个分区。当 primary_cpu0_app 存在时,这两个分区必须存在。
bl1_control, manifest - 安全启动相关分区。
Offset
- 可选项。表示分区在 FLASH 的物理偏移量。
未配置 offset 时,``offset`` 取值为上一个分区结束地址。首分区未配置时,``offset`` 为 0。
允许相邻两个分区地址之间存在空洞,但不允许出现重叠。
一般不建议配置 offset,除非要在特定的,不连续的位置放置一个分区时,才需要配置 offset。
offset 对齐需求:
任何分区必须 4K 对齐。
S/NS 交界处相邻的两个分区必须 68K 对齐,否则 MPC 配置时会出现一个 S/NS block 横跨两个分区现象。
Size
- 必选项。表示分区大小,单位 k/K 表示 Kbytes,m/M 表示 Mbytes,通常建议 4K 对齐。
Execute
- 可选项。分区可执行权限,通常代码分区需配置为 TRUE,数据分区配置为 FALSE。不配置时,表示不可执行。
Read
- 可选项。分区可读权限,不配置时,表不可读。
Write
- 可选项。分区可写权限,不配置时,表不可写。
分区配置
下载模式分区配置
在下载模式下,最小分区配置表如下:
Name |
Offset |
Size |
Execute |
Read |
Write |
---|---|---|---|---|---|
bl2 |
128k |
TRUE |
TRUE |
||
primary_cpu0_app |
1024k |
TRUE |
TRUE |
||
secondary_cpu0_app |
1024k |
TRUE |
TRUE |
||
sys_rf |
0x3fe000 |
4k |
TRUE |
||
sys_net |
4k |
TRUE |
其中前三个分区放在 FLASH 首部,后两个分区放在 FLASH 尾部。各分区用途如下:
bl2
- Bootloader 分区。
primary_cpu0_app
- CPU0 上运行代码分区,即 cpu0_app.bin。
secondary_cpu0_app
- OTA 分区,用于升级 cpu0_app.bin。
通常,您可按下述步骤进行配置与扩充:
调整尾部分区偏移 - 依据 FLASH 实际大小调整尾部分区
Offset
。例如,如果使用的是 8MB FLASH,则 sys_rf 的偏移调整为 0x7fe000。调整首部各分区大小 - 依据实际生成的二进制大小,调整各分区的
Size
。增加用户分区 - 一般建议在首部与尾部分区之间增加您的分区。
安全启动分区配置
在安全启动模式下,最小分区配置表如下:
Name |
Offset |
Size |
Execute |
Read |
Write |
---|---|---|---|---|---|
bl1_control |
12k |
TRUE |
TRUE |
||
manifest |
4k |
TRUE |
|||
bl2 |
128k |
TRUE |
TRUE |
||
primary_tfm_s |
512k |
TRUE |
TRUE |
||
primary_cpu0_app |
2304k |
TRUE |
TRUE |
||
secondary_tfm_s |
512k |
TRUE |
TRUE |
||
secondary_cpu0_app |
2304k |
TRUE |
TRUE |
||
sys_ps |
0x7e4000 |
32k |
TRUE |
||
sys_its |
32k |
TRUE |
|||
sys_otp_nv |
8k |
TRUE |
|||
sys_rf |
4k |
TRUE |
|||
sys_net |
4k |
TRUE |
其中前九个分区放在 FLASH 首部,后五个分区放在 FLASH 尾部。各分区用途如下:
bl1_control
- 用于 BL1 控制,包括硬件重启时跳转地址配置,OTP 模拟,BL1 调试等。
manifest
- 对bl2
的加签信息放在这个分区,系统上电后,BL1 会依据这个分区的内容对bl2
进行验签,验签通过才跳转到 BL2。
bl2
- BL2 二进制文件,其加签信息放在manifest
。
primary_tfm_s
- Primary TFM_S 二进制文件。
primary_cpu0_app
- Primary CPU0 APP 二进制文件。
secondary_tfm_s
- Secondary TFM_S 二进制文件。
secondary_cpu0_app
- Secondary CPU0 APP 二进制文件。
sys_ps
,``sys_its``,sys_otp_nv
- TFM_S 中安全存储相关的分区。
sys_rf
,``sys_net`` - Armino RF 校准,Wi-Fi/TCPIP 配置相关分区。
同样地,如果使用OVERWRITE升级策略:
Name |
Offset |
Size |
Execute |
Read |
Write |
---|---|---|---|---|---|
bl1_control |
12k |
TRUE |
TRUE |
||
manifest |
4k |
TRUE |
|||
bl2 |
128k |
TRUE |
TRUE |
||
primary_tfm_s |
512k |
TRUE |
TRUE |
||
primary_cpu0_app |
2304k |
TRUE |
TRUE |
||
ota |
1024k |
TRUE |
|||
sys_ps |
0x7e4000 |
32k |
TRUE |
||
sys_its |
32k |
TRUE |
|||
sys_otp_nv |
8k |
TRUE |
|||
sys_rf |
4k |
TRUE |
|||
sys_net |
4k |
TRUE |
通常,您可按 下载模式分区配置与扩充 类似的方法配置与扩充安全启动分区。
用户自定义分区配置
在量产版本中分区配置中,建议您参考 下载模式分区配置 与 安全启动模式分区配置 来配置您的分区表。但在开发阶段,您可能想完全重新定义自己的分区表,例如,不跑 Bootloader,不支持 OTA 等。您可参考本节中的示例来定制化 自己的分区表。
简化分区表
下载模式下,只跑 cpu0_app.bin:
Name |
Offset |
Size |
Execute |
Read |
Write |
---|---|---|---|---|---|
primary_cpu0_app |
1024k |
TRUE |
TRUE |
||
sys_rf |
0x3fe000 |
4k |
TRUE |
||
sys_net |
4k |
TRUE |
在下载模式下,跑 bl2.bin 与 cpu0_app.bin,但不需要 OTA:
Name |
Offset |
Size |
Execute |
Read |
Write |
---|---|---|---|---|---|
bl2 |
128k |
TRUE |
TRUE |
||
primary_cpu0_app |
1024k |
TRUE |
TRUE |
||
sys_rf |
0x3fe000 |
4k |
TRUE |
||
sys_net |
4k |
TRUE |
在安全启动模式下,只跑 cpu0_app.bin:
Name |
Offset |
Size |
Execute |
Read |
Write |
---|---|---|---|---|---|
bl1_control |
12k |
TRUE |
TRUE |
||
manifest |
4k |
TRUE |
TRUE |
||
bl2 |
128k |
TRUE |
TRUE |
||
primary_cpu0_app |
2304k |
TRUE |
TRUE |
||
sys_rf |
0x3fe000 |
4k |
TRUE |
||
sys_net |
4k |
TRUE |
运行自己的 BIN
以下载模式为例,如果您想增加两个可升级的 BIN: test1.bin 与 test2.bin,则分区表配置如下:
Name |
Offset |
Size |
Execute |
Read |
Write |
---|---|---|---|---|---|
bl2 |
128k |
TRUE |
TRUE |
||
primary_cpu0_app |
1024k |
TRUE |
TRUE |
||
|
32k |
TRUE |
TRUE |
||
|
32k |
TRUE |
TRUE |
||
secondary_cpu0_app |
1024k |
TRUE |
TRUE |
||
|
1024k |
TRUE |
TRUE |
||
|
1024k |
TRUE |
TRUE |
||
sys_rf |
0x3fe000 |
4k |
TRUE |
||
sys_net |
4k |
TRUE |
或者使用OVERWRITE升级策略:
Name |
Offset |
Size |
Execute |
Read |
Write |
---|---|---|---|---|---|
bl2 |
128k |
TRUE |
TRUE |
||
primary_cpu0_app |
1024k |
TRUE |
TRUE |
||
|
32k |
TRUE |
TRUE |
||
|
32k |
TRUE |
TRUE |
||
ota |
512k |
TRUE |
|||
sys_rf |
0x3fe000 |
4k |
TRUE |
||
sys_net |
4k |
TRUE |
分区生成宏
Armino 构建时,构建系统会依据分区表生成 partitions_gen.h,本节介绍代码生成规则。
数据分区宏生成
分区表中分区,均会在 partitions_gen.h 中生成一组宏。对于数据或者系统分区,仅生成分区偏移及大小,
以 sys rf` 与 ``sys net
为例:
#define CONFIG_SYS_RF_PHY_PARTITION_OFFSET 0x3fe000
#define CONFIG_SYS_RF_PHY_PARTITION_SIZE 0x1000
#define CONFIG_SYS_NET_PHY_PARTITION_OFFSET 0x3ff000
#define CONFIG_SYS_NET_PHY_PARTITION_SIZE 0x1000
代码分区
包含 BIN 的代码分区除了要生成数据分区中的分区偏移与大小外,还要生成用于构建 BIN 使用的链接地址。 以 primary_bl2 分区为例,partitions_gen.h 中会生成宏如下:
#define CONFIG_PRIMARY_BL2_PHY_PARTITION_OFFSET 0x24000
#define CONFIG_PRIMARY_BL2_PHY_PARTITION_SIZE 0x10000
#define CONFIG_PRIMARY_BL2_PHY_CODE_START 0x24068
#define CONFIG_PRIMARY_BL2_VIRTUAL_PARTITION_SIZE 0xf0e0
#define CONFIG_PRIMARY_BL2_VIRTUAL_CODE_START 0x21e80
#define CONFIG_PRIMARY_BL2_VIRTUAL_CODE_SIZE 0xf060
这些宏被用在 bl2.bin 的链接,bl2 及 OTA 源代码中。
BL2 分区图示如下:

生成宏计算方式:
CONFIG_PRIMARY_BL2_PHY_PARTITION_OFFSET
- 分区的起始物理地址为 0x24000,由 partitions 定义。
CONFIG_PRIMARY_BL2_PHY_CODE_START
- 自动计算生成,为 0x21e80,会加 CRC。
偏移 0x24000 处即可放置代码,但需要考虑对齐:
CRC 对齐,对齐后物理地址为 ((0x24000 + 33)/34)*34 = 0x24002, 虚拟地址为 0x21e20。
CPU 向量对齐,CM33 为 128B 对齐, ((0x21e20 + 127)/128)*128 = 0x21e80,相应的物理地址为: 0x24068。
CONFIG_PRIMARY_BL2_VIRTUAL_CODE_SIZE
- 自动计算生成,为 0xf060
对齐浪费空间为 0x24068 - 0x24000 = 0x68,剩余: 0x10000 - 0x68 = 0xff98
再减 34B 保护字节: 0xff98 - 34 = 0xff76
转虚拟长度: (0xff76/34)*32 = 0xf060
重要
从上述计算可知,并非整个代码分区都能用来放置代码,因为要考虑 CRC 与 CPU vector 对齐。对于使用 BL2 进行验签的分区还要去掉头尾各 4K 空间(用于放置加签信息)。如果编译了同来的 bin 大小为 bin_size, 建议 partition size 至少要配置: (bin_size/32)x34 + hdr_size + tail_size + 128 + 34 + unused_size。 其中 unused_size 为预留给未来 bin 增长的空间。在这个基础之后再做 4K 对齐。