标准回答
32位系统中,虚拟地址空间为 0 ~ 4G,将最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF),供内核使用,称为内核空间,将较低的 3G 字节(从虚拟地址 0x00000000 到 0xBFFFFFFF),供各个进程使用,称为用户空间,虚拟地址空间分布如下图:
-
内核空间
存放内核的代码和数据,所有进程的内核代码段都映射到同样的物理内存,并在内存中持续存在,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。
-
用户空间
用户空间给各个进程使用,也称为使用者空间。用户空间中的代码运行在较低的特权级别上,只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,也不能直接访问内核空间和硬件设备,以及其他一些具体的使用限制。用户空间又大致细分为下列一些空间:
- 栈空间
- 共享区
- 堆空间
- BSS 段(未初始化数据段)
- DATA 段(已初始化数据段)
- TEXT 段(代码段)
- 保留区
延伸阅读
用户空间:
-
栈空间
栈又称堆栈,由编译器自动分配释放,行为类似数据结构中的栈(先进后出)。存储局部变量、函数参数值。栈从高地址向低地址增长,是一块连续的空间。
-
共享区
内存映射以及共享库(动态库)所在的内存。
-
堆空间
堆用于存放进程运行时动态分配的内存段,可动态扩张或缩减。堆从低地址向高地址增长。通过 new() 或者 malloc() 函数可以在堆区开辟空间。
-
BSS 段(未初始化数据段)
BSS(Block Started by Symbol)段中通常存放程序中以下符号:
- 未初始化的全局变量和静态局部变量
- 初始值为 0 的全局变量和静态局部变量(依赖于编译器实现)
-
DATA 段(已初始化数据段)
数据段通常用于存放程序中已初始化且初值不为 0 的全局变量和静态局部变量。
-
TEXT 段(代码段)
代码段也称正文段或文本段,通常用于存放程序执行代码(即CPU执行的机器指令)。
-
保留区
位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。