虚拟内存怎么映射到物理内存(什么是虚拟内存)

一、为什么有虚拟内存?

CPU是直接操作内存的物理地址,同时运行两个程序可能会出现意想不到的结果。程序A在地址2000的位置写入一个新的值,会擦掉程序B存放在相同位置上的内容。所以同时运行多个程序地址空间不隔离存在程序崩溃的风险。因此,有了虚拟内存。每个进程分配独立的一套虚拟地址,互不干涉。(虚拟地址由操作系统负责映射到物理内存)

二、虚拟内存地址与物理内存地址概念解释

操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了。

于是,这里就引出了两种地址的概念:

  • 我们程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address
  • 实际存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)。

操作系统引入了虚拟内存,进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存,如下图所示:

虚拟内存怎么映射到物理内存(什么是虚拟内存)(1)

三、虚拟地址与物理地址之间映射方法

1、内存分段

分段机制就是把虚拟地址空间中的虚拟内存组织成一些长度可变的称为段的内存块单元.逻辑地址包括一个段选择符或一个偏移量,段选择符是一个段的唯一标识,提供了段描述符表,段描述符表指段的大小、访问权限和段的特权级、段类型以及段的第一个字节在线性地址空间中的位置(称为段的基地址)。逻辑地址的偏移量部分 段的基地址就可以定位段中某个字节的位置。因此基地址加上偏移量就形成了处理器线性地址空间中的地址

虚拟内存怎么映射到物理内存(什么是虚拟内存)(2)

2、内存分页

分段的好处就是能产生连续的内存空间,但是会出现内存碎片和内存交换的空间太大的问题。在 Linux 下,每一页的大小默认为 4KB。

虚拟内存怎么映射到物理内存(什么是虚拟内存)(3)

如上图,线性地址的最高10位(位31~22)用作一级表(页目录),有2的10次方个项,这些表项指向对应的二级表。第二级表称为页表(page table),二级页表使用线性地址中间10位(位 21~12)作为表项索引值;简单说,线性地址高10位(31~22)定位目录项,( 21~12)定位页表项 ,页表项存储了基地址,线性地址低12位存储了偏移量, 组合在一起就得到了分页转换过程的输出值,即对应的最终物理地址

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页