STM32分散加载与内存布局

名词:

LR = Load region上面只有1个,实际可以有多个。

ER = Execution region1个LR中可以有多个ER。

ER = Execution region1个LR中可以有多个ER。

 input section1个ER中可以有多个Input section。

首先,LR_IROM1是Load region的区域名,紧接着0x08000000是其加载地址,然后0x00080000是其区域最大容量;
然后,ER_IROM1是Execution region的区域名,紧接着0x08000000是其可执行地址,也可以叫链接地址,然后0x00080000也是其区域最大容量;

原文链接:https://blog.csdn.net/qq_38113006/article/details/113005745

 

LR_IROM1 0x08000000 0x00010000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00010000  {  ; load address = execution address
   *.o (RESET, +First);所有的.o文件里的RESET段抽取出来放在最开始的位置
   *(InRoot$$Sections);所有的文件包括库,keil添加的可执行文件,看不到源码。实际包含了把.bss段、.data段复制到RAM。可以使用fromelf输出反汇编查看。
   .ANY (+RO)         ;等同于*,优先级比*低,这里表示所有的只读数据段
   .ANY (+XO)         ;这里表示所有的只可执行段,也就是.text段
  }
  RW_IRAM1 0x20000000 0x00005000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

这段脚本定义了两个内存区域:ROM和RAM


LR_IROM1:这是只读存储区(通常指闪存),用于存储程序代码。
0x08000000 是该区域的起始地址。
0x00010000 是该区域的大小,即64KB


RW_IRAM1:这是读写存储区(通常指RAM),用于存储程序运行时的可读写数据。
0x20000000 是该区域的起始地址。
0x00005000 是该区域的大小,即20KB


代码段:
ER_IROM1:定义了执行地址和加载地址相同的区域,通常用于描述固件代码。
*.o (RESET, +First) 指的是将所有包含RESET段的object文件首先放入这个区域。
*(InRoot$$Sections) 可能是指定某些特定的段,包括把ZW和ZI变量复制到RAM。
.ANY (+RO) 指的是所有只读段(Read-Only)也就是常量
.ANY (+XO) 可能是指某些特殊的执行只读段。
.ANY (+RW +ZI) 指的是所有读写(Read-Write)和 零初始化(Zero-initialized)的数据段。

 

在ARM Cortex-M微控制器的上下文中,InRoot$$Sections通常指的是以下节:
.text:包含程序的可执行代码。
.rodata:包含只读数据,例如常量字符串和静态常量
.data:包含已初始化的全局和静态变量。
.bss:包含未初始化的全局和静态变量(它们在程序启动时会被初始化为零)。
当你在分散加载文件中使用InRoot$$Sections时,它通常意味着以下内容:
InRoot:这表示这些节是“在根目录中”,即它们是主要的、非可选的节,它们必须被包含在最终的二进制文件中。
$$Sections:这是一个通配符,它代表所有匹配的节。
因此,InRoot$$Sections告诉链接器,所有主要的、非可选的节都应该被放置在指定的内存区域中。在分散加载文件中,它通常与加载和执行区域相关联,如下所示:

posted @ 2024-05-12 00:35  流水江湖  阅读(60)  评论(0编辑  收藏  举报