8. 系统分区
8.1 系统默认分区介绍
默认分区如下:
Number |
Start (sector) |
End (sector) |
Size |
Name |
分区说明 |
---|---|---|---|---|---|
1 |
16384 |
24575 |
4M |
uboot |
供 uboot 编译出来的 uboot.img |
2 |
24576 |
32767 |
4M |
misc |
供 misc.img,给 recovery 使用 |
3 |
32768 |
163839 |
64M |
boot |
供 kernel 编译出来的 boot.img |
4 |
163840 |
294911 |
32M |
recovery |
供 recovery 编译出的 recovery.img |
5 |
294912 |
360447 |
32M |
bakcup |
预留,暂时没有用 |
6 |
360448 |
12943359 |
6144M |
rootfs |
供 buildroot、debian 或 yocto 编出来的 rootfs.img |
7 |
12943360 |
12943359 |
128M |
oem |
给厂家使用,存放厂家的 APP 或数据。挂载在 /oem 目录 |
8 |
13205504 |
61120478 |
22.8G |
userdata |
供 APP 临时生成文件或给最终用户使用,挂载在 /userdata 目录下 |
8.2 Parameter文件介绍
Parameter文件主要用于定义分区表,可以支持两种分区格式:一个是 GPT 格式,另一个是传统 CMDLINE 分区。不同的项目,不同的平台,parameter文件的内容会有一些差异。默认Linux平台都使用GPT格式。
本文档以RK3576平台的parameter文件进行举例说明。
RK3576 GPT分区格式parameter定义:
FIRMWARE_VER: 1.0
MACHINE_MODEL: RK3576
MACHINE_ID: 007
MANUFACTURER: RK3576
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
GROW_ALIGN: 0
CMDLINE:
mtdparts=:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x0
0008000(boot),0x00040000@0x00028000(recovery),0x00010000@0x00068000(backup),0x01c
00000@0x00078000(rootfs),0x00040000@0x01c78000(oem),-@0x01cb8000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
uuid:boot=7A3F0000-0000-446A-8000-702F00006273
GPT分区相对传统分区,parameter文件主要差异:
定义 TYPE: GPT
最后一个分区增加grow标识,如:userdata:grow
指定system或者rootfs的uuid,如:uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
parameter文件不会烧录到NVM(EMMC,NAND等)里面,会使用到的信息只有mtdparts的分区定义和UUID,其他信息只是为了兼容升级工具而定义。
FIRMWARE_VER:1.0
条目 |
FIRMWARE_VER |
---|---|
类型 |
十进制数,格式: X.X |
数值 |
0 - 255 |
描述 |
打包updata.img时会使用到,升级工具会根据这个识别固件版本号。 |
MACHINE_MODEL:RK3576
条目 |
MACHINE_MODEL |
---|---|
类型 |
字符串 |
长度 |
255(最大) |
描述 |
机器型号,打包updata.img使用,不同的项目,可以修改,用于升级工具显示。在recovery里面升级固件时可以用于判断固件和机器是否配。 |
MACHINE_ID:007
条目 |
MACHINE_ID |
---|---|
类型 |
字符串 |
长度 |
255(最大) |
描述 |
产品开发ID,可以为字符和数字组合,打包updata.img使用,不同的项目使用不同的ID,可以用于识别机器机型。在recovery里面升级固件时可以用于判断固件是否匹配。 |
MANUFACTURER:RK3576
条目 |
MANUFACTURER |
---|---|
类型 |
字符串 |
长度 |
255(最大) |
描述 |
厂商信息,打包updata.img使用,可以修改,用于升级工具显示。 |
MAGIC:0x5041524B
条目 |
MAGIC |
---|---|
类型 |
十六进制数 |
数值 |
0x5041524B(固定) |
描述 |
魔数MAGIC,不能修改,一些新的AP使用DTS,这一项没有用,为了兼容,不要删除或修改。 |
ATAG:0x60000800
条目 |
ATAG |
---|---|
类型 |
十六进制数 |
数值 |
32bits DDR地址 |
描述 |
ATAG DDR存放地址,一些新的AP使用DTS,这一项没有用,为了兼容,不要删除或修改。 |
MACHINE:0xffffffff
条目 |
MACHINE |
---|---|
类型 |
字符串 |
长度 |
255(最大) |
描述 |
内核识别用,这个定义和内核匹配。这一项GPT格式没有用,为了兼容,不要删除或修改。 |
下表列出几个平台的值:
芯片 | MACHINE |
---|---|
RK29xx | 2929 |
RK292X | 2928 |
RK3066 | 3066 |
RK3126C | 3126c |
RK3326 | 3326 |
RK3399 | 3399 |
RK3308 | 3308 |
CHECK_MASK:0x80
条目 |
CHECK_MASK |
---|---|
类型 |
十六进制数 |
数值 |
0x80(固定) |
描述 |
保留,不能修改。 |
TYPE:GPT
GPT分区表标识,烧录工具会根据 CMDLINE 里面定义的分区创建GPT分区表,paramter文件不会烧录到 NVM (NAND,EMMC等)存储器件里面。
GROW_ALIGN
GPT分区表标识,只能选择0或者1,Linux默认选择0; 其他平台比如Android, 内核 DM verity开启(CONFIG_DM_VERITY=y),需要GROW_ALIGN设置为1.这样工具端最后一个分区结束位置对齐到32K。
CMDLINE:
MTD 分区定义说明:
CMDLINE:
mtdparts=:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x0
0008000(boot),0x00040000@0x00028000(recovery),0x00010000@0x00068000(backup),0x01c
00000@0x00078000(rootfs),0x00040000@0x01c78000(oem),-@0x01cb8000(userdata:grow)
1. 单个分区说明:例如:0x00020000@0x00008000(boot),@符号之前的数值是分区大小,@符号之后的数值是分区的起始位置,括号里面的字符是分区的名字。所有数值的单位是 sector ,1个 sector 为512Bytes.上例中,boot 分区起始位置为0x8000 sectors位置,大小为0x2000 sectors(16MB).
2. 为了性能,每个分区起始地址需要32KB(64 sectors)对齐,大小也需要32KB的整数倍。
3. 如果使用 sparse 格式的镜像,升级时会擦除数据,为了兼容性更好,对应的分区最好按4MB对齐,大小也按4MB整数倍配置。
4. 使用GPT分区时,parameter 里面定义的地址,都是真实的逻辑地址(LBA),例如 uboot 定义在0x4000,那么烧录到 EMMC 和 NAND 里面时,逻辑地址也是0x4000.
<table border="1" class="docutils">
<thead>
<tr>
<th>名称</th>
<th>Parameter 定义地址</th>
<th>EMMC 逻辑地址</th>
<th>NAND 逻辑地址</th>
<th>大小</th>
</tr>
</thead>
<tbody>
<tr>
<td>GPT</td>
<td>--</td>
<td>0</td>
<td>0</td>
<td>32KB</td>
</tr>
<tr>
<td>LOADER</td>
<td>--</td>
<td>0x40</td>
<td>0x40</td>
<td>4MB-32KB</td>
</tr>
<tr>
<td>保留</td>
<td>--</td>
<td>0x2000</td>
<td>0x2000</td>
<td>4MB</td>
</tr>
<tr>
<td>UBOOT</td>
<td>0x4000</td>
<td>0x4000</td>
<td>0x4000</td>
<td>4MB</td>
</tr>
<tr>
<td>TRUST</td>
<td>0x6000</td>
<td>0x6000</td>
<td>0x6000</td>
<td>4MB</td>
</tr>
</tbody>
</table>
最后一个分区需要指定 grow 参数,工具会把剩余的空间都分配给最后一个分区。
8.3 Parameter分区定义规范
凡是 bootrom,pre-loader,uboot,trust 有写到的分区都放在 recovery 分区之前;
凡是客户新加的分区,在 pre-loader,uboot,trust 有被写到,都应该放在 recovery 分区之前;
目前 rockchip 前级固件有操作到的分区有 misc,vbmeta,security,这些都应该放 recovery 之前。
8.4 SDK分区配置修改指南
命令概览
以下是SDK中用于分区操作的相关命令:
$./build.sh --help | grep parts
print-parts 打印分区信息
list-parts 打印分区信息的别名
mod-parts 交互式修改分区表
edit-parts 编辑原始分区配置
new-parts 重新创建分区
extra-parts 打包额外的分区镜像
分区信息打印
使用以下命令打印当前分区配置:
<SDK>$ make print-parts
...
==============================
分区表
==============================
1: uboot 位于 0x00004000 大小 0x00002000 (4M)
2: misc 位于 0x00006000 大小 0x00002000 (4M)
3: boot 位于 0x00008000 大小 0x00020000 (64M)
4: recovery 位于 0x00028000 大小 0x00040000 (128M)
5: backup 位于 0x00068000 大小 0x00010000 (32M)
6: rootfs 位于 0x00078000 大小 0x01c00000 (14G)
7: oem 位于 0x01c78000 大小 0x00040000 (128M)
8: userdata 可增长分区
传统命令行参数:
0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),...
分区信息修改
通过以下命令进入编辑模式,修改分区配置:
$ make edit-parts
## Chapter-9 分区名 大小
<hidden> 0x00004000 # 8M
uboot 0x00002000 # 4M
misc 0x00002000 # 4M
boot 0x00020000 # 64M
recovery 0x00040000 # 128M
backup 0x00010000 # 32M
rootfs 0x01c00000 # 14G
oem 0x00040000 # 128M
userdata - # 可增长
## Chapter-9 例如,增加boot分区至128M,修改为:
boot 0x00080000 # 128M
## Chapter-9 如需新增env分区,添加:
env 0x00040000 # 64M
修改后,配置自动保存至 device/rockchip/parameter.txt
文件。使用 git diff
查看变更:
device/rockchip$ git diff
...
新增分区
若要在SDK编译中新增一个 env
分区,步骤如下:
在
device/rockchip/common/extra-parts
目录下新增env
目录。运行
make menuconfig
配置额外分区。配置完成后,使用
make savedefconfig
保存配置。通过
make edit-parts
在parameter.txt
中添加env
分 区配置。使用
make extra-parts
编译生成额外分区镜像,最终在output/extra-parts
目录下生成相应文件。
$ tree -L 1 output/extra-parts
output/extra-parts/
├── env
├── env.fs
├── env.img
...