Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

内存映射

本页复现 WS63 的内存布局,事实取自 crates/hisi-riscv-rt/memory.xcrates/hisi-riscv-rt/asm/startup.S。默认配置:576K SRAM、16K ITCM、16K DTCM。TCM 与 SRAM 大小可经 CONFIG 标志配置(参见 fbb_ws63)。

启动流程的“为什么“见 启动流程

内存区域(MEMORY{}

区域属性ORIGINLENGTH结束说明
BOOTROMrx0x1000000x9000 (36K)0x109000掩膜 ROM 启动码
ROMrx0x1090000x43000 (268K)0x14C000应用 ROM:SFC、pinmux、watchdog、timer、systick、TCXO、BT、WiFi
ITCMrwx0x14C0000x4000 (16K)0x150000指令 TCM(默认 16K,可配至 64K)
DTCMrw0x1800000x4000 (16K)0x184000数据 TCM(默认 16K,可配至 64K)
FLASHrx0x2000000x800000 (8MB)0xA00000外部 SPI NOR flash,XIP
PROGRAMrx0x2303000x240000 (~2.25MB)0x470300flash 内应用代码区(启动头之后)
SRAMrwx0xA000000x90000 (576K)0xA90000主系统 RAM(SRAM/L2RAM)
PRESERVErw0xA90000 - 0x100 = 0xA8FF000x100 (256B)0xA90000SRAM 尾部 256 字节,保留启动状态

BOOTROM + ROM 共 304K(36K + 268K),地址连续(0x1000000x14C000)。

关键地址

名称地址说明
app 分区0x230000flashboot 从此处加载 app 镜像
app 入口0x230300入口 = 分区地址 + 0x300(跳过 0x300 字节镜像头)
复位向量0x100000链接为程序内存中的第一项;reset_vector: j HandleResetstartup.S
栈顶 _stack_start0xA90000= ORIGIN(SRAM) + LENGTH(SRAM)

flashboot 无条件跳到 app_partition + 0x300,故 app 镜像必须带 0x300 字节 HiSilicon 镜像头。镜像头字段见 应用镜像格式

导出的链接符号(PROVIDE

区域符号(用于运行时重定位):

符号
__rom_startORIGIN(ROM) = 0x109000
__rom_lengthLENGTH(ROM) = 0x43000
__itcm_startORIGIN(ITCM) = 0x14C000
__itcm_lengthLENGTH(ITCM) = 0x4000
__dtcm_startORIGIN(DTCM) = 0x180000
__dtcm_lengthLENGTH(DTCM) = 0x4000
__sram_startORIGIN(SRAM) = 0xA00000
__sram_lengthLENGTH(SRAM) = 0x90000
__flash_startORIGIN(FLASH) = 0x200000
__flash_lengthLENGTH(FLASH) = 0x800000
__program_startORIGIN(PROGRAM) = 0x230300
__program_lengthLENGTH(PROGRAM) = 0x240000

riscv-rt v0.14 所需符号:

符号
_stack_startORIGIN(SRAM) + LENGTH(SRAM) = 0xA90000
_max_hart_id0
_hart_stack_size0x2000

数据/BSS 符号(memory.x 中为占位 0,权威值在 layout.ld):__sidata__sdata__edata__sbss__ebss

栈大小(可被用户覆盖)

符号默认值用途
__stack_size0x2000 (8K)用户栈
__irq_stack_size0x800 (2K)IRQ 栈
__exc_stack_size0x800 (2K)异常栈
__nmi_stack_size0x400 (1K)NMI 栈

IRQ/异常/NMI 栈顶在 layout.ld.stacks 段中权威定义(trap 处理器引用它们,KEEP.trap 段经 --gc-sections 保活)。

区域别名(riscv-rt v0.14 REGION_ALIAS

别名指向
REGION_TEXTPROGRAM
REGION_RODATAPROGRAM
REGION_DATASRAM
REGION_BSSSRAM
REGION_STACKSRAM
REGION_HEAPSRAM

复位向量

startup.Sreset_vector 位于 .text.entry 段,链接为程序内存第一项,内容为 j HandleResetHandleReset 依次:禁用 PMP(pmpcfg0..3 = 0)、以 vectored 模式(mtvec[1:0]=01)装载 trap_vector、关中断、使能 FPU(mstatus.FS = 0b11)、初始化 gp

复位地址 0x100000 是掩膜 ROM 入口;上电后由 ROM 经 flashboot 转交到 app 入口 0x230300