详解lma(装载内存地址)与vma(虚拟内存地址)

上传人:wt****50 文档编号:34056571 上传时间:2018-02-20 格式:DOC 页数:4 大小:34KB
返回 下载 相关 举报
详解lma(装载内存地址)与vma(虚拟内存地址)_第1页
第1页 / 共4页
详解lma(装载内存地址)与vma(虚拟内存地址)_第2页
第2页 / 共4页
详解lma(装载内存地址)与vma(虚拟内存地址)_第3页
第3页 / 共4页
详解lma(装载内存地址)与vma(虚拟内存地址)_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《详解lma(装载内存地址)与vma(虚拟内存地址)》由会员分享,可在线阅读,更多相关《详解lma(装载内存地址)与vma(虚拟内存地址)(4页珍藏版)》请在金锄头文库上搜索。

1、查看文章 转详解 LMA(装载内存地址)与 VMA(虚拟内存地址)2009-10-10 10:07src = http:/ 20091004author: green-关于 LMA和 VMA,这个问题,有点点小复杂,不过,此处,我会把我的理解,尽量通过通俗的方式解释出来,以方便理解。当然,鄙人水平有限,难免有错,希望各位批评指正。一般提及 LMA和 VMA,多数情况都是和 ld,链接器相关的。在了解这两个名词的详细含义之前,有些基本知识和前提要说一下:基础知识1。从你写的源代码到执行你的程序,一般经历了这几个过程:源代码编辑 - 编译 - 链接 - 装载 - 执行2。编译,简单说就是用编译工具

2、,将你的源码,变成可以执行的二进制代码,也叫做目标文件,当然只是对应某一种硬件平台,比如此处我用的是 Intel的X86系列的 CPU,编译出来的,就是针对 X86的二进制代码。3。链接就是,将多个目标文件合并为一个目标文件,称作可执行文件。4。每个目标文件都包含一连串的 section,最常见,最基础的至少有:.text,代码段,就是 CPU要运行的指令代码;.data,数据段,程序中包含的一些数据,放在这个段里;.bss,未初始化段,记录了程序里有哪些未初始化的变量,就相当于只记录对应的名字,留着程序运行前去初始化为 0,所以,此处并不占用具体空间。打个比 方就是,只记录人名,没有人站在这

3、里站地方,而对应的.text 和.data 段,都是既有人名(函数或者变量名),又占对应的地方(包含具体空间记录到底 是什么指令代码和数据的数值是多少)。5。section 一般可以分为 loadable与 allocatable.通俗点说就是:loadable,可加载,就是,原先目标文件里面包含对应的代码或数据,所以,装载器要把这些内容,load 到对应的地址,以便程序可以运行;而 allocatable,可分配的,最简单理解就是上面提到的.bss 段,那里记录了人名,到时候,你要给这些人名分配空间给你站的地方,对应着也就是变量所要占用的具体内存空间了。其他还有既不是 loadbale的,也

4、不是 allocatable的,比如只存储 debug信息的段,此处不多解释。前提程序已经编译好了,有了一个可执行文件,也叫目标文件,二进制文件,才会有后面的把程序装载,运行的事情。看完了基础知识和前提,再说我们此处的主题,才能更加清楚是咋回事:对于目标文件中的 loadable或 allocatable的 section,其都有两个地址:VMA 和 LMA 。知道了其来由,再看具体解释:LMA 详解LMA的英文原版解释:LMA(Load Memory Address): the address at which the section will be loaded.什么是 Load Memo

5、ry Address,内存装载地址呢? 此处,单单从名字上,我们就可以看出几层意思:1。load,装载为何要装载呢? 因为,如果想要使你的程序(即经历过,由你的源码,通过编译器的编译,链接器的链接,形成的那个可执行文件),能在内存里面运行,那么肯定涉及到一点,就是,有人,把你的这个程序,从此处常见的存储器硬盘里面,搬到内存里面去了,然后才有可能运行。而这里的装载,就是对应这个意思。就是把程序,从硬盘里面,装载 Load,到内存里面去了。对应地,放到内存哪里去了呢?就是 LMA,Load Memory Address,就是把你的程序中的对应的内容,详细点说就是,把其中的.text 代码段,.da

