当前位置: 首页 > article >正文

分散加载(2)---分散加载文件执行机制

一、基本原理介绍

ARM连接器ArmLink通过分散加载文件,把目标文件*.o,库文件*.lib,数据,连接在一起,生成镜像文件---即编译后的elf,bin,hex文件,以及输出map文件。用户通过分散加载文件,可以指定代码(Code),数据(RW, RO, ZI)存放在存储器的哪个位置。

    连接器可以通过分散加载文件生成一些region-related symbols,供在程序中使用;

    可以在分散加载文件中定义堆和栈的大小;

  • 使用场合

分散加载文件一般用于复杂的工程,比如一个MCU/SOC中有几块ROM/FLASH,几块RAM,我们需要指定,哪些代码存放在哪个位置,哪些数据存放在哪个位置。比如现在流行的一些SOC蓝牙芯片,一般都会有ROM + flash(支持XIP的FLASH),2-4块RAM。 习惯于把蓝牙协议栈存放在其中一块ROM中,用户应用程序放在flash中。协议栈相关的参数数据放在其中一块RAM中,用户数据放在另外一块RAM中。

  • 加载视角Load view和执行视角Execution view:

这应该是ARM公司提出来的概念(不太确定别的架构是否也有这个概念),我的理解是:1)Load view指的是芯片静态时的memory map(代码和数据在存储器中的分布情况)。固件烧录到芯片,此时还没有运行,此时的代码(code)和数据(RO,RW,ZI)在芯片存储器(这里的存储器指flash/ROM/RAM等)中的分布,应该就是Load view。

  1. Execution view指的是芯片动态时的memory map(代码和数据在存储器中的分布情况)。当芯片上电,代码运行,执行完启动文件***.S, 经过一番代码的拷贝,变量初始化,等等操作,程序跑到了main函数,此时,代码(code)和数据(RO,RW,ZI)在芯片存储器的分布,应该就是Execution view.
  2. 简而言之,Load view 和 Execution view 就是芯片静态和动态时刻的memory map。
  3. 为什么要提出Load view和Execution view? 估计是用来区分静态和动态时刻的memory map。比如RW数据,我们知道,固件烧录的时候,RW数据是放在FLASH/ROM中的,此时,RAM中还没有数据。当程序运行的时候,根据加载文件中执行域Execution region指定的地址,会把RW数据拷贝到RAM中,RAM中就有了数据,memory map产生了变化。
  4. 疑问:如果按我上面理解Load view 和Execution view,那么RW数据,在静态的时候,烧录到flash的地址,怎么确定? 分散加载文件中的地址,都是绝对物理地址,如果把RW分配到执行域Execution region 的0x20001200,那么RW数据在Load region 的地址是多少?
  • 加载域Load region和执行域Execution region:

在分散加载文件中,可以定义多个Load region, 每个Load region 中又可以定义多个Execution region。根据加载域Load region得到的memory map 就是Load view,根据执行域Execution region得到的memory map就是Execution view。

  • 简单的加载文件

1)加载文件:

 2)对应的memory map:

 左边为Load view的memory map,此时程序还没有运行,RAM中还没有数据。右边为Execution view的memory map,此时程序已经运行,RAM中已经有了数据。

  • 较复杂的加载文件

1)加载文件:

 

2)对应的memory map:

 


http://www.kler.cn/a/5860.html

相关文章:

  • Python爬虫应用领域
  • Babylon.js行为编写及使用参考
  • 【测试】——Cucumber入门
  • 51单片机——定时器中断(重点)
  • 优化提示词改善答疑机器人回答质量
  • 加速科技荣获“浙江省企业研究院”认定
  • Leetcode.939 最小面积矩形
  • 算法学习day46
  • 详细手把手教会二叉树链式结构【数据结构】
  • 【数据库管理】①实例与数据库
  • Springboot: Tomcat很好我选Undertow
  • ShareSDK Android 第三方平台分享参数说明
  • MySQL - 基于SSL安全连接的主从复制
  • 蓝桥杯31天真题冲刺|题解报告|第二十三天
  • Python中编码【encode】解码【decode】讲解
  • k8s qos等级
  • 【Windows版】VScode配置C++开发环境
  • Python实现提前查询考研成绩
  • 大家有没有时候觉得,递归,分治,回溯,傻傻分不清楚?
  • 设计LFU缓存结构(美团面试算法题)
  • 骨传导蓝牙耳机什么牌子,推荐几款比较热销的骨传导耳机
  • 【Elastic (ELK) Stack 实战教程】04、ElasticSearch 集群进阶及优化
  • Java-双向链表的实现
  • 【软件设计师03】数据库系统
  • 电路板焊接技巧实践(没有电烤箱条件下)
  • 人工智能交互革命:探索ChatGPT的无限可能 第13章ChatGPT的应用场景和创新应用