理解 VMA 与 LMA
文章目录
- 理解 VMA 与 LMA
-
- 什么是 VMA(Virtual Memory Address)
- 什么是 LMA(Load Memory Address)
- VMA 和 LMA 的区别
- 变量示例
- 链接脚本配置
- 启动代码如何处理 VMA 和 LMA
- VMA 和 LMA 示例
-
- FLASH+RAM
- 全 RAM
- 如何生成 VMA 和 LMA 信息
理解 VMA 与 LMA
在嵌入式开发或裸机程序中,经常会听到 VMA
和 LMA
这两个词。链接脚本(*.ld
文件)和启动代码(startup.S
)中这两个地址概念对准确配置 .text、.data、.bss 等段的布局至关重要。
什么是 VMA(Virtual Memory Address)
VMA(虚拟地址 / 运行地址)是程序在运行时访问内存的地址。
- 程序访问变量、执行代码时看到的是 VMA。
- 比如在程序中访问
int a = 5
;,实际用的就是VMA。
在裸机嵌入式系统中,VMA 通常是实际的物理地址(因为没有 MMU),但在操作系统中它可能映射到物理地址。
什么是 LMA(Load Memory Address)
LMA(加载地址)是程序在镜像文件中所保存的位置,通常是数据从 Flash 或 ROM 加载时的位置。
- 镜像文件(如 ELF、BIN、HEX)中每个段都有它的 LMA。
- 系统上电启动时,一般 start.s 或者 bootloader 中会将 LMA 中的数据拷贝到 VMA。