You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多内存区域下程序加载机制及Bootloader加载多分区应用的疑问

嵌入式多内存区域代码加载的运作机制

谁负责把代码放到正确的运行地址?

没错,就是初始运行的软件——要么是芯片内置的ROM Bootloader,要么是你自己开发的Bootloader:

  • 芯片自带的ROM Bootloader:这是硬件启动的第一步,它会按芯片预设的规则(比如从SD卡这类启动介质读取、识别固定格式的镜像),把你的Bootloader代码复制到它链接脚本指定的运行地址(比如你说的sram1),之后把控制权交给Bootloader。
  • 你写的Bootloader:当要加载使用多内存区域的应用时,同样得由它来把应用的各个代码/数据段复制到对应的目标内存地址。

Bootloader需要知道应用的链接脚本配置吗?

不需要直接了解应用的链接脚本,核心是靠应用镜像里带的加载信息来实现,这是嵌入式领域的标准玩法:

  • 用ELF格式的镜像:ELF文件本身就带着每个段的关键信息——比如这个段要放到哪个物理地址、它在镜像文件里的起始位置、实际数据大小。Bootloader只要解析ELF的段表,就能准确知道每个段该复制到sram1/sram2/sram3/ddr1的哪个位置,不用管应用的链接脚本怎么写。
  • 用精简的bin格式:如果为了缩小镜像体积用bin文件,通常会给bin加个自定义头部,里面记录每个段的目标地址、大小、在bin里的起始偏移。Bootloader读这个头部就能完成多区域的复制。
  • 特殊情况处理:如果应用里有不需要复制的段(比如ZI段,只需要初始化为0),Bootloader也能通过这些加载信息识别出来,直接把对应内存区域清零就行,不用从镜像里读数据。

实际运作流程举个例子

  1. 编译应用时,链接脚本定义好各个段的运行地址,编译器生成带加载信息的镜像(ELF或带自定义头部的bin)。
  2. 把这个应用镜像写到SD卡这类启动介质里。
  3. Bootloader启动后,先从启动介质读应用镜像的加载信息(ELF段表或自定义头部)。
  4. Bootloader根据这些信息,逐个把应用的各个段复制到对应的内存区域,同时把需要清零的段(比如ZI段)初始化好。
  5. 所有段都加载到位后,Bootloader跳转到应用的入口地址,把控制权交出去。

内容的提问来源于stack exchange,提问作者Amir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:35:23