### Linux 程序分为哪几个段

**1. 代码段**

代码段也叫文本段，**存储的是程序的可执行机器码**。它通常是只读的，这样可以防止程序意外地修改自身的指令，从而增强了程序的健壮性。由于代码段是只读的，当有多个进程执行同一个程序时（比如多个用户同时运行 `ls` 命令），它们可以共享同一个代码段，从而节省内存

**2. 数据段**

数据段主要用于**存储已初始化的全局变量和静态变量**。这个段在程序加载到内存时就被分配，并在程序运行期间一直存在。它的内容是可读写的，允许程序修改这些变量的值

例如，在 C 语言中：

```c
int global_var = 10; // 存储在数据段
static int static_var = 20; // 存储在数据段
```

**3. 未初始化数据段**

BSS（Block Started by Symbol）段用于**存储未初始化的全局变量和静态变量**。与数据段不同，这个段在程序加载时并不会占用实际的磁盘空间。操作系统会在程序加载时为其分配内存，并自动将所有值初始化为零。这样做可以节省可执行文件的大小

例如，在 C 语言中：

```C
int uninitialized_global; // 存储在 BSS 段
static int uninitialized_static; // 存储在 BSS 段
```

**4. 堆段**

堆段用于**动态内存分配**。当程序在运行时需要额外内存时（例如，使用 C 语言中的 `malloc()` 或 C++ 中的 `new`），这些内存就会在堆上分配。堆是自下而上增长的，通常由低地址向高地址扩展。程序的生命周期中，堆的大小是可变的

**5. 栈段**

栈段用于**存储局部变量、函数参数和返回地址**。它是一种后进先出（LIFO）的数据结构。每次调用函数时，新的栈帧（stack frame）就会被推入栈中，包含了该函数的局部变量和参数。函数调用结束后，该栈帧就会被弹出。栈段是自上而下增长的，通常由高地址向低地址扩展

**6. 命令行参数和环境变量段**

这个段通常位于栈段的上方，用于**存储传递给程序的命令行参数和环境变量**。例如，当你在终端运行 `ls -l` 时，`-l` 这个参数就会被存储在这个段中