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

目录

图示

详解

代码段


备注: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;
}
相关推荐
linweidong4 小时前
C++ 模块化编程(Modules)在大规模系统中的实践难点?
linux·前端·c++
半桔9 小时前
【IO多路转接】高并发服务器实战:Reactor 框架与 Epoll 机制的封装与设计逻辑
linux·运维·服务器·c++·io
HABuo9 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
我在人间贩卖青春10 小时前
C++之多重继承
c++·多重继承
m0_7369191010 小时前
C++代码风格检查工具
开发语言·c++·算法
2301_7634724612 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
阿猿收手吧!12 小时前
【C++】std::promise原理与实战解析
c++
m0_7066532313 小时前
分布式系统安全通信
开发语言·c++·算法
Zach_yuan13 小时前
深入浅出 JSONCpp
linux·服务器·网络·c++
寻寻觅觅☆13 小时前
东华OJ-基础题-104-A == B ?(C++)
开发语言·c++