一、内存分布
U-Boot 由前级 Loader 加载到 CONFIG_SYS_TEXT_BASE 地址,初始化时会探明当前系统的总内存容 量,32位平台上认为最大4GB可用(但是不影响内核对容量的识别),64位平台上认为所有内存都可用。然后通过一系列reserve_xxx() 接口从内存末尾往前预留需要的内存,最后把自己relocate到某段 reserve的空间上。内存整体使用布局如下,以ARM64为例(常规情况):
上表中的 Start Addr Offset 一栏表示基于 DDR base 的地址偏移;
Fastboot地址和大小由配置决定:CONFIG_FASTBOOT_BUF_ADDR,
CONFIG_FASTBOOT_BUF_SIZE。
Video FB/U-Boot/Malloc/Board/Gd/Fdt/Sp 由顶向下根据实际需求大小来分配;
64 位平台:ATF 是 ARMv8 必需的,OP-TEE 是可选项;32 位平台:只有 OP-TEE;
kernel fdt/kernel/ramdisk 是 U-Boot 需要加载的固件地址,由 ENV_MEM_LAYOUT_SETTINGS 定义;
Fastboot 功能需要的 buffer 地址和大小在 defconfig 中定义;
OP-TEE 占据的空间需要根据实际需求而定,最大为 30M;其中 RK1808/RK3308 上 OP-TEE 放在低地址,不在 0x8400000;
部分宏定义偏移地址:
#define ENV_MEM_LAYOUT_SETTINGS \
"scriptaddr=0x00c00000\0" \
"pxefile_addr_r=0x00e00000\0" \
"fdt_addr_r=0x0a100000\0" \
"kernel_addr_r=0x00280000\0" \
"kernel_addr_c=0x04080000\0" \
"ramdisk_addr_r=0x0a200000\0"
二、存储布局
RK linux方案的存储布局如下,Android方案除了boot/rootfs的定义跟linux平台有差异,其它基本一致,可借鉴参考。
图片来源:http://opensource.rock-chips.com/wiki_Partitions
三、基于rk3568的分区表
FIRMWARE_VER: 12.0
MACHINE_MODEL: rk3568_s
MACHINE_ID: 007
MANUFACTURER: rockchip
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: rk3568_s
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),0x00036000@0x00020800(recovery),0x000ba000@0x00056800(backup),0x000c0000@0x00110800(cache),0x00008000@0x001d0800(metadata),0x00010000@0x001d8800(yyjcust),0x00614000@0x001e8800(super),-@0x007fc800(userdata:grow)
路径:rockdev/Image-rk3568_s/parameter.txt
parameter.txt该分区表可以动态生成,也可以固定。