转-LMA和VMA

转载 2015年11月20日 22:09:27

一般体积LMA和VMA,多数情况下都是和ld,连接器有关。
在了解这两个名词的详细含义之前,有些基本知识和前提要说一下:

【基础知识】

1、从源代码到可执行的代码,一般要经过一下几个过程:
源代码编辑 -> 编译 -> 链接 ->装载 -> 执行

2、编译
简单的说就是用编译工具,将你的源码变成可以执行的二进制文件,即目标文件,当然只是对应某一种硬件平台,比如x86,arm

3、链接
就是将多个目标文件合并为一个目标文件,称作可执行文件。

4、每个目标文件都包含一连串的section,最常见,最基础的有:
.text: 代码段, 就是cpu要运行的指令代码
.data: 数据段, 程序中的一些数据,如初始化的全局变量,静态变量等都放在这个段里
.bss: 未初始化段,记录了程序里未初始化的全局变量,就相当于只记录对应的名字,留着程序运行前去初始化为0,所以此处不占用具体空间。打个比方,只记录人名,没有人站在这里,而对应的.text 和.data段,都是既有人名(函数或者变量名),又占用对应的地方(包含具体空间记录到底, 是什么指令代码和数据的数值是多少)

5、section一般分为loadable和allocatable
通俗点说就是:
loadable,可加载,就是,原来目标文件里面包含对应的代码或数据,所以,装载器要把这些内容,load 到对应的地址,以便程序可以运行;
allocatable, 可分配的,最简单理解就是上面的.bss段,那里记录了人名,到时候,你要给这些人名分配空间给你站的地方,对应着也就是变量所要的具体内存空间。

【前提】

程序已经编译好了,有了一个可执行的文件,即目标文件,二进制文件,才会有后面的把程序装载,运行的事情。

看完了基础知识和前提,再说我们此处的主题,才能更加清楚是怎么回事:

对于目标文件中的loadable或allocatable的section,其都有两个地址:VMA和LMA

【LMA 详解】

LMA(Load Memory Address):内存装载地址

1、load, 装载
如果想要使你的程序(即由你的源码,通过编译器的编译,链接器的链接,形成的可执行文件), 能做内存里面运行,那么肯定要涉及到一点,就是,把你的程序从常见的存储硬盘里面搬到内存里面,然后才有可能运行。而这里的装载就是这这个意思。就是把程序从硬盘里面装载到内存里。
对应的,放到内存的什么地方,就是LMA。详细点说,就是把其中的.text代码段,.data数据段等内容,搬到,也就是copy到内存的LMA地址处。

2、内存
程序运行的本质,就是cpu读取到指令,然后执行。
如果想要运行你的程序,首先,你应该把你对应的指令放到合适的位置,cpu才能读到,才能执行。有人想到,直接放到硬盘里,cpu过来读取,然后执行不就可以了嘛,还不用这么麻烦将(指令)代码搬来搬去的,。但是实际上,从硬盘上直接读取指令,速度比直接从内存要慢很多倍(一般pc上的内存是各种各样的RAM,如ddr,但此处统称为memory/内存),所以系统才会不嫌麻烦,把代码拷贝到内存里面去,然后从内存里面读取指令,再执行,这样速率会高很多。
所以简单的说就是,为了总体效率,对于普通系统,比如pc,程序的执行都是在memory,内存里面执行的。

故,用一句话总结就是:代码被装载到内存的某个地方,那个地方的地址,就是LMA

【VMA 详解】
VMA:Virtual Memory Address 虚拟内存地址
简单的说就是,你程序运行时所对应的地址。
此处所谓的虚拟,一般来说,指的是启用了MMU之后,才有了虚拟地址和实地址。此处,我们可以简单的理解为,就是内存的实际地址即可。
程序运行前,要把程序的内容,拷贝到对应的内存地址处,然后才能运行。
MMU:Memory Management Unit 内存管理单元
它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。

因此,一句话总结就是: 代码运行的时候,此时对应的地址,就是VMA

【在多数情况下,LMA和VMA是相等的】

这句话,说白了,可以(武断地)这么理解:
如果是普通pc电脑,也就是上面说的,大多数情况下,LMA和VMA是一样的,也就是,程序被加载到内存的什么地方,也就在什么地方运行。

