虚拟存储器

 

物理和虚拟寻址:

 计算机系统的主存被描述成一个有M个连续的字节大小的单元组成的数组,每一个单元都有一个唯一的物理地址

 

  虚拟存储器_第1张图片     虚拟存储器_第2张图片

       使用虚拟地址寻址时,cpu通过生成一个虚拟地址空间来访问主存,这个虚拟地址空间在被送到存储器之前转换为适当的物理地址。将虚拟地址转换为物理地址的任务叫做地址翻译,地址翻译需要cpu和操作系统的紧密合作。cpu芯片上叫做存储器管理单元的的专用硬件(MMU),利用存放在主存的查询表来动态的翻译虚拟地址内容,该表的内容是由操作系统管理的。

 虚拟存储器:

1.从概念而言,虚拟存储器被组织为一个又存放在磁盘上的N个连续字节大小的单元组成的数组。每一个字节都一个唯一的虚拟地址,这个唯一的虚拟地址是作为到数组的索引的。磁盘上的内容被缓存到主存当中。和存储器此次结构中其他缓存一样。虚拟存储系统(VM)将虚拟存储器分割为虚拟页(VP)大小的固定的块来处理问题。物理存储器被分割为物理页(PP),物理页也叫页帧。

2.在任意时刻虚拟页面的集合分为三个不相交的子集:

  • 虚拟存储器_第3张图片未分配的·:VM系统还未分配(创建的)页。未分配的块没有任何数据和它们相关联,因此就不占用任何磁盘空间

 

  • 缓存的:当前缓存在物理存储器中已分配的页

 

  • 未缓存的:没有缓存在物理内存中的已分配的页

 

缓存组织结构:

SRAM:静态随机存储器,用术语SRAM缓存来表示CPU和主存之间的L1,L2,L3,高速缓存。

DRAM:动态随机存储器,用术语DRAM缓存表示虚拟存储器系统的缓存,它在主存中缓存虚拟页。

访问速度:SRAM>DRAM>>主存。

页表

虚拟存储器_第4张图片

注:PTE:页表条目

页命中

  • 虚拟存储器_第5张图片如图所示vp2已经被缓存在了DRAM当中,那么地址翻译硬件会将虚拟地址作为一个索引来定位PTE2,并在存储器中读取它,因为设置了有效位,那么地址翻译硬件就知道VP2被缓存在存储器当中了。所以它使用PTE中的物理存储器地址构造出这个字的物理地址。

 

 

 

   

缺页:

虚拟存储器_第6张图片虚拟存储器_第7张图片

分配页面

例如在调用malloc之后,通过在磁盘上创建空间并更新PTE5,使它指向磁盘上这个新的创建的页面,从而分配VP5。

虚拟存储器_第8张图片

虚拟存储器作为存储器管理工具

  1. 当目前位置我们都假设有一个单独的页表,将一个虚拟地址空间映射到物理地址空间。
  2. 实际上操作系统为每一个进程提供了一个单独的页表,因而也就是一个独立的虚拟地址空间
  3. 也许有人会疑惑那如果虚拟地址空间一样,会不会导致进程混乱?当然不会,因为操作系统会为每一个进程分配单独的页表,即便是是相同的虚拟地址空间也会被映射到不同的物理地址空间
  4. 简化链接:独立的地址空间会允许每一个进程的存储映像使用相同的基本格式,从而不用管实际代码数据存放在什么位置
  5. 简化加载
  6. 简化共享:一般而言操作系统创建页表会将相应的虚拟页映射到不同的物理页面,但是但每个c程序都会调用printf函数,这时操作系统会将不同进程中适当的虚拟页面映射到映射到相同的物理页面。
  7. 简化存储器分配:当程序需要申请额外空间时,操作系统分配一个k连续的虚拟存储器页面,将它们映射到物理存存储器的任意k个物理页面。由于页表的工作方式,操作系统没有必要分配k个连续的物理存储器页面。页面随机地分散在物理存储器当中。

虚拟存储器作为存储器的保护工具

虚拟存储器_第9张图片

  • SUP:超级用户权限
  • READ:是否可读
  • WRITE:是否可写
  • 违反规则出发内核中的异常处理程序,Unix将这种错误报告为  “ 段错误

地址翻译:

通过硬件单元与由操作系统管理的页表共同构建出物理空间地址

使用页表地址翻译:

虚拟存储器_第10张图片

页面命中:

虚拟存储器_第11张图片

页面未命中:

虚拟存储器_第12张图片

利用TLB加速地址翻译

TLB:翻译后备缓冲器

虚拟存储器_第13张图片

二级页表:

虚拟存储器_第14张图片

  • 在一级页表中每一个PTE代表4MB ,如图所示,PTE2~PTE7为空那么白白浪费了空间。
  • 如果片i未分配,那么我们不进行存储
  • 如果片i已经分配那么一级PTE i就指向二级页表的基址
  • 二级页表中的每一个PTE刚好是一个页面的大小 4KB
  • 只要一级页表总是需要在主存当中,虚拟存储系统可以在需要时创建,页面调入,或调出二级页表,这就减少了主存的压力

Linux虚拟存储系统:

  • 虚拟存储器_第15张图片Linux为每一个每一个进程维持了一个单独的虚拟地址空间
  • 内核虚拟存储器的某些区域被映射到所有进程共享的物理页面
  • Linux也将一组连续的虚拟页面(大小等于DRAM的总量)映射到相应的一组连续的的物理页面。

 

 

 

 

 

 

 

 

 

 

Linux虚拟存储区域:

Linux将虚拟存储器组织成一些区域(也叫段的)集合。一个区域就是已经存在着的(已分配)虚拟存储器的连续片(chunk),这些页以某种方式相关联

虚拟存储器_第16张图片

task_struct中的一个条目指向mm_struct,他描述了虚拟存储器的当前状态。我们感兴趣的两个字段是pgd和mmap,其中pdg指向第一级页表的基址,而mmap指向一个vm_area_struct(区域结构的链表),他就将pdg存放在CR3控制寄存器中

Linux缺页异常:

 

  1. 如果虚拟地址没有定义在区域结构当中,那么会触发段错误。标记为  “ 1 ”.
  2. 进程是否有读写,或者执行这个区域内页面的权限,例如内核程序。标记为 “  2 ”.
  3. 内核如果知道 这个缺页是由于合法的虚拟地址进行合法操作造成的,那么它会选择一个牺牲页面,如果这个页面牺牲页面被修改过,那么他将交换出去、换入新的页面并且更行页表。当缺页处理程序返回时,cpu重新启动缺页处理程序这条指令将再次发这和地址给MMU.这次将不会产生缺页中断。

虚拟存储器_第17张图片

 

共享对象:

虚拟存储器_第18张图片

共享对象对于不同进程时可见的。

私有对象对于不同的进程是不可见的。

 

 

 

 

 

 

 

 

你可能感兴趣的:(linux)