进程的地址空间布局&C++进程内存分区

本文介绍了Linux进程的虚拟地址空间,分为内核空间和用户空间,其中用户空间包含代码段、数据段、BSS段、栈和堆。详细探讨了C++内存的五个分区,强调了动态分配与静态分配的区别,并提到了内存管理中的内存碎片问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space)

🐖在32位模式下它是一个4GB的内存地址块。➡分为内核空间用户空间


Linux的虚拟地址空间范围为0~4G,Linux内核将这4G字节的空间分为两部分,

  • 最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。
  • 而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF)供各个进程使用,称为“用户空间。


在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,而Windows系统为2:2(通过设置Large-Address-Aware Executables标志也可为1:3)。

这并不意味着内核使用那么多物理内存,仅表示它可支配这部分地址空间,根据需要将其映射到物理内存。

虚拟地址通过页表(Page Table)映射到物理内存,页表由操作系统维护并被处理器引用。

内核空间

⭐内核总是驻留在内存中,是操作系统的一部分

内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。

内核空间在页表中拥有较高特权级,因此用户态程序试图访问这些页时会导致一个页错误(page fault)。

🚩在Linux中,内核空间是持续存在的,并且在所有进程中都映射到同样的物理内存。(Linux内核由系统内的所有进程共享)。

img


于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。(实际可支配的只是3G的用户空间)

preview


用户空间

preview

  • 程序代码段(Text)

    • 程序代码在内存中的映射,存放函数体的二进制代码。
    • 可执行代码、字符串字面值、只读变量
  • 初始化过的数据(Data)

    • 在程序<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值