1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
VMA和LMA的基本概念与常见问题解答
摘要:本文介绍VMA和LMA的基本概念,并针对一些理解过程中的常见疑问做出解答。 概念 VMA:Virtual Memory Address 虚拟地址,即运行地址。指代码真正运行起来的空间,可以是flash区也可以是SRAM区。 LMA:Load Memory Address 加载地址,一般是flash区,因为SRAM掉电数据会丢失。但调试的时候例外,因为SRAM调试时,可以将所有代码加载到SRAM区执行。 常见问题解答 Q1:什么时候VMA和LMA相同? A1:比如,代码下载到flash中,程序也从flash区中取址、译码、执行时,代码区的VMA和LMA就是相同的。 Q2:什么时候VMA和LMA不同? A2:对于.rodata 或者.text段,代码下载到flash中,但是出于对速度的要求,需要程序在SRAM中运行。此时LMA=flash地址,VMA=SRAM地址。 对于.data, .bss段,VMA和LMA肯定是不一样的。所以ld文件中一般可以看到 Q3:谁负责把代码从LMA中搬到VMA中? A3:脱离调试环境的情况下,都是用户代码来实现代码搬移。在APT系列芯片的驱动中,通常有一个mem_init.c,里面的__main()函数就是用来实现data段数据从flash搬移到sram中的。 但是在调试环境下要看IDE,有些IDE,会根据ld文件自动加载SRAM。 Q4:既然代码搬移是用户程序完成的,那为什么要告诉编译器LMA和VMA不同呢? A4:以变量来举例。假如一个芯片,如APT32F102x系列,flash区是0x0000~0xffff,sram区是0x20000000~0x20000fff。 一个data段的变量a (非常量),它的VMA一定只能在SRAM区,因为要可以读写。假设VMA = 0x20000010。而它的LMA一定要在flash中,否则断电后初始值就无效了。假设LMA = 0xfff0。 那么在程序执行的时候,这个变量地址应该是什么呢?0x20000010。这个信息就是VMA告诉编译器的。而0xfff0应该是__main()函数搬移代码的一部分。 文章转载自:平头哥芯片开放社区 作者:爱普特微电子 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
【平头哥Sipeed LicheeRV 86开发板试用体验】Waft初体验
15719 浏览 1 评论
13770 浏览 4 评论
【平头哥Sipeed LicheeRV 86开发板试用体验】四、烧写waft系统&搭建waft测试环境
19692 浏览 2 评论
59148 浏览 19 评论
【限时福利】加入芯片开发社区,领100G电子工程师资料大礼包
88281 浏览 121 评论
邀请函 | 3月2日 来上海参加平头哥“玄铁RISC-V生态大会”
800浏览 0评论
读书分享会 | 玄铁RISC-V处理器入门与实战电子书免费下载!
698浏览 0评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 00:09 , Processed in 0.796107 second(s), Total 38, Slave 32 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号