新版本增加分区方式
Android 11+增加了可以自动生成parameter.txt的工具,并支持编译parameter.txt
根据配置参数。如果没有配置模板文件,工具会发现并添加修改后的parameter.txt文件。(如果想了解计算规则 请看下面的内容)
参考文档《Rockchip_Android13_SDK_Developer_Guide_EN.pdf》
FIRMWARE_VER: 11.0 MACHINE_MODEL: rk3568_r MACHINE_ID: 007 MANUFACTURER: rockchip MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE: rk3568_r CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 TYPE: GPT CMDLINE:mtdparts=rk29xxnand:0x00002000@0x00002000(security),0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00002000@0x0000a000(dtbo),0x00000800@0x0000c000(vbmeta),0x00014000@0x0000c800(boot),0x00030000@0x00020800(recovery),0x000c0000@0x00050800(backup),0x000c0000@0x00110800(cache),0x00008000@0x001d0800(metadata),0x00000800@0x001d8800(baseparameter),0x00614000@0x001d9000(super),-@0x007ed000(userdata:grow)
固件信息
以下是Rockchip RK3568设备的固件信息,包括设备的型号、制造商、固件版本等:
FIRMWARE_VER
: 固件的版本号,这里的版本号是11.0。MACHINE_MODEL
: 设备的型号,这里的型号是rk3568_r。MACHINE_ID
: 设备的ID,这里的ID是007。MANUFACTURER
: 设备的制造商,这里的制造商是rockchip。MAGIC
: 用于标识设备的特殊值,这里的值是0x5041524B。ATAG
: 用于标识设备的特殊值,这里的值是0x00200800。MACHINE
: 设备的型号,这里的型号是rk3568_r。CHECK_MASK
: 用于检查设备的特殊值,这里的值是0x80。PWR_HLD
: 用于控制设备电源的特殊值,这里的值是0,0,A,0,1。TYPE
: 设备的类型,这里的类型是GPT。CMDLINE
: 设备的命令行参数,包括了设备的各种分区信息。
分区信息
以下是设备的分区信息,包括分区的名称、起始地址、偏移量、大小和用途:
分区名称 |
分区起始地址(sector) |
分区偏移量(sector) |
分区大小(sector) |
分区大小(MB) |
分区用途 |
security |
0x00002000 |
0x00002000 |
0x00002000 |
4MB |
用于存储安全相关的信息 |
uboot |
0x00004000 |
0x00002000 |
0x00002000 |
4MB |
用于存储U-Boot引导加载器 |
trust |
0x00006000 |
0x00002000 |
0x00002000 |
4MB |
用于存储TrustZone相关的信息 |
misc |
0x00008000 |
0x00002000 |
0x00002000 |
4MB |
用于存储各种杂项信息 |
dtbo |
0x0000a000 |
0x00002000 |
0x00002000 |
4MB |
用于存储设备树覆盖信息 |
vbmeta |
0x0000c000 |
0x00002000 |
0x00000800 |
1MB |
用于存储AVB元数据 |
boot |
0x0000c800 |
0x00000800 |
0x00014000 |
10MB |
用于存储引导分区 |
recovery |
0x00020800 |
0x00014000 |
0x00030000 |
24MB |
用于存储恢复分区 |
backup |
0x00050800 |
0x00030000 |
0x000c0000 |
96MB |
用于存储备份分区 |
cache |
0x00110800 |
0x000c0000 |
0x000c0000 |
96MB |
用于存储缓存分区 |
metadata |
0x001d0800 |
0x000c0000 |
0x00008000 |
16MB |
用于存储元数据分区 |
baseparameter |
0x001d8800 |
0x00008000 |
0x00000800 |
1MB |
用于存储基本参数 |
super |
0x001d9000 |
0x00000800 |
0x00614000 |
394MB |
用于存储超级分区 |
userdata |
0x007ed000 |
0x00614000 |
- |
- |
用于存储用户数据分区 |
注意:这个表格是基于提供的CMDLINE参数生成的,实际的分区信息可能会因设备的具体配置而有所不同。另外,"userdata"分区的大小是"-",表示它会占用剩余的所有空间。
分区作用
每个分区在Android系统中都有特定的作用,以下是每个分区的简单解释:
boot.img
:包含ramdisk、kernel、dtb,用于启动设备并加载操作系统的核心组件。boot-debug.img
:与boot.img的差别是用户固件可以烧写这个boot.img进行root权限操作。dtbo.img
:Device Tree Overlays (设备树覆盖),用于描述硬件配置的数据结构。config.cfg
:烧写工具的配置文件,可以直接导入烧写工具显示需要烧写的选项。MiniLoaderAll.bin
:包含一级loader,用于引导加载器的启动过程。misc.img
:包含recovery-wipe开机标识信息,烧写后会进行恢复操作。parameter.txt
:包含分区信息,记录了设备的分区布局。pcba_small_misc.img
:包含pcba开机标识信息,烧写后会进入简易版pcba模式。pcba_whole_misc.img
:包含pcba开机标识信息,烧写后会进入完整版pcba模式。recovery.img
:包含recovery-ramdisk、kernel、dtb,用于设备出现问题时进行修复操作。super.img
:包含odm、product、vendor、system、system_ext分区内容,是一个包含多个子分区的超级分区。trust.img
:包含BL31、BL32,用于存储TrustZone相关的信息,创建安全环境来运行敏感代码和处理敏感数据。uboot.img
:包含uboot固件,是一个在设备启动时运行的程序,负责加载内核和其他重要的系统组件。vbmeta.img
:包含avb校验信息,用于Android Verified Boot (AVB)的验证机制。update.img
:包含以上需要烧写的img文件,可用于直接烧写整个固件包。security
:用于存储安全相关的信息,如设备的加密密钥等。cache
:存储缓存分区,用于存储临时数据。userdata
:存储用户数据分区,包括用户的应用数据、下载的文件等。metadata
:存储元数据分区,用于存储系统的元数据,如设备的IMEI号等。backup
:存储备份分区,用于在系统更新或恢复时备份重要的数据。
增加新分区计算规则
如果想要添加一个新的分区,例如名为"odm"的分区,大小为15MB,需要首先确定这个分区的起始地址。这个地址应该是上一个分区的起始地址加上上一个分区的大小。例如,如果上一个分区是"super"分区,那么"odm"分区的起始地址应该是0x007ed000 + 0x00614000 = 0x00df1000。
需要将这个分区的大小转换为sector。由于1个sector等于512Bytes,所以15MB等于15 * 1024 * 1024 / 512 = 0x0000f000 sector。
可以将这个分区添加到CMDLINE参数中,像这样:0x0000f000@0x00df1000(odm)。
所以,添加"odm"分区后的CMDLINE参数应该是这样的:
mtdparts=rk29xxnand:0x00002000@0x00002000(security),0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00002000@0x0000a000(dtbo),0x00000800@0x0000c000(vbmeta),0x00014000@0x0000c800(boot),0x00030000@0x00020800(recovery),0x000c0000@0x00050800(backup),0x000c0000@0x00110800(cache),0x00008000@0x001d0800(metadata),0x00000800@0x001d8800(baseparameter),0x00614000@0x001d9000(super),0x0000f000@0x00df1000(odm),-@0x00e01000(userdata:grow)
这个CMDLINE参数包含了新的"odm"分区,它的起始地址是0x00df1000,大小是0x0000f000 sector(15MB)。"userdata"分区的起始地址也相应地向后移动了0x0000f000 sector,以留出空间给"odm"分区。
分区信息单位解析
在处理设备分区信息时,通常会遇到两种单位:sector和字节。
Sector
Sector是设备上的最小存储单元,通常是512字节。在分区信息中,分区大小和分区偏移量都是以sector为单位的。
字节
字节是计算机中的基本存储单元,通常用B表示。一个sector等于512个字节,也就是说,一个sector可以存储512个B的数据。
为什么使用Sector?
使用sector为单位可以更好地对齐设备上的存储空间,提高存储效率和性能。如果使用字节为单位,可能会造成设备上的空间浪费或者读写错误。
例如,如果一个分区的大小是8192字节,那么它占用了16个sector(8192 / 512 = 16)。如果一个分区的大小是8193字节,那么它占用了17个sector(8193 / 512 = 16.00195),但是实际上只用了第17个sector的一个字节,剩下的511个字节就浪费了。如果一个分区的大小是8191字节,那么它占用了16个sector(8191 / 512 = 15.99805),但是实际上少用了第16个sector的一个字节,可能会导致读写错误。
单位转换
如果想看以字节为单位的分区信息,可以把sector乘以512来转换成字节。同样地,如果想看以MB(兆字节)为单位的分区信息,可以把sector乘以512 / 1024 / 1024来转换成MB。
例如,如果一个分区的大小是0x00002000 sector
,那么它的大小是0x00002000 * 512字节,或者0x00002000 * 512 / 1024 / 1024 MB。