This commit is contained in:
author
2025-11-08 21:00:06 +08:00
parent 95a4182500
commit fc176f1b7d
1793 changed files with 2099698 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
### 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` 这个参数就会被存储在这个段中