前言¶
概述
本文描述了小系统各模块如何定义内存空间并给出示例修改,以指导开发人员根据实际业务场景,调整系统的内存布局。
须知: 后文的描述用“xxxx”表示项目名称,例如:xxxx_defconfig --> ss928v100_defconfig。 “yyyy”表示版本号,例如:u-boot-yyyy --> u-boot-2020.01、linux-yyyy --> linux-6.6
产品版本
与本文档相对应的产品版本如下。
产品名称 |
产品版本 |
|---|---|
SS928 |
V100 |
SS927 |
V100 |
说明: 本文以SS928V100描述为例,未有特殊说明,SS927V100与SS928V100内容一致。
读者对象
本文档主要适用于以下工程师:
技术支持工程师
软件开发工程师
修订记录
修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有文档版本的更新内容。
文档版本 |
发布日期 |
修改说明 |
|---|---|---|
00B01 |
2025-09-15 |
第1次临时版本发布。 |
概述¶
在调整内存布局时,要充分考虑布局变动对各模块间的影响。
本文将阐述各模块与内存布局的关系,以及修改内存布局的方法。涉及模块如下:
U-Boot
Linux内核
ATF
GSL
MPP
内存布局¶
本章描述各模块如何定义自身使用的内存空间。
说明: 各模块先给出文件路径,然后描述该文件中涉及内存布局定义的配置项、宏、变量的含义。
U-Boot¶
u-boot-yyyy/configs/xxxx_defconfig
CONFIG_KERNEL_LOAD_ADDR,规定了内核启动的地址;U-Boot 根据此地址的偏移来加载各模块数据。
Linux内核¶
linux-yyyy/arch/arm64/boot/dts/vendor/xxxx-demb.dts
“/memreserve/”,内存保留区,该段内存用作安全DDR。
memory 节点的 reg 属性,描述内核可用的DDR地址空间。
ATF¶
arm-trusted-firmware-yyyy/plat/vendor/xxxx/include/platform_def.h
BL31_BASE,描述 ATF 启动地址。
BL31_SIZE,描述 ATF 内存空间大小。
地址关系:
BL31_BASE = CONFIG_KERNEL_LOAD_ADDR + 0x2F80000 (CONFIG_KERNEL_LOAD_ADDR 是 U-Boot 中定义的内核启动地址。)
GSL¶
boot/gsl/include/xxxx/platform.h
KERNEL_LOAD_ADDR,内核启动地址。
地址关系:
KERNEL_LOAD_ADDR = CONFIG_KERNEL_LOAD_ADDR (CONFIG_KERNEL_LOAD_ADDR 是 U-Boot 中定义的内核启动地址。)
MPP¶
xxxx_yyyy/smp/a55_linux/mpp/out/ko/loadxxxx
mem_total:ddr总内存大小
mem_start:ddr起始地址
ipcm_mem_size:ipcm内存大小
dsp_mem_size: dsp liteos总内存大小(liteos os和liteos mmz)
mcu_mem_size:mcu liteos总内存大小(liteos os和liteos mmz)
os_mem_size:linux os内存大小
mmz_start:linux mmz起始地址
mmz_size:linux mmz内存大小
示例修改¶
Linux 内核往前移动0x10000000¶
修改方案¶
Linux启动地址0x50080000改为0x40080000,即往前移动0x10000000(= 0x50080000 - 0x40080000);
ATF随内核前移0x10000000。
图 1 删除LiteOS的前后对比

修改点¶
说明: 行首的“-”表示修改前,“+”表示修改后。 移动Linux启动地址需要以2MB对齐的基址,例如:40080000、40280000为2MB对齐位置,40180000无法启动
U-Boot:修改内核加载地址,前移0x10000000
--- a/configs/xxxx_defconfig +++ b/configs/xxxx_defconfig @@ -302,7 +302,7 @@ - CONFIG_KERNEL_LOAD_ADDR=0x50080000 + CONFIG_KERNEL_LOAD_ADDR=0x40080000
Linux:修改设备树中memory保留区域和memory节点的范围,前移0x10000000
--- a/arch/arm64/boot/dts/vendor/xxxx-demb.dts +++ b/arch/arm64/boot/dts/vendor/xxxx-demb.dts @@ -19,7 +19,7 @@ /* reserved for warmreset */ /* reserved for arm trustedfirmware */ /* Modify this configuration according to the system framework */ - /memreserve/ 0x52fff000 0x01a02000; + /memreserve/ 0x42fff000 0x01a02000; #include "xxxx.dtsi" / { @@ -101,7 +101,7 @@ memory { device_type = "memory"; - reg = <0x0 0x50000000 0x1 0xf0000000>; /* system memory base */ + reg = <0x0 0x40000000 0x1 0xf0000000>; /* system memory base */ }; };
ATF:修改起始地址,前移0x10000000
--- a/plat/vendor/xxxx/include/platform_def.h +++ b/plat/vendor/xxxx/include/platform_def.h @@ -66,7 +66,7 @@ - #define BL31_BASE (0x53000000) + #define BL31_BASE (0x43000000)
GSL:修改内核加载地址(该地址与U-Boot保持一致),前移0x10000000
--- a/include/platform.h +++ b/include/platform.h @@ -288,7 +288,7 @@ - #define KERNEL_LOAD_ADDR 0x50080000 + #define KERNEL_LOAD_ADDR 0x40080000
MPP:修改liteos内存大小和mmz起始地址
xxxx_yyyy/smp/a55_linux/mpp/out/ko/loadxxxx:
-ipcm_mem_size=2 # 2M, ipcm mem -dsp_mem_size=62 # 62M, dsp mem -mcu_mem_size=192 # 192M, mcu mem +ipcm_mem_size=0 # 0M, ipcm mem +dsp_mem_size=0 # 0M, dsp mem +mcu_mem_size=0 # 0M, mcu mem os_mem_size=512 # 512M, os mem -mmz_start=0x70000000; # mmz start addr -mmz_size=3328M; # 3328M, mmz size +mmz_start=0x60000000; # mmz start addr +mmz_size=3584M; # 3584M, mmz size
扩大Linux空间大小¶
修改方案¶
现有Linux的空间预留0x2F00000(47MB),需要再扩大空间可将BL33_LOAD_ADDR 内核加载地址移至optee后未使用的地址。
图 1 扩大Linux空间的前后对比

修改点¶
说明: 行首的“-”表示修改前,“+”表示修改后。
U-Boot:修改内核加载地址,即后移0x6000000
--- a/common/load_fip.c
+++ b/common/load_fip.c
@@ -250,7 +250,7 @@ uuid_t uuid_bl31 = UUID_EL3_RUNTIME_FIRMWARE_BL31;
long long kernel_load_addr;
/* kernel start addr - sizeof(header) */
-#define BL33_LOAD_ADDR (kernel_load_addr - 0x40)
+#define BL33_LOAD_ADDR (kernel_load_addr - 0x40 + 0x6000000)
#define FDT_LOAD_ADDR (kernel_load_addr + 0x2F00000)
#define BL31_BASE (kernel_load_addr + 0x2F80000)