可执行文件的角度看变量存储空间

一、可执行文件及objdump输出

build/kernel.img:     file format elf64-little

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 init          0000b5b0  0000000000080000  0000000000080000  00010000  2**12
                  CONTENTS, ALLOC, LOAD, CODE
  1 .text         0000146c  ffffff000008c000  000000000008c000  0001c000  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .rodata       00000130  ffffff0000090000  0000000000090000  00020000  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .bss          00008000  ffffff0000090130  0000000000090130  00020130  2**4
                  ALLOC
  4 .comment      00000032  0000000000000000  0000000000000000  00020130  2**0
                  CONTENTS, READONLY

二、全局变量
2.1 这里经验证,初始化过的全部变量,保存在.date段(这个没输出,是把int a[64] = {1}的全局变量给masked);
2.2 未初始化过的(int a[64] = {1}/ int a[64];)保存在.bss段;
2.3 静态全局变量,这个实验验证不成功,经理论推算,这个存储在静态存储区,那必然是在.bss或者.data段。而不是在栈或者堆上这些动态存储区;
三、补充说明下 VMA和LMA的问题
VMA:虚拟内存地址,一般是SDRAM/DDR这种,经物理地址TLB的虚拟地址;
LMA:加载内存地址,一般程序加载到哪里就在哪里运行,即VMA=LMA。但是对于嵌入式,也有可能是LMA是 nor flash(ROM)等内存设备地址。
所以,最终可能需要从flash对应的加载地址搬运到SDRAM/DDR对应的虚拟地址空间运行。这就是kernel.img可能烧写在flash中,然后经过【重载】(因为在flash中读取速度要远小于RAM)到SDRAM/DDR中运行

posted @ 2022-02-26 14:11  行者行者行者  阅读(141)  评论(0)    收藏  举报