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中的指令或数据之前正确的进行重定向(拷贝到链接地址)。