一. 概述
在长期计算机科学的发展中,程序在内存分区已经形成固定的布局。无论是在 Linux/Unix 下的应用程序,还是 Windows 下的程序,甚至是在没有操作系统下的底层程序,如 bootloader,以及 ARM 中单纯的 C 程序,它们都按大致固定的段来进行布局。其他的开发语言,如 Java 也采用同样的布局方式。
二. 保存时的分段(可执行程序段的分配)
- 代码段(Text Segment):存放 CPU 执行的机器指令(machine instructions),也就是程序代码编译后的机器代码。在内存中,这一段是只读的。所有可执行代码都会被编译到可执行段中。
- 初始化数据段/数据段(Initialized Data Segment/Data Segment):存放静态初始化的数据,即有初始值的全局变量和 static 变量。数据将在此段中展开。
- 未初始化数据段/bss段(Block Started by Symbol):存放未初始化的全局变量和 static 变量。在程序载入时由内核清0,所有未初始化的全局变量(包括静态&非静态)均保存在这个段中,实际上保存的是变量的标识符和大小。
注意:在可执行程序段中没有局部变量的空间,因为它们要在程序执行时,在进程的空间中的 Stack 区动态地被创建。