以32位linux进程为例

当进程被操作系统加载时,操作系统会给该进程提供一块 0x00000000~0xFFFFFFFF 共4G大小的虚拟内存地址空间

  • 0x00000000~0xFFFFFFFF
    • 0x00000000~0xC0000000 : 用户空间
      • 0x00000000~0x08048000 : 预留空间(不允许访问)
      • .text .rodata : 代码段和只读数据区
      • .data : 数据段,存储已初始化且不为0的变量
      • .bss : 未初始化+已初始化为0的变量
      • .heap : 堆区
      • 共享库 : 加载.so的地方
      • .stack: 栈区
      • : 命令行参数和环境变量
    • 0xC0000000~0xFFFFFFFF : 内核空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int gdata1 = 10;
int gdata2 = 0;
int gdata3;

static int gdata4 = 10;
static int gdata5 = 0;
static int gdata6;

int main() {
int a = 12;
int b = 0;
int c;

static int e = 12;
static int f = 0;
static int g;

return 0;
}

其中 gdata1 gdata4 e 存储在.data

gdata2 gdata3 gdata5 gdata6 f g 存储在.bss

a b c 为指令存储在.text, 运行时申请内存在.stack