内存布局调整指南
前言
本文描述了小系统各模块如何定义内存空间并给出示例修改,以指导开发人员根据实际业务场景,调整系统的内存布局。
须知:
后文的描述用“xxxx”表示项目名称,例如:xxxx_defconfig --> ss928v100_defconfig。 “yyyy”表示版本号,例如:u-boot-yyyy --> u-boot-2020.01、linux-yyyy --> linux-6.6
说明:
本文以Hi3403V100描述为例,未有特殊说明,SS927V100与Hi3403V100内容一致。
本文档主要适用于以下工程师:
- 技术支持工程师
- 软件开发工程师
修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有文档版本的更新内容。
| 文档版本 | 发布日期 | 修改说明 |
|---|---|---|
| 00B02 | 2026-03-05 | 第2次临时版本发布。“2.1 U-Boot”小节涉及修改 |
| 00B01 | 2025-09-15 | 第1次临时版本发布。 |
概述
在调整内存布局时,要充分考虑布局变动对各模块间的影响。
本文将阐述各模块与内存布局的关系,以及修改内存布局的方法。涉及模块如下:
- U-Boot
- Linux内核
- ATF
- GSL
- MPP
内存布局
本章描述各模块如何定义自身使用的内存空间。
说明:
各模块先给出文件路径,然后描述该文件中涉及内存布局定义的配置项、宏、变量的含义。
U-Boot
open_source/u-boot-yyyy/configs/xxxx_defconfig
CONFIG_KERNEL_LOAD_ADDR,规定了内核启动的地址;U-Boot 根据此地址的偏移来加载各模块数据。
Linux内核
open_source/linux-yyyy/arch/arm64/boot/dts/vendor/xxxx-demb.dts
- “/memreserve/”,内存保留区,该段内存用作安全DDR。
- memory 节点的 reg 属性,描述内核可用的DDR地址空间。
ATF
open_source/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
osdrv/components/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。

修改点
说明:
行首的“-”表示修改前,“+”表示修改后。 移动Linux启动地址需要以2MB对齐的基址,例如:40080000、40280000为2MB对齐位置,40180000无法启动
-
U-Boot:修改内核加载地址,前移0x10000000
-
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
-
GSL:修改内核加载地址(该地址与U-Boot保持一致),前移0x10000000
-
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后未使用的地址。

修改点
说明:
行首的“-”表示修改前,“+”表示修改后。
- 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)