C++进程虚拟地址空间区域划分(面试常考)

1、进程虚拟地址空间

(1)如图所示

在32位操作系统下

(2)程序运行

  • 首先把可执行文件xxx.exe从磁盘加载到内存中
  • Linux 系统会给当前进程分配一个2^32大小的空间(4G)

注意:每一个进程都有这样一个虚拟地址空间

(3)各区域的意义

  • 受保护的地址段:这一段空间的起始地址是 0X00000000,是不可访问的。
    例如:当我们定义一个字符串 char *p = NULL 时,然后访问字符串p 的时候,就会访问到这一个受保护的区域,导致程序崩溃。因为NULL实际上是0,无疑就会取到 0X00000000的地址

  • 代码段(.text):这一段存放程序的代码

  • 数据段(.data):存放程序中已初始化的全局变量和静态变量的一块内存区域。

  • BSS段(.bss):存放程序未初始化的全局变量和静态变量的一块内存区域。
    注意:全局变量和静态变量初始化为0也属于BSS段,因为未初始化的全局变量和静态变量默认初始化为0。

  • 堆区:存放程序运行过程中动态开辟的内存。堆从低地址往高地址增长。

  • 共享区:存放运行时加载进来的动态链接库。Windows下的.dll文件和Linux下的.so文件。

  • 栈区:存放局部变量,函数参数值。栈从高地址往低地址增长。

  • 命令行参数和环境变量:就是存放命令行参数和环境变量。

(4)补充

每一个进程的用户空间都是私有的,但是内核空间共享的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值