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

前言

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

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

首先我们要知道程序是怎么在设备里运行起来的,嵌入式设备都是交叉编译的,在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不能做内存。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值