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

目录

图示

详解

代码段


备注: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;
}
相关推荐
橘子真甜~5 分钟前
C/C++ Linux网络编程15 - 网络层IP协议
linux·网络·c++·网络协议·tcp/ip·计算机网络·网络层
asiwxy2 小时前
OpenGL 材质
c++
阿华hhh2 小时前
Linux系统编程(标准io)
linux·开发语言·c++
程序喵大人3 小时前
推荐个 C++ 练习平台
开发语言·c++·工具推荐
fpcc3 小时前
跟我学C++中级篇——std::is_invocable的分析应
c++
Code Slacker5 小时前
LeetCode Hot100 —— 滑动窗口(面试纯背版)(四)
数据结构·c++·算法·leetcode
SHERlocked936 小时前
摄像头 RTSP 流视频多路实时监控解决方案实践
c++·后端·音视频开发
tang&7 小时前
哈希碰撞攻防战:C++闭散列与开散列实现全解析
c++·哈希算法
眠りたいです7 小时前
现代C++:C++11并发支持库
开发语言·c++·多线程·c++11·c++并发支持库