参考博文地址:Linux内存管理1——虚拟内存空间-CSDN博客
-
64位体系结构 Linux 的整个虚拟内存空间的布局:
在 64 位体系下的内核虚拟内存空间与物理内存的映射就变得非常简单,由于虚拟内存空间足够的大,即便是内核要访问全部的物理内存,直接映射就可以了,不在需要用到《7.1.2 ZONE_HIGHMEM 高端内存》小节中介绍的高端内存那种动态映射方式。
-
32 位体系结构 Linux 的整个虚拟内存空间的布局:
1.用户空间内存分区:
- 不可访问的保留区: 0x0000 0000 到 0x0804 8000 这段虚拟内存地址是一段不可访问的保留区,因为在大多数操作系统中,数值比较小的地址通常被认为不是一个合法的地址,这块小地址是不允许访问的。比如在 C 语言中我们通常会将一些无效的指针设置为 NULL,指向这块不允许访问的地址。
- 代码段:在进程运行之前,这些存放在二进制文件中的机器码需要被加载进内存中,而用于存放这些机器码的虚拟内存空间叫做代码段。
- 数据段与BSS段:进程运行需要操作变量:大量的全局变量和静态变量。指定了初始值的全局变量和静态变量在虚拟内存空间中的存储区域我们叫做数据段。没有指定初始值的全局变量和静态变量在虚拟内存空间中的存储区域我们叫做 BSS段,在程序执行前BSS段会被清零,所以未初始化德 全局变量和静态变量的初始值是0。
- 堆:全局变量和静态变量都是在编译期间就确定的。在进程运行期间,有可能会动态申请内存,堆就是用来存放动态申请的内存的。
- 文件映射与匿名映射区:动态链接库中的代码段,数据段,BSS 段,以及通过 mmap 系统调用映射的共享内存区,在虚拟内存空间的存储区域叫做文件映射与匿名映射区。
- 栈:在程序运行的时候总该要调用各种函数,那么该函数对应的局部变量和参数使用栈来存储。
2.内核空间内存分区:
详见已发布的其他博文中的描述。