程序被放到了ROM中,比如设置位只读的Nor Flash中,那么LMA的地址就是Nor Flash的地址。
随便举例为0x1000000,而程序要运行时的地址是内存地址,比如0x30000000,也就是VMA是0x30000000,这时候,就要我们自己保证,在程序运行之前,把自己的程序,从LMA = 0x10000000拷贝到VMA = 0x30000000 处,然后程序才可以正常运行。

有人会问,反正对应ROM来说,CPU也是可以直接从ROM里面读取代码,然后运行。为何还要前面提到的,弄个LMA和VMA不同,搬来搬去呢?因为ROM,顾名思义,是只读的,只能读取,不能写入。
而程序中的代码段,由于只是被读取,不涉及到修改写入,是没问题的。但是对于数据段和bss位初始化段来说,里面的所有的程序的变量,多数都是在运行的时候,不仅要读取,而且要被修改成新的值,然后写入新的值,所以,如果还是放到ROM里面,就没法修改写入。
而且,另一个原因是,cpu从ROM,比如常见的Nor Flash中读取代码的速度,要远远小于从RAM,比如常见的SDRAM中读取的速度,所以,才会牵涉到将代码烧写到ROM里面,然后代码的最开始,将此部分程序reaload,重载,也就是从此处的ROM的地址,即LMA,重新拷贝到SDRAM中去,也就是VMA的地方的地方,然后从那里运行。

【后记】
关于LMA和VMA

Linker,连接器的作用:
1、将LMA写到(可执行的)二进制文件里面去
2、解析符号。即,把不同的符号,根据符号表中的信息,转换成对应的地址。此处只涉及VMA,即程序运行时的地址。

Loader,装载器的作用:
1、从二进制文件中读出对应的段的信息,比如text,data,bss等段的信息
将内容拷贝到对应的LMA的地址处,所谓,装载(对应内容)到装载地址(LMA)
2、如果发现VMA != LMA, 即 程序运行时候的地址和刚刚把程序内容拷贝到的地址LMA不一样,那么就要把对应的内容,此处主要是data,数据段的内容,从刚刚装载到的位置,LMA处,拷贝到VMA处,这样,程序运行的时候,才能够在执行的时候,找到对应VMA处的变量,才能找到对应的值,程序才能正常运行

相关文章推荐

LMA和VMA

引用地址: http://lhsblog01.blog.163.com/blog/static/102004519201051023125131/   version: 20091004 au...

详解LMA(装载内存地址)与VMA(虚拟内存地址)

原文: http://hi.baidu.com/serial_story/item/4e6ccb0130b6c210cd34eaf5 ================================...

VMA & LMA

原文: http://hi.baidu.com/iamonlinux/item/54c784f4e68214d542c36af1 ==================================...

LMA(装载内存地址)与VMA(虚拟内存地址)

关于LMA和VMA,这个问题,有点点小复杂,不过,此处,我会把我的理解,尽量通过通俗的方式解释出来,以方便理解。当然,鄙人水平有限,难免有错,希望各位批评指正。       一般提及LMA和VMA,多...

Linker Script,LMA,VMA

以前在学ld的script时两个比较重要的概念,即指定一个输出section的lma和vma(分别是load memory address和virtual memory address),vma的作用...

详解LMA(装载内存地址)与VMA(虚拟内存地址)

关于LMA和VMA,这个问题,有点点小复杂,不过,此处,我会把我的理解,尽量通过通俗的方式解释出来,以方便理解。当然,鄙人水平有限,难免有错,希望各位批评指正。一般提及LMA和VMA,多数情况都是和l...

LMA与VMA

个人中心我的主页好友消息 站内消息 :无新消息提醒互动请求 :无新消息提醒系统通知 :1条新  aboluohaibin|装扮|设置| 退出ARM之路只是记录下学习过程的点点滴滴 主页博客相册|个人档...

LMA(装载内存地址)与VMA(虚拟内存地址)

关于LMA和VMA,这个问题,有点点小复杂,不过,此处,我会把我的理解,尽量通过通俗的方式解释出来,以方便理解。当然,鄙人水平有限,难免有错,希望各位批评指正。       一般提及LMA和VM...

VMA与LMA区别详解

两个地址都是虚拟地址。 lma: 加载地址,如加载到RAM中等,在嵌入式中,有可能是在ROM中(这时LMA!=VMA) vma: 虚拟地址,就是程序运行时的地址,一般就是内存地址,如要把ROM中的...

Linker Script,LMA,VMA实例分析

以前在学ld的script时两个比较重要的概念,即指定一个输出section的lma和vma(分别是load memory address和virtual memory address),vma的作用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)