可执行文件的角度看变量存储空间
一、可执行文件及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中运行

浙公网安备 33010602011771号