热度 18
2014-12-29 22:43
1190 次阅读|
0 个评论
今晚又在opendev.com开源电子论坛里看到有人提问STM32中的内存变量是怎么来的,我们都知道编译后的代码是写成Flash里面去的,而全局变量(其实也就是内存的一片区域)尤其是已经有初始化值的,是怎样到内存里面去的。估计如果不是研究过ARM9以上的高级ARM的人,都不会是关注这一点,因为ARM9以上的高级ARM都是在Uboot有代码来实现这一点的,而STM32中,除了那一点点的启动代码,没有更底层的代码来先说我们是怎么实现的,自然也没人去在意过。这里我同样反汇编了STM32的AXF文件来研究下,下面直接引用我在论坛里的回答,希望对大家更好理解STM32有所帮助 --------------------------------- 上图直接看反汇编的后的代码,地址是0x08000000也就是代码区的最后面0x8013894的地址就是对应0x20000000,大小是0x704,0x8011AE2对应的_decompress1函数,这里就是把0x8013894个地址开始,总共0x704大小的数据搬到内存里去,这区域的数据正好就是已经有初始化的全局变量的数据。 再看偏移0x704之后,对应内存地址变成0x20000704,之后的偏移量是0xc074,调用的0x80111b90(函数_scatterload_zeroinit) 再看0x20000704的地址区域,其实就是没有初始化的全局变量,这里没有数据搬运,只是压栈在这里,并预留了变量的空间在这里。 为了验证这一点,我们再打开对应的Hex文件,来看看 HEX的数据跟反汇编对应地址上的数据是完全相同,而没初始化的全局变量,没有数据自然在HEX文件也找不到,也就是说全局变量的数据也是保存在代码的最后面,然后再搬到内存上去的。这一切都由编译自动完成的,当然我们是看不到代码用户代码的实现。