嵌入式开发中的链接地址运行地址加载地址存储地址实际运行地址的区别

Posted 代二毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式开发中的链接地址运行地址加载地址存储地址实际运行地址的区别相关的知识,希望对你有一定的参考价值。

前言

在学习嵌入式的重定位相关知识时,会涉及到"链接地址、运行地址、加载地址、存储地址、实际运行地址"等概念,让我疑惑的是不同的人讲解重定位的时候这几个概念代表的含义是不同的,有时是相反的含义。为了弄清楚这个问题,我在网上查了不少资料,以下是我的理解,在这里记录一下,希望给有同样疑惑的人做参考,少走弯路。经过我查找资料,发现这个没有统一的定义,其实大家说的都是同一件事,但是理解不同,用不同的名称去描述同一件事情,所以我的建议是弄清楚这些名称描述的具体含义而不是去纠结名称之间的区别。

这些概念是用来描述什么的?

首先我们要知道程序是怎么在设备里运行起来的,嵌入式设备都是交叉编译的,在A机上编译成可执行程序,在B机上执行程序。A机一般是电脑端,B机一般是嵌入式设备。首先我们要把A机上编译好的可执行程序下载到B机的某个地址处,然后B机去执行程序,可执行程序下载的地址和执行时候的地址是可以相同也可以不同的。上面的名称就是用来描述可执行程序被下载保存的地址和执行时候程序所在的位置。
设备执行程序是在内存(SRAM)中,然而可执行程序是不可能保存在SRAN中的,原因很简单,SRAM是掉电丢失的,没法保存程序,程序一般保存在Flash或者磁盘中。那这样就涉及到两个地址,一个是程序被保存的地址(即在Flash、磁盘中的地址)和程序执行时候的地址(在SRAM中的地址),这些概念就是用来描述着两个地址的。这两个地址也可以相同,就是我们把程序直接下载到Nor Flash或者SRAM中,但这种情况不算常见吧。
这两个地址之间的关系是:下载保存的地址就是你下载到存储器的哪个地址就是哪个地址,你可以通过烧录程序的时候去指定;而程序在SRAM中运行时候的地址是通过链接脚本去指定的,这里涉及到代码重定位,感兴趣的可以去看一下。

对这些概进行分类

既然这些名称用法没有统一,也没必要分类了,看资料的时候重点看作者用这些概念来描述什么吧,反正都是描述程序"下载到哪里保存"、"程序在哪里运行"这两个地址。

总结

1.如果程序是下载到在Nor flash里,运行也是在Nor flash里,则运行地址和加载地址是相同的。
2.如果程序是在ram里运行,但程序是存储在flash里,则运行地址指向ram,而加载地址是指向flash,两个地址不同。
3.如果程序是直接下载到RAM中,运行也是在RAM中,则运行地址和加载地址是相同的。
补充:Flash分为Nand flash和 Nor flash。Nand flash只能保存程序,不能运行程序,因为Nand flash不能总线式访问,也就是CPU不能直接访问Nand flash,即Nand flash不能做内存。

以上是关于嵌入式开发中的链接地址运行地址加载地址存储地址实际运行地址的区别的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式Linux裸机开发——重定位relocate

库中的代码可以位于特定地址吗?

mmu

虚拟内存技术的诞生(程序加载运行发展史)

如何声明静态变量作为硬编码内存地址的引用?

如何从`callq func @ PLT`获取`func`的实际地址