3.3.3. 内存分配
启动阶段的内存空间是通过预分配的形式进行使用。这里描述各阶段所使用的内存空间。
3.3.3.1. BROM 阶段
地址范围 |
存放内容 |
说明 |
---|---|---|
0x00100000 ~ 0x00102000 |
BROM DATA,BSS |
8KB |
0x00102000 ~ 0x00103000 |
BROM Stack |
4KB |
0x00103000 ~ 0x00118000 |
SPL,PBP |
84KB |
3.3.3.2. SPL 阶段
地址范围 |
存放内容 |
说明 |
---|---|---|
0x00103000 ~ 0x00115F00 |
SPL 初始栈空间 |
0x00118000 是配置的栈顶位置,但实际上
运行的时候,需要预留 HEAP 空间和 GD 全局变量的空间,
因此实际的栈顶地址是 0x00115F00
配置:CONFIG_SPL_STACK, rch/riscv/cpu/start.S
位置:include/configs/m4.h
|
0x00115F00 ~ 0x00116000 |
Global Data |
GD 全局变量的初始空间
|
0x00116000 ~ 0x00118000 |
HEAP |
初始 HEAP 的空间
配置:CONFIG_SYS_MALLOC_F_LEN
位置:Kconfig
|
0x40000000 ~ 0x42000000 |
Kernel |
SPL 直接启动 Kernel 时使用,从 U-Boot 启动时不用
配置:its
位置:kernel.its
|
0x40004000 ~ 0x41000000 |
U-Boot |
SPL 启动 U-Boot 时使用,直接启动 Kernel 时不用,预留约 16MB
配置:its
位置:u-boot.its
|
0x42000000 ~ 0x42000100 |
SPL AIC 信息头 |
SPL 的 AIC 头信息
|
0x42000100 ~ 0x42020000 |
SPL bin |
0x42000100 是 SPL 的程序入口地址,SPL 大小不应该超过 128KB
配置:CONFIG_SPL_TEXT_BASE, image_cfg.json
位置:common/spl/Kconfig
|
0x42200000 ~ 0x42300000 |
SPL STACK |
1MB, 初始栈太小,在 board_r 之后切换到新的栈运行
配置:CONFIG_SPL_STACK_R_ADDR - CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN
预留完 Simple heap 之后,剩下的空间给 Stack
位置:Kconfig
|
0x42300000 ~ 0x43F00000 |
SPL heap |
28MB
在 SPL board_r 初始化 CONFIG_SYS_SPL_MALLOC_START 之前使用
M4 不会定义 CONFIG_SYS_SPL_MALLOC_START,只用 Simple Heap
配置:CONFIG_SPL_STACK_R_ADDR =0x43F00000
配置:CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN = 0x1C000000,28MB
位置:Kconfig
|
0x43F00000 ~ 0x43F20000 |
Falcon 模式参数 |
SPL Falcon 模式才需要,所需空间不大
配置:CONFIG_SYS_SPL_ARGS_ADDR
位置:include/configs/m4.h
|
0x43FE0000 ~ 0x44000000 |
OpenSBI |
配置:CONFIG_SPL_OPENSBI_LOAD_ADDR
位置:Kconfig
|
地址范围 |
存放内容 |
说明 |
---|---|---|
0x40000000 ~ 0x41000000 |
SPL |
SPL 的下载地址,运行起来时会被搬运到指定
的链接位置
配置:image_cfg.json
|
0x41000000 ~ 0x41100000 |
env.bin |
存放启动升级程序(U-Boot)所用的环境变量,由于
升级时不会直接运行 Kernel,因此与上面的 Kernel 地址空间
不冲突
配置:CONFIG_ENV_RAM_ADDR, image_cfg.json
位置:env/Kconfig
|
0x41100000 ~ 0x42000000 |
uboot.itb |
存放升级程序
配置:CONFIG_SPL_LOAD_FIT_ADDRESS, image_cfg.json
位置:Kconfig
|
3.3.3.3. U-Boot 阶段
地址范围 |
存放内容 |
说明 |
---|---|---|
0x40004000 ~ 0x41000000 |
初始 U-Boot |
U-Boot 的程序入口地址,但在初始化完成之后,
U-Boot 会自行重定位到 DRAM 的末尾运行,该空间被空出来,
用于加载 Kernel
配置:CONFIG_SYS_TEXT_BASE
位置:Kconfig
|
0x40300000 ~ 0x40400000 |
初始 U-Boot HEAP |
初始 gd, HEAP, STACK 的保留空间,重定位之后,
该空间会被空出来。
配置:CONFIG_SYS_INIT_SP_ADDR
位置:include/configs/m4.h
配置:CONFIG_SYS_MALLOC_F_LEN
位置:Kconfig
|
0x40000000 ~ 0x42000000 |
Kernel |
Kernel 的程序入口地址,Kernel 最终会被加载到该空间
|
0x41200000 ~ 0x42200000 |
kenrel.itb |
Kernel.itb 的加载地址,加载后 Kernel 被复制到 0x40000000
预留 16MB
配置:knl_addr
位置:env.txt
|
0x42200000 ~ 0x42300000 |
dtb |
调试用,正常情况下不使用
配置:dtb_addr
位置:env.txt
|
0x42400000 ~ ………. |
logo.itb |
logo 数据的加载地址,logo.itb 中存储了多张 png 图片
uboot 会从该地址读取相应的 png 图片进行解码并显示
配置:logo: { ram: }
位置:image_cfg.json
配置:CONFIG_LOGO_ITB_ADDRESS
位置:drivers/video/zx/display/aic_display.c
|
0x41000000 ~ ………. |
ENV |
U-Boot 环境变量的加载地址,USB 升级时使用,16KB 左右
初始化加载之后可释放,不影响 Kernel 的使用
配置:CONFIG_ENV_RAM_ADDR
位置:env/Kconfig
|
At the End of DRAM |
保留内存 |
重定位后的 U-Boot、栈、堆,以及其他需要预留的内存。
具体可以查看 board_f.c 相关处理。
|
0x43F00000 ~ 0x43FDFFFF |
dtb |
预留给 Kernel dtb 的内存空间,正常启动时加载到该空间
配置:fdt-1: { load = }
位置:kernel.its
|
0x43FE0000 ~ 0x44000000 |
OpenSBI |
预留给 OpenSBI 的内存空间
配置:CONFIG_SPL_OPENSBI_LOAD_ADDR
位置:Kconfig
|