视屏网站开发者工具无视频文件,电子商务网站建设简答题,wordpress花瓣网,泰安明航网络科技有限公司我们在做嵌入式系统开发时#xff0c;会经常遇到加载地址、链接地址和运行地址的概念#xff0c;可能会感到很困惑#xff0c;搞不清它们三者的关系。希望此文能帮助大家彻底理解三者的关系。
一.概念
1.1.加载地址 加载地址#xff0c;即Load Memory Address#xff08… 我们在做嵌入式系统开发时会经常遇到加载地址、链接地址和运行地址的概念可能会感到很困惑搞不清它们三者的关系。希望此文能帮助大家彻底理解三者的关系。
一.概念
1.1.加载地址 加载地址即Load Memory AddressLMA是指程序或数据在存储介质如Flash、ROM中的物理存放地址。 它是指静态存储位置由链接脚本中的 AT 指令显式指定若不指定则默认与链接地址即预期的运行地址相同。 这里的“加载”一词容易造成误解它是指从哪个地址开始加载而不是指加载到哪个地址。例如系统启动时一般需从flash加载代码到RAM中运行假设从flash的地址A加载到RAM的地址B运行则加载地址是指A。 例如以下为链接脚本片段
SECTIONS {.text 0x10000000 : { *(.text) } /* 指定链接地址为0x10000000 */.data : AT(0x1000) { *(.data) } /* 指定加载地址为0x1000*/
}
1代码段.text的链接地址为 0x10000000也是代码的预期运行地址。 2数据段.data存储在Flash的 0x1000即加载地址为0x1000。若不指定AT则加载地址默认为0x10000000。
1.2.链接地址 链接地址即Link Address是编译链接时程序员预期的代码运行地址由链接脚本中的起始地址定义。所有符号函数、变量的地址均基于此地址生成。 链接地址可通过链接脚本指定也可通过链接参数-Ttext指定。
SECTIONS {.text 0x2000 : { *(.text) } /* 将代码段链接到0x2000地址 */.data : { *(.data) } /* 数据段地址紧接.text段末尾 */
} 若同时使用链接脚本和链接器参数指定链接地址则编译器会优先使用脚本中的设置。
1.3.运行地址 运行地址即Virtual Memory AddressVMA是程序实际执行时的地址。这个地址一般指内存地址但也有直接在flash上执行代码的。 二.它们的关系
2.1 三者相同 若代码直接在存储介质中运行如NOR Flash三者通常相同。
2.2 加载地址 ≠ 运行地址 代码从Flash加载到RAM运行时加载地址为Flash地址运行地址为RAM地址。
2.3 链接地址 ≠ 运行地址 位置无关的代码可在任意地址运行它的实际运行地址可以不等于链接地址。 例如内核代码的启动部分一般为位置无关码它通过相对跳转执行如 B、BL 指令不依赖链接地址。而后部分为位置相关码依赖链接地址需通过重定位修正。
2.4 链接地址 ≠ 加载地址 常见于代码存储在ROM但链接到RAM的场景需在启动时复制代码到RAM。