6、ta 数据段等内容,搬到,也就是 copy拷贝到,内存的 LMA地址处了。2。Memory,内存上面已经解释了,这里再多说几句。程序运行的本质,就是 CPU读取到指令,然后执行。这里就涉及到,如果想要你的程序运行,首先,你应该把对应的指令,放到合适的地方,CPU 才能读到,才能执行。此处合适的地方,有人想到,直接放到硬盘这里,CPU 过来读取,然后执行不就可以了吗,还不用这么麻烦地将(指令)代码搬来搬去的,多省事。但是实际上, 系统就是这么“笨”地搬来搬去,原因在于,从硬盘上直接读取指令,速度比直接从内存,一般 PC 上是各种类型的 RAM,比如 DDR,此处统称为Memory/内存,要慢很多

7、倍,所以,系统才会不嫌弃麻烦,把代码拷贝到内存里面去,然后从内存里面读取指令,然后执行,这样效率会高很多。所以,此处简单说就是,为了总体效率,对于普通系统,比如 PC,程序的执行都是在 Memory,内存里面执行的。因此,用一句话总结就是:代码被装载到内存的某个地方,那个地方的地址,就是 LMA 。VMA 详解英文解释:VMA(Virtual Memory Address):the address the section will have when the output file is run;那啥是虚拟内存地址呢?简单说就是,你程序运行时候的所对应的地址。此处所谓的虚拟,一般来说,指的是启

8、用了 MMU之后,才有了虚拟地址和实地址。此处,我们可以简单的理解为,就是内存的实际地址即可。程序运行前,要把程序的内容,拷贝到对应的内存地址处,然后才能运行的。因此,一句话总结就是:代码要运行的时候,此时对应的地址,就是 VMA。理解此句:在多数情况下,LMA 和 VMA是相等的这句话,说白了,可以(武断地)这么理解:如果是普通 PC电脑,也就是上面说的,大多数情况下,那么 LMA和 VMA是一样的,也就是,程序被加载到内存的什么地方,也就在什么地方运行。如果是嵌入式系统,也就是相对的“少数情况”,LMA 和 VMA不一样。而其中最常见的一种情况就是,程序被放到 ROM中,比如设置为只读的

9、Nor Flash中,也就是 LMA的地址是 Nor Flash的地址,此如随便举例为 0x10000000,而程序要运行时候的地址是内存地址,比如0x30000000,也就是 VMA 是 0x30000000,这时候,就要我们自己保证,在程序运行之前,把自己的程序,从 LMA0x10000000 拷贝到 VMA0x3000000 处,然后程序才可以正常运行。有人会问,反正对于 ROM来说,CPU 也是可以直接从 ROM里面读取代码,然后运行的。为何还要前面提到的,弄个 LMA 和 VMA不同,搬来搬去的呢?因为ROM,顾名思义,是只读的,只能读取,不能写入的。而程序中的代码段,由于只是被读取

10、,不涉及到修改写入,是没有问题的。但是对于数据段和 bss位初始化段来说,里面的所有的程序的变量,多数都是在运行的时候,不仅要读取,而且要被修改成新的值,然后写入新的值的,所以,如果还是放到 ROM里面,就没法修改写入了。而且,另一个原因是,CPU 从 ROM,比如常见的 Nor Flash中读取代码的速度,要远远小于从 RAM,比如常见的 SDRAM,中读取的速度,所以,才会牵扯到将代码烧写到 ROM里面,然后代码的最开始,将 此部分程序 reaload,重载,也就是从此处的 ROM的地址,即 LMA,重新拷贝到 SDRAM中去,也就是 VMA的地方,然后从那里运行。后记关于 LMA 和 V

11、MA:Linker,链接器的作用:1。将 LMA写到(可执行的)二进制文件里面去2。解析符号。即,把不同的符号,根据符号表中的信息,转换成对应的地址。此处只涉及 VMA,即程序运行时候的地址。Loader,装载器的作用:1。从二进制文件中读出对应的段的信息,比如 text,data,bss 等段的信息,将内容拷贝到对应的 LMA的地址处。此谓,装载(对应内容)到装载地址(LMA)。2。如果发现 VMA!=LMA, 即 程序运行时候的地址,和刚刚把程序内容拷贝到的地址 LMA,两者不一样,那么就要把对应的内容,此处主要是 data,数据段的内容,从刚刚装载到的位置,LMA 处,拷贝到 VMA处,这样,程序运行的时候,才能够在执行的时候,找到对应的 VMA处的变量,才能找到对应的值,程序才能正常运行。引用文章1。谁能解释下 VMA和 LMA及其在链接时的作用http:/ LMAhttp:/ vs LMA?http:/ 阅读笔记http:/ section LMA http:/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号