一文读懂加载地址、链接地址和运行地址

devtools/2025/3/6 9:35:29/

        我们在做嵌入式系统开发时,会经常遇到加载地址、链接地址和运行地址的概念,可能会感到很困惑,搞不清它们三者的关系。希望此文能帮助大家彻底理解三者的关系。

一.概念

1.1.加载地址

        加载地址,即Load Memory Address(LMA),是指程序或数据在存储介质(如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 Address(VMA),是程序实际执行时的地址。这个地址一般指内存地址,但也有直接在flash上执行代码的。

  二.它们的关系

2.1 三者相同

        若代码直接在存储介质中运行(如NOR Flash),三者通常相同。

2.2 加载地址 ≠ 运行地址

        代码从Flash加载到RAM运行时,加载地址为Flash地址,运行地址为RAM地址。

2.3 链接地址 ≠ 运行地址

        位置无关的代码,可在任意地址运行,它的实际运行地址可以不等于链接地址。

       例如,内核代码的启动部分一般为位置无关码,它通过相对跳转执行(如 B、BL 指令),不依赖链接地址。而后部分为位置相关码,依赖链接地址,需通过重定位修正。

2.4 链接地址 ≠ 加载地址

        常见于代码存储在ROM但链接到RAM的场景,需在启动时复制代码到RAM。


http://www.ppmy.cn/devtools/164963.html

相关文章

libilibi项目优化(1)使用Redis实现缓存

第一版 获取视频信息使用旁路缓存 当视频信息存在缓存中时(命中),直接从缓存中获取。不存在缓存中时,先从数据库中查出对应的信息,写入缓存后再放回数据。 //获取视频详细信息RequestMapping("/getVideoInfo&q…

Java常用正则表达式(身份证号、邮箱、手机号)格式校验

目录 身份证号的正则表达式 代码解释 正则表达式 方法 isValidIDCard 注意事项 校验邮箱的正则表达式 代码解释 正则表达式 方法 isValidEmail 注意事项 手机号的正则表达式 中国大陆手机号校验(支持空字符串) 代码解释 通用手机号校验&am…

STM32之ADC

逐次逼近式ADC: 左边是8路输入通道,左下是地址锁存和译码,可将通道的地址锁存进ADDA,ADDB,ADDC类似38译码器的结构,ALE为锁存控制键,通道选择开关可控制选择单路或者多路通道,DAC为…

Linux 基本开发工具的使用(yum、vim、gcc、g++、gdb、make/makefile)

文章目录 Linux 软件包管理器 - yum理解什么是软件包和yum如何查看/查找软件包如何安装软件如何实现本地机器和云服务器之间的文件互传如何卸载软件 Linux 编辑器 - vim 的使用vim 的基本概念vim 的基本操作vim 命令模式各命令汇总vim 底行模式各命令汇总vim 的简单配置 Linux …

【算法方法总结·四】字符串操作的一些技巧和注意事项

【算法方法总结四】字符串操作的一些技巧和注意事项 【算法方法总结一】二分法的一些技巧和注意事项【算法方法总结二】双指针的一些技巧和注意事项【算法方法总结三】滑动窗口的一些技巧和注意事项【算法方法总结四】字符串操作的一些技巧和注意事项 【字符串操作】 此章节涉…

Python从PowerBI Server上取得报表数据的方法

下载PowerBI报表文件,提取数据文件读取数据并存为CSV文件 使用Python和Restful API下载PowerBI Server上报表为.pbix格式的报表文件,再把它当做zip文件解压出其中的数据文件,然后用Python读取该文件的内容并存储为CSV文件。最后详细论述Powe…

Python 面向对象高级编程-定制类

目录 __str__ __iter__ __getitem__ __getattr__ __call__ 小结 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()…

确定信号分析:从傅里叶级数到信号带宽的Matlab实践

关键词:傅里叶变换 信号能量 功率谱密度 自相关函数 信号带宽 Matlab仿真 内容摘要: 本文系统讲解确定信号分析的核心理论与Matlab实践,涵盖周期信号的傅里叶级数展开、非周期信号的傅里叶变换及性质、信号能量与功率的计算、自相关函数与频…