Edit online

配置分区

3 Mar 2025
Read time: 6 minute(s)

Baremetal 系统中,分区的设置和管理是系统正常运行和日常维护的重要方面。本章节介绍 Baremetal 系统中分区的特点、规则和分区修改的方法。

按照存储介质的逻辑划分,关于Baremetal 默认分区类型,可查看

修改分区

image_cfg.json 文件是设置分区信息以及如何生成烧录镜像文件的配置文件,由于分区和烧录信息是相互关联的,因此在一个文件中进行配置。 image_cfg.json 文件的保存路径为 target/chip/board/pack/image_cfg.json

分区数值的书写规则如下:
  • 不带单位,表示字节

  • 可以使用单位 k 或者 K

  • 可以使用单位 m 或者 M

  • 可以使用单位 g 或者 G

输入分区 "size" 值时,需要注意存储介质的对齐要求:

  • SPINOR: 与最小擦除块大小对齐,一般为 4K 或者 64K,具体请参考 SPINOR 的数据手册。

  • SPI NAND: 与最小擦除块大小对齐,一般为 128K 或者 256K,具体请参考 SPINAND 的数据手册。

  • eMMC: 需要 512 字节对齐。

分区设置步骤和流程如下所示:
  1. image_cfg.json 文件中查找对应媒介的分区配置信息。
    image_cfg.json 文件是设置分区信息以及配置烧录镜像文件生成方式的配置文件,保存路径为 target/chip/board/pack/image_cfg.json
    • chip 为对应芯片型号。
    • board 为芯片开发板型号。
    以下以 SPI NAND 的分区配置为例:
    注: 对于 SPI NAND Flash 的分区配置,需要注意 NFTL 分区的配置方法。
    "spi-nand": {
        "size": "128m", // Size of SPI NAND
        "partitions": {
            "spl":      { "size": "1m" },
            "env":      { "size": "256k" },
            "env_r":    { "size": "256k" },
            "os":       { "size": "4m" },
            "os_r":     { "size": "4m" },
            "rodata":   { "size": "12m" },
            "rodata_r": { "size": "12m" },
            "data": {
                "size": "40m",
                "nftl": { // Volume in NFTL device
                    "datavol": { "size": "-" },
                },
            },
        },
    },
  2. 根据所需分区尺寸,修改对应的分区 "size" 值,否则可跳过此步。
    例如,将 "data" 分区中的 "size" 从 40M 修改为 50M 后,示例如下:
    "spi-nand": {
        "size": "128m", // Size of SPI NAND
        "partitions": {
            "spl":      { "size": "1m" },
            "env":      { "size": "256k" },
            "env_r":    { "size": "256k" },
            "os":       { "size": "4m" },
            "os_r":     { "size": "4m" },
            "rodata":   { "size": "12m" },
            "rodata_r": { "size": "12m" },
            "data": {
                "size": "50m",
                "nftl": { // Volume in NFTL device
                    "datavol": { "size": "-" },
                },
            },
        },
    },
  3. 如需新增一个分区,在所需位置添加一行配置即可,否则可跳过此步。
    例如,新增一个 "user" 分区,示例如下:
    "spi-nand": {
        "size": "128m", // Size of SPI NAND
        "partitions": {
            "spl":      { "size": "1m" },
            "env":      { "size": "256k" },
            "env_r":    { "size": "256k" },
            "os":       { "size": "4m" },
            "os_r":     { "size": "4m" },
            "rodata":   { "size": "12m" },
            "rodata_r": { "size": "12m" },
            "user":     { "size": "20m" },      // 新添加的分区
            "data": {
                "size": "50m",
                "nftl": { // Volume in NFTL device
                    "datavol": { "size": "20m" },
                },
            },
        },
    },
  4. 如果新增的分区需要烧录预制内容,在 "target" 段中新增配置。
    注: 对于分区表中的分区,如果没有在 "target" 段中设置需要烧录的数据,则在烧录过程中,该分区不会被擦除和修改。
    "target": { // Image components which will be burn to device's partitions
        "spl": {
            "file": "bootloader.aic",
            "attr": ["required"],
            "part": ["spl"]
        },
    
        ...
    
        "mydata": {                 // 此处组件名字可自定义
            "file": "userdata.bin", // 此处为要烧录到分区的数据
            "attr": ["mtd", "optional"],
            "part": ["user"]        // 此处设置要烧录的分区名字
        },
    },
  5. 如需删除一个分区,删除对应的分区配置行即可。
    例如,删除新增的 "user" 分区,示例如下:
    "spi-nand": {
        "size": "128m", // Size of SPI NAND
        "partitions": {
            "spl":      { "size": "1m" },
            "env":      { "size": "256k" },
            "env_r":    { "size": "256k" },
            "os":       { "size": "4m" },
            "os_r":     { "size": "4m" },
            "rodata":   { "size": "12m" },
            "rodata_r": { "size": "12m" },
            "data": {
                "size": "50m",
                "nftl": { // Volume in NFTL device
                    "datavol": { "size": "20m" },
                },
            },
        },
    },
    注:

    检查 target 段中是否有使用该分区,如果有,则删除相关的配置。

