多内存区域下程序加载机制及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也能通过这些加载信息识别出来,直接把对应内存区域清零就行,不用从镜像里读数据。
实际运作流程举个例子
- 编译应用时,链接脚本定义好各个段的运行地址,编译器生成带加载信息的镜像(ELF或带自定义头部的bin)。
- 把这个应用镜像写到SD卡这类启动介质里。
- Bootloader启动后,先从启动介质读应用镜像的加载信息(ELF段表或自定义头部)。
- Bootloader根据这些信息,逐个把应用的各个段复制到对应的内存区域,同时把需要清零的段(比如ZI段)初始化好。
- 所有段都加载到位后,Bootloader跳转到应用的入口地址,把控制权交出去。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

