Linux LMA AND VMA 浅析

对于ROM来说,CPU 也是可以直接从ROM里面读取代码,然后运行的。为何还要前面提到的,弄个LMA 和VMA不同,搬来搬去的呢?因为ROM,顾名思义,是只读的,只能读取,不能写入的。

而程序中的代码段,由于只是被读取,不涉及到修改写入,是没有问题的。但是对于数据段和bss位初始化段来说,里面的所有的程序的变量,多数都是在运行的时候,不仅要读取,而且要被修改成新的值,然后写入新的值的,所以,如果还是放到ROM里面,就没法修改写入了。

而且,另一个原因是,CPU从ROM,比如常见的Nor Flash中读取代码的速度,要远远小于从RAM,比如常见的SDRAM,中读取的速度,所以,才会牵扯到将代码烧写到ROM里面,然后代码的最开始,将 此部分程序reaload,重载,也就是从此处的ROM的地址,即LMA,重新拷贝到SDRAM中去,也就是VMA的地方,然后从那里运行。


如果做过嵌入式开发,应该会遇到这情景。
程序要被烧写到ROM中去,很多系统中,ROM是和RAM共享内存地址空间的,所以烧写的过
程就是Load的过程。很明显,全局变量的初值需要被烧到ROM中去。存放全局变量的数据
段在ROM中的位置就是LMA。
但运行时,全局变量在ROM中是不行的。这就意味着,程序在运行前,必须把存放全局变
量的数据段复制到RAM里一份。那么RAM中的地址就是所谓的VMA了。

如此区分,对连接器会有怎样的影响呢?
首先,数据段的位置当然是要因LMA而定,所以连接器必须把这个地址写在binary里。
然后,在解析全局变量符号时,必须用VMA对应的地址做绑定。
最后,程序还需要一段依赖于LMA和VMA的初始化代码,在程序运行前,把数据段copy到
正确的位置上去。
--
【 在 caobo (做一个神,创造奇迹) 的大作中提到: 】
: 看过的,还是不太理解。
: 【 在 FruitSalad 的大作中提到: 】
: : 这段话可能有帮助:
: : Every loadable or allocatable output section has two addresses. The first ..
: : the VMA, or virtual memory address. This is the address the section will 
: : have when the output file is run. The second is the LMA, or load memory 
: : address. This is the address at which the section will be loaded. In most 
: : cases the two addresses will be the same. An example of when they might be 
: : different is when a data section is loaded into ROM, and then copied into 
: : RAM when the program starts up (this technique is often used to initialize 
: .................(以下省略)

关于 Linker and Loader:

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值