






















L2 cache 共计 2MB , 分成 16组, way0-way15 , 其中 way0 必须 分配成 cache 属性, way1-way15 共计 15组 可以划分成 L2-LIM 属性 或者 Scratchpad 属性

PROVIDE(变量名 = 值) = 给 C 代码提供一个 “看得见、但不占空间” 的地址符号。
告诉链接器代码和数据要放进哪个区域
.= 当前地址计数器 , 告诉链接器 接下来的数据存储位置 , 为 __envm_start
由于 PROVIDE(__envm_start = ORIGIN(envm));
__envm_start 是 用 PROVIDE 关键词 定义成了 envm 的 初始地址;
MEMORY 中定义:envm (rx) : ORIGIN = 0x20220100, LENGTH = 128k - 0x100;
.text_init : ALIGN(0x10) { *(.text.init) // 所有.o里标记.text.init的启动汇编(reset_vector复位入口) *system_startup.o (.text .text* .rodata .rodata* .srodata*) //系统启动初始化 *mtrap.o (.text .text* .rodata .rodata* .srodata*) //RISC-V异常/陷阱初始化 *mss_h2f.o (...) //MSS-FPGA H2F接口初始化 *mss_l2_cache.o(...) //L2 Cache、Scratchpad内存初始化 . = ALIGN(0x10); //段尾16字节对齐 } >envm //段整体存放至片上eNVM闪存
>scratchpad :表示运行地址 在 scratchpad ;
AT> envm:表示存储地址 在envm;
需要:上电 → 从 eNVM 复制到 Scratchpad → 再跳过去执行;
疑问: 谁将 envm中的代码 复制到 Scratchpad 并启动运行的?
AI 结论:由你链接脚本里 .text_init 段的启动汇编代码(mss_entry.S/system_startup.o)负责搬运,硬件 MSS、链接器都不自动搬代码,全靠软件启动代码手动循环拷贝!
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。