Files
Sec-Interview/Chapter23/23-2.md
T
2025-09-25 04:02:19 +08:00

39 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### Linux 程序分为哪几个段
**1. 代码段**
代码段也叫文本段,**存储的是程序的可执行机器码**。它通常是只读的,这样可以防止程序意外地修改自身的指令,从而增强了程序的健壮性。由于代码段是只读的,当有多个进程执行同一个程序时(比如多个用户同时运行 `ls` 命令),它们可以共享同一个代码段,从而节省内存
**2. 数据段**
数据段主要用于**存储已初始化的全局变量和静态变量**。这个段在程序加载到内存时就被分配,并在程序运行期间一直存在。它的内容是可读写的,允许程序修改这些变量的值
例如,在 C 语言中:
```c
int global_var = 10; // 存储在数据段
static int static_var = 20; // 存储在数据段
```
**3. 未初始化数据段**
BSSBlock 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` 这个参数就会被存储在这个段中