GNU链接器的LMA和VMA

LMA和VMA的含义

  • LMA:加载存储地址,指的是加载到存储器的地址,即加载(有时应该说烧写)到哪里
  • VMA:虚拟存储地址,也就是链接地址,指示代码和数据运行的时候应该位于何处

对于主机程序

对于PC上的程序(有操作系统环境),loader在加载程序时,会根据可执行程序文件中记录的链接地址申请相应的虚拟地址,在实际访问时申请物理地址并和之前申请的虚拟地址建立映射关系。由于进程独享虚拟地址空间,因此通常都能申请到相应的虚拟地址。这种情况下LMA通常是等于VMA的。

对于嵌入式系统程序

在嵌入式系统中,LMA和VMA通常不等,比如芯片启动时的启动程序一般存放(烧写)在ROM/支持XIP的flash中(RAM易失,存不住),因此启动程序中的数据(.data、.bss等)一开始也是加载到ROM中的,也即LMA位于ROM。但ROM是无法写的,数据不可能链接到ROM,只能链接到RAM,因此VMA位于RAM。这种情况下,对于程序中的数据,LMA和VMA就不相等了(对于代码.text,LMA和VMA还是相等的)。对此,需要进行重定位,也就是把数据拷贝到RAM中它们的链接地址处。

无论是代码还是数据,开发者都应该遵守在链接脚本中做出的承诺,即初始时确保程序在存储介质上的位置等于LMA;运行时,如果LMA不等于VMA,则在用到VMA中的指令或数据之前正确的进行重定向(拷贝到链接地址)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值