欢迎来到天天文库
浏览记录
ID:10266788
大小:34.00 KB
页数:4页
时间:2018-06-14
《详解lma(装载内存地址)与vma(虚拟内存地址)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、查看文章 转-详解LMA(装载内存地址)与VMA(虚拟内存地址)2009-10-1010:07src=http://hi.baidu.com/serial_story/blog/item/4bc67da7ed44f49fd0435807.htmlversion:20091004author:green-waste@163.com关于LMA和VMA,这个问题,有点点小复杂,不过,此处,我会把我的理解,尽量通过通俗的方式解释出来,以方便理解。当然,鄙人水平有限,难免有错,希望各位批评指正。一般提及LMA和VMA,多数情况都是和ld,链接器相关的。在了解这两个名词的详细含义之
2、前,有些基本知识和前提要说一下:[基础知识]1。从你写的源代码到执行你的程序,一般经历了这几个过程:源代码编辑->编译->链接->装载->执行2。编译,简单说就是用编译工具,将你的源码,变成可以执行的二进制代码,也叫做目标文件,当然只是对应某一种硬件平台,比如此处我用的是Intel的X86系列的CPU,编译出来的,就是针对X86的二进制代码。3。链接就是,将多个目标文件合并为一个目标文件,称作可执行文件。4。每个目标文件都包含一连串的section,最常见,最基础的至少有:.text,代码段,就是CPU要运行的指令代码;.data,数据段,程序中包含的一些数据,放在这个
3、段里;.bss,未初始化段,记录了程序里有哪些未初始化的变量,就相当于只记录对应的名字,留着程序运行前去初始化为0,所以,此处并不占用具体空间。打个比方就是,只记录人名,没有人站在这里站地方,而对应的.text和.data段,都是既有人名(函数或者变量名),又占对应的地方(包含具体空间记录到底是什么指令代码和数据的数值是多少)。5。section一般可以分为loadable与allocatable.通俗点说就是:loadable,可加载,就是,原先目标文件里面包含对应的代码或数据,所以,装载器要把这些内容,load到对应的地址,以便程序可以运行;而allocatable
4、,可分配的,最简单理解就是上面提到的.bss段,那里记录了人名,到时候,你要给这些人名分配空间给你站的地方,对应着也就是变量所要占用的具体内存空间了。其他还有既不是loadbale的,也不是allocatable的,比如只存储debug信息的段,此处不多解释。[前提]程序已经编译好了,有了一个可执行文件,也叫目标文件,二进制文件,才会有后面的把程序装载,运行的事情。看完了基础知识和前提,再说我们此处的主题,才能更加清楚是咋回事:对于目标文件中的loadable或allocatable的section,其都有两个地址:VMA和LMA。知道了其来由,再看具体解释:[LMA详
5、解]LMA的英文原版解释:LMA(LoadMemoryAddress):theaddressatwhichthesectionwillbeloaded.什么是LoadMemoryAddress,内存装载地址呢?此处,单单从名字上,我们就可以看出几层意思:1。load,装载为何要装载呢?因为,如果想要使你的程序(即经历过,由你的源码,通过编译器的编译,链接器的链接,形成的那个可执行文件),能在内存里面运行,那么肯定涉及到一点,就是,有人,把你的这个程序,,从此处常见的存储器硬盘里面,搬到内存里面去了,然后才有可能运行。而这里的装载,就是对应这个意思。就是把程序,从硬盘里面
6、,装载Load,到内存里面去了。对应地,放到内存哪里去了呢?就是LMA,LoadMemoryAddress,就是把你的程序中的对应的内容,详细点说就是,把其中的.text代码段,.data数据段等内容,搬到,也就是copy拷贝到,内存的LMA地址处了。2。Memory,内存上面已经解释了,这里再多说几句。程序运行的本质,就是CPU读取到指令,然后执行。这里就涉及到,如果想要你的程序运行,首先,你应该把对应的指令,放到合适的地方,CPU才能读到,才能执行。此处合适的地方,有人想到,直接放到硬盘这里,CPU过来读取,然后执行不就可以了吗,还不用这么麻烦地将(指令)代码搬来搬
7、去的,多省事。但是实际上,系统就是这么“笨”地搬来搬去,原因在于,从硬盘上直接读取指令,速度比直接从内存,一般PC上是各种类型的RAM,比如DDR,此处统称为Memory/内存,要慢很多倍,所以,系统才会不嫌弃麻烦,把代码拷贝到内存里面去,然后从内存里面读取指令,然后执行,这样效率会高很多。所以,此处简单说就是,为了总体效率,对于普通系统,比如PC,程序的执行都是在Memory,内存里面执行的。因此,用一句话总结就是:代码被装载到内存的某个地方,那个地方的地址,就是LMA。[VMA详解]英文解释:VMA(VirtualMemoryAddr
此文档下载收益归作者所有