ARM程序加载与运行地址解析

需积分: 0 1 下载量 55 浏览量 更新于2024-09-14 收藏 26KB DOCX 举报
"这篇arm学习笔记主要探讨了在ARM处理器中运行地址与加载地址的区别,以及在实际应用中如何处理这些问题。文中通过一个具体的例子,解释了在开发板上遇到的程序运行异常的问题,最终发现是由于地址配置不正确导致的。" 在ARM架构的系统中,运行地址和加载地址是两个重要的概念。运行地址(Run-Time Address)指的是程序实际执行时的内存位置,而加载地址(Load Address)则是程序被加载到内存时的起始位置。在某些情况下,如直接在Flash中执行代码,运行地址和加载地址是相同的,因为程序直接从Flash中运行。然而,当程序需要先加载到RAM中执行时,两者则可能不同。例如,如果程序存储在Flash中,但在RAM中运行,那么运行地址将指向RAM,而加载地址则指向Flash。 在文中提到的具体问题中,开发者在2410开发板上遇到一个困扰已久的难题:程序在增加无关紧要的代码后,通过USB下载到RAM并启动时无法正常运行。经过研究手册和深入思考,发现问题出在DNW工具中设置的USB下载地址(0x31000000)以及ADS的ARMLinker中设定的ROBase(0x3010000)和RWBase(0x30400000)。开发板的手册指出,SDRAM的地址范围是从0x30000000到0x34000000,并且BIOS占用0x30200000以下的空间。调整ROBase和RWBase到0x30200000和0x30500000后,问题得到了解决。 这个问题的症结在于,虽然程序下载到0x31000000,但程序的初始化部分(RO和RW段)需要根据ROBase和RWBase来定位。如果不正确,程序的初始化阶段可能会出现问题,导致程序无法正常运行。即使程序的实际执行位置在0x31000000,但在程序启动时,它会依赖于ROBase和RWBase来设置堆栈、全局变量等,因此这些地址的设置至关重要。 此案例揭示了理解运行地址和加载地址差异的重要性,以及在具体应用中正确配置内存地址的必要性。对于ARM平台的开发者来说,了解这些基础知识并能将其应用于实践是解决问题的关键。同时,这也强调了阅读硬件手册、深入理解底层机制和调试技巧对于软件开发的重要性。