目录
备注:x86 32位linux环境下,进程虚拟地址空间区域划分
图示
详解
用户空间
用于存储用户进程代码和数据,只能由用户进程访问
内核空间
用于存储操作系统内核代码和数据,只能由操作系统内核访问
text
text也称为只读代码段,用于存放程序的机器指令
这个区域通常是只读的,以防止程序修改自身的指令
rodata
rodata区域是只读数据区域(read-only data segment)的简称
在程序运行时,该区域存储只读的常量数据,如字符串常量和全局常量变量
这些数据在程序运行期间不可被修改
data
data也称为已初始化数据段,用于存放已经初始化成非0的全局变量和静态变量
bss
bss是Block Started by Symbol的简称,也称为未初始化数据段
用于存放未初始化的全局变量和静态变量
在程序加载时,bss区域的值会被设置为0
heap
堆区用于动态分配内存,程序员可以根据需要申请和释放内存
malloc()函数分配的内存位于堆区
共享库
用于存放共享库的代码和数据,例如 *.dll *.so
stack
栈采用先进后出的方式进行操作
栈用于函数调用开辟栈帧空间、局部变量的存储
每个函数调用时都会在栈上创建一个新的栈帧,函数返回时将其销毁
代码段
cpp
#include<iostream>
using namespace std;
int gdata1 = 1; // data段
int gdata2 = 0; // bss段
int gdata3; // bss段
static int gdata4 = 2; // data段
static int gdata5 = 0; // bss段
static int gdata6; // bss段
int main()
{
int a = 3;
// mov dword ptr[a], 03h
int b = 0;
int c;
// 以上三行代码在编译后产生的mov指令存放于text段
// 指令运行后需在栈上开辟空间
static int e = 4; // data段
static int f = 0; // bss段
static int g; // bss段
return 0;
}