虚拟地址空间与内存四区

1、虚拟地址空间

进程在运行过程中,程序内部所有的指令都通过CPU来进行处理的,CPU只进行数据运算并不具备数据存储的能力,其处理的数据都加载自物理内存,那么进程中的数据是如何进行出入到物理内存中?这时候就引入了cpu的内存管理单元MMU(memory management unit),MMU可以将进程的虚拟地址空间映射到实际的物理空间中。通过虚拟地址空间可以让每一个进程都认为自己可以独占系统资源。

虚拟地址空间大小由操作系统决定,32位操作系统的虚拟地址空间大小为2^32字节,也就是4G,64位操作系统的虚拟内存地址空间大小为2^64字节,就是128TB。当我们运行磁盘上一个可执行程序,就可以得到一个进程,内核会给每一个运行的进程创建一块属于自己的虚拟地址空间,并将应用程序数据装载到虚拟地址空间对应的地址上。

下图来源于:虚拟地址空间和物理地址空间_打酱油的;的博客-CSDN博客_虚拟空间和物理空间

从上图可以看出物理地址的一个程序通过MMU内存管理单元映射之后,都拥有了自己独立的进程地址空间。虚拟地址空间充当一个中间层的角色,相当于程序和物理内存之间设置了一个屏障,将两者隔离开。程序中访问的内存地址也不再是物理内存地址,而是一个虚拟内存地址,然后由操作系统将这个虚拟内存地址映射到适当的物理内存地址上

2、内存四区

说内存四区之前,需要先了解下分区的概念。虚拟地址空间主要分为两个部分:内核区和用户区。

内核区:

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

2)内核属于操作系统的一部分

3)系统中所有进程对应的虚拟内存空间的内核区都会映射到同一块物理内存中

用户区:

1)存储用户程序运行中用到的各种数据。

在32位操作系统的虚拟地址空间中,0-3G为用户区,3-4G为内核区,内核区与用户区的比例为1:3。

接下来我们看下内存四区的具体含义,下图来源于:

Linux的虚拟内存空间__每周更新一点点_的博客-CSDN博客_linux系统为每个进程提供()gb的虚拟内存空间

内存四区包括:

1)代码区.text

存放二进制代码,代码区的代码是只读共享的,有利于程序调用执行,并防止修改

2)数据区.bss .data

bss段:存放未初始化的静态变量(全局与局部)以及初始化为0的静态变量(全局、局部)

未初始化的全局变量和初始化为0 的全局变量

未初始化的全局常量

data段:初始化非0的静态变量(全局,局部)

初始化非0的全局变量

rodata段:初始化为0 的全局常量,初始化非0的全局常量

3)堆区heap

堆区的内存是动态的,由程序员进行管理,用malloc或者new来进行申请,delete或者free来进行动态释放。若程序员没有释放,程序结束后由操作系统进行回收。

4)栈区stack

程序运行时,由编译器自动分配内存空间

存放函数的参数值,局部变量,局部常量等

猜你喜欢

转载自blog.csdn.net/qq_58550520/article/details/129063764
今日推荐