说一说虚拟地址空间有哪些部分

标准回答

32位系统中,虚拟地址空间为 0 ~ 4G,将最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF),供内核使用,称为内核空间,将较低的 3G 字节(从虚拟地址 0x00000000 到 0xBFFFFFFF),供各个进程使用,称为用户空间,虚拟地址空间分布如下图:
 

  1. 内核空间

    存放内核的代码和数据,所有进程的内核代码段都映射到同样的物理内存,并在内存中持续存在,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。

  2. 用户空间

    用户空间给各个进程使用,也称为使用者空间。用户空间中的代码运行在较低的特权级别上,只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,也不能直接访问内核空间和硬件设备,以及其他一些具体的使用限制。用户空间又大致细分为下列一些空间:

    • 栈空间
    • 共享区
    • 堆空间
    • BSS 段(未初始化数据段)
    • DATA 段(已初始化数据段)
    • TEXT 段(代码段)
    • 保留区

延伸阅读

用户空间:

  1. 栈空间

    栈又称堆栈,由编译器自动分配释放,行为类似数据结构中的栈(先进后出)。存储局部变量、函数参数值。栈从高地址向低地址增长,是一块连续的空间。

  2. 共享区

    内存映射以及共享库(动态库)所在的内存。

  3. 堆空间

    堆用于存放进程运行时动态分配的内存段,可动态扩张或缩减。堆从低地址向高地址增长。通过 new() 或者 malloc() 函数可以在堆区开辟空间。

  4. BSS 段(未初始化数据段)

    BSS(Block Started by Symbol)段中通常存放程序中以下符号:

    • 未初始化的全局变量和静态局部变量
    • 初始值为 0 的全局变量和静态局部变量(依赖于编译器实现)
  5. DATA 段(已初始化数据段)

    数据段通常用于存放程序中已初始化且初值不为 0 的全局变量和静态局部变量。

  6. TEXT 段(代码段)

    代码段也称正文段或文本段,通常用于存放程序执行代码(即CPU执行的机器指令)。

  7. 保留区

    位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。

     

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值