Linux 程序分为哪几个段
1. 代码段
代码段也叫文本段,存储的是程序的可执行机器码。它通常是只读的,这样可以防止程序意外地修改自身的指令,从而增强了程序的健壮性。由于代码段是只读的,当有多个进程执行同一个程序时(比如多个用户同时运行 ls
命令),它们可以共享同一个代码段,从而节省内存
2. 数据段
数据段主要用于存储已初始化的全局变量和静态变量。这个段在程序加载到内存时就被分配,并在程序运行期间一直存在。它的内容是可读写的,允许程序修改这些变量的值
例如,在 C 语言中:
int global_var = 10; // 存储在数据段
static int static_var = 20; // 存储在数据段
3. 未初始化数据段
BSS(Block Started by Symbol)段用于存储未初始化的全局变量和静态变量。与数据段不同,这个段在程序加载时并不会占用实际的磁盘空间。操作系统会在程序加载时为其分配内存,并自动将所有值初始化为零。这样做可以节省可执行文件的大小
例如,在 C 语言中:
int uninitialized_global; // 存储在 BSS 段
static int uninitialized_static; // 存储在 BSS 段
4. 堆段
堆段用于动态内存分配。当程序在运行时需要额外内存时(例如,使用 C 语言中的 malloc()
或 C++ 中的 new
),这些内存就会在堆上分配。堆是自下而上增长的,通常由低地址向高地址扩展。程序的生命周期中,堆的大小是可变的
5. 栈段
栈段用于存储局部变量、函数参数和返回地址。它是一种后进先出(LIFO)的数据结构。每次调用函数时,新的栈帧(stack frame)就会被推入栈中,包含了该函数的局部变量和参数。函数调用结束后,该栈帧就会被弹出。栈段是自上而下增长的,通常由高地址向低地址扩展
6. 命令行参数和环境变量段
这个段通常位于栈段的上方,用于存储传递给程序的命令行参数和环境变量。例如,当你在终端运行 ls -l
时,-l
这个参数就会被存储在这个段中