进程虚拟地址空间区域划分

目录

图示

详解

代码段


备注: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;
}
相关推荐
XXYBMOOO4 分钟前
内核驱动开发与用户级驱动开发:深度对比与应用场景解析
linux·c++·驱动开发·嵌入式硬件·fpga开发·硬件工程
SoveTingღ3 小时前
【问题解析】我的客户端与服务器交互无响应了?
服务器·c++·qt·tcp
温宇飞4 小时前
内存异常
c++
挖矿大亨6 小时前
C++中深拷贝与浅拷贝的原理
开发语言·c++·算法
Bruce_kaizy6 小时前
c++图论——生成树之Kruskal&Prim算法
c++·算法·图论
雾岛听蓝7 小时前
C++:模拟实现string类
开发语言·c++
XFF不秃头7 小时前
力扣刷题笔记-合并区间
c++·笔记·算法·leetcode
编程之路,妙趣横生8 小时前
STL(七) unordered_set 与 unordered_map 基本用法 + 模拟实现
c++
寂柒8 小时前
c++--
c++
wregjru8 小时前
【读书笔记】Effective C++ 条款3:尽可能使用const
开发语言·c++