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

目录

图示

详解

代码段


备注: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;
}
相关推荐
Rabitebla6 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
西西弗Sisyphus8 小时前
C++ 超时互斥锁(Timed Mutex):std::timed_mutex 与 std::unique_lock
c++
今天要早睡_10 小时前
C++01_入门基础复习
开发语言·c++
Fuyo_111913 小时前
C++ 运行时多态与虚函数机制全面剖析【面试重点】
开发语言·c++·面试
Chen_harmony15 小时前
七、STL与string类
开发语言·c++
xxxiugou12315 小时前
C++命名空间与引用全解析
开发语言·c++
用户76241175670516 小时前
第十五章 人工智能基础
c++
爱写Bug的浮游19 小时前
unique_ptr 零开销的真相与边界
c++·facebook
xiaoye-duck19 小时前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(下):流式响应实现和测试
网络·c++·语言模型·chatgpt
落樱弥城21 小时前
Perf 逐步探查性能缺口并优化
c++·性能优化