进程的家园:探索 Linux 地址空间的奥秘
个人主页:chian-ocean
文章专栏-Linux
前言:
进程地址空间是操作系统为每个进程提供的一块独立的虚拟内存空间。每个进程的地址空间是独立的,确保了一个进程的运行不会直接影响其他进程的内存空间。
进程地址空间
进程地址空间是操作系统为每个进程分配的一块独立的、连续的虚拟内存地址范围。每个进程在运行时使用自己的地址空间来管理程序的代码、数据、堆栈等内存部分。通过这种机制,操作系统实现了进程之间的内存隔离和资源保护。
核心概念
- 虚拟内存:
- 进程地址空间基于虚拟内存机制实现。虚拟内存是操作系统为每个进程提供的一个逻辑内存空间,独立于实际的物理内存。
- 进程访问的地址是虚拟地址,通过内存管理单元(MMU)和操作系统,将虚拟地址映射到物理内存。
- 独立性:
- 每个进程有独立的地址空间,一个进程无法直接访问另一个进程的地址空间。
- 即使多个进程使用相同的虚拟地址,这些地址也映射到不同的物理内存区域。
- 按需分配:
- 地址空间中的很多部分在进程运行时按需分配,比如堆空间和栈空间,操作系统动态管理这些区域。
- 分段和分页:
- 地址空间被划分为不同的段(如代码段、数据段、堆和栈)。
- 使用分页机制,将这些段划分为固定大小的页,以便更高效地管理内存。
进程地址空间的组成
进程地址空间的组成通常包括以下部分:
- 代码段(Text Segment):存放程序的可执行代码(指令),通常只读。
- 数据段(Data Segment):存放已初始化的全局变量和静态变量。
- BSS段(Block Started by Symbol):存放未初始化的全局变量和静态变量,默认初始化为 0。
- 堆(Heap):用于动态分配内存(如
malloc
或new
),从低地址向高地址增长。 - 栈(Stack):存放函数调用信息(如局部变量、函数参数和返回地址),从高地址向低地址增长。
- 共享库(Shared Libraries):动态链接库(如
.so
或.dll
文件)的加载区域。 - 内核空间(Kernel Space):保留给操作系统内核使用,用户进程无法直接访问。
#include
#include
int g_val_1;
int g_val_2 = 20;
int main