一、基本原理介绍
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。
- Execution view指的是芯片动态时的memory map(代码和数据在存储器中的分布情况)。当芯片上电,代码运行,执行完启动文件***.S, 经过一番代码的拷贝,变量初始化,等等操作,程序跑到了main函数,此时,代码(code)和数据(RO,RW,ZI)在芯片存储器的分布,应该就是Execution view.
- 简而言之,Load view 和 Execution view 就是芯片静态和动态时刻的memory map。
- 为什么要提出Load view和Execution view? 估计是用来区分静态和动态时刻的memory map。比如RW数据,我们知道,固件烧录的时候,RW数据是放在FLASH/ROM中的,此时,RAM中还没有数据。当程序运行的时候,根据加载文件中执行域Execution region指定的地址,会把RW数据拷贝到RAM中,RAM中就有了数据,memory map产生了变化。
- 疑问:如果按我上面理解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:
文章评论