我是靠谱客的博主 无私红牛,最近开发中收集的这篇文章主要介绍进程的地址空间布局&C++进程内存分区,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(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)

    • 程序代码在内存中的映射,存放函数体的二进制代码。
    • 可执行代码、字符串字面值、只读变量
  • <

最后

以上就是无私红牛为你收集整理的进程的地址空间布局&C++进程内存分区的全部内容,希望文章能够帮你解决进程的地址空间布局&C++进程内存分区所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部