分区配置示例

image_cfg.json 文件是设置分区信息以及配置烧录镜像文件生成方式的配置文件。由于分区和烧录信息是相互关联的,因此在一个文件中进行配置。 image_cfg.json 文件的保存路径为 target/chip/board/pack/image_cfg.json
  • chip 为对应芯片型号。
  • board 为芯片开发板型号。

SPI NOR 的分区配置示例

"spi-nor": {
    "size": "16m", // Size of SPI NOR
    "partitions": {
        "spl":        { "size": "256k" },
        "env":        { "size": "128k" },
        "env_r":      { "size": "128k" },
        "os":         { "size": "1m" },
        "os_r":       { "size": "1m" },
        "rodata":     { "size": "3m" },
        "rodata_r":   { "size": "3m" },
        "data":       { "size": "7m" }
    },
},

SPI NAND Flash 的分区配置示例

注: 对于 SPI NAND Flash 的分区配置,需要注意 NFTL 分区的配置方法。
"spi-nand": {
    "size": "128m", // Size of SPI NAND
    "partitions": {
        "spl":      { "size": "1m" },
        "env":      { "size": "256k" },
        "env_r":    { "size": "256k" },
        "os":       { "size": "4m" },
        "os_r":     { "size": "4m" },
        "rodata":   { "size": "12m" },
        "rodata_r": { "size": "12m" },
        "data": {
            "size": "40m",
            "nftl": { // Volume in NFTL device
                "datavol": { "size": "-" },
            },
        },
    },
},
上述示例中, "data" 分区的配置了如下内容:
  • "size":40 MB
  • "nftl" 设备:
    • "datavol": 表示 NFTL 设备的一个卷。
    • "size":“-” 表示卷的大小是 NFTL 设备的所有剩余存储空间。

      NFTL 设备需要使用大约 6 MB 的空间做坏块管理,因此 “datavol” 的可用大小大约为 34 MB。

eMMC 的分区配置示例

注: 第一个分区的开始位置。eMMC 使用 GPT 分区表格式,需要在 eMMC 的开始和末尾都预留 17K 的空间存放 GPT 信息,因此 “spl” 的开始位置为 “0x4400”。
"mmc": {
    "size": "8G", // Size of SD/eMMC
    "partitions": {
        "spl":        { "offset": "0x4400", "size": "256k" },
        "os":         { "size": "1m" },
        "rodata":     { "size": "3m" },
        "data":       { "size": "5m" }
    },
},

每一个分区的配置项中,都有 "offset" 和 "size" 两个配置信息,其中 "offset" 用于配置该分区的开始位置。 如未设置 "offset",表示该分区紧跟上一个分区之后。