首页 > 其他分享 >虚拟存储

虚拟存储

时间:2022-11-26 20:37:48浏览次数:47  
标签:主存 虚拟存储 访问 地址 页表 进程 页面

虚拟存储

虚拟存储器的基本概念

进程是指一个具有一定独立功能的程序关于某个数据集合的一次运行活动(《计算机系统基础》,袁春风),通俗来讲就是某个程序的一次运行,也叫用户进程。

在一个系统中,进程之间共享CPU和主存等资源,这就会导致很多问题。如果有很多进程,需要很多的内存运行,那么就会导致其中的一些进程无法运行,并且,如果有一个进程不小心修改了其他进程的内存,就会导致无法预测的结果,这也使得内存管理变得困难。

为了解决上面的问题,虚拟内存应运而生。虚拟内存机制:

  1. 将主存看做存放在磁盘的一段地址空间的缓存,在主存上保留活动区域并根据需要在磁盘和主存之间来回传送数据。
  2. 它为每个进程提供了一致的地址空间,从而简化了内存管理。
  3. 它保护了每个进程的地址空间不被其他进程破坏 。

(《CSAPP》)

在采用虚拟存储技术的计算机中,通过存储器管理部件(MMU)将虚拟地址(VA)翻译成物理地址(PA),在地址转换的过程中,由硬件检查是否发生了非法访问。若访存不命中,则由操作系统将磁盘上的数据读到主存上,如果发生越界或者越权(见特权指令),则由操作系统进行异常处理。

下面介绍虚拟内存机制的细节:

虚拟地址空间

每个高级语言源程序经过编译,汇编,链接等处理生成可执行的二进制目标代码时,都被映射到一个统一的虚拟地址空间。统一指的是:虚拟地址空间的大小以及区域划分的结构都是相同的。

虚拟地址空间分为两大部分:内核虚拟存储空间以及用户虚拟存储空间,简称虚拟空间和用户空间。

内核空间在0xc0000000以上的高端地址上,用来存放操作系统的内核代码以及数据,用户程序没有权限访问内核区。

用户空间用来存放进程的代码和数据,分为以下几个部分:


动态区

  1. 用户栈:用来存放程序运行时过程调用的参数,局部变量,返回地址等(栈帧),向低地址增长。
  2. 共享库:用来存放公共的共享函数库代码(见动态链接)。
  3. 堆:用以动态申请存储区,向高地址增长。

静态区

  1. 可读写数据区:存放静态全局变量,堆区从该区域结尾向高地址增长。
  2. 只读数据和代码区:存放进程中的代码和只读数据。

在用户空间中,每个区域都有各自的其实位置,用户栈从0xc0000000向低地址增长,共享库从0x40000000向高地址增长,堆区与栈相向增长,合称堆栈。只读数据和代码区从0x08048000向高地址增长。这样的模型使内存管理变得简单,结构和大小的一致性也简化了链接器的设计,简化了程序加载的过程。

虚拟存储器的实现

主存可以看做硬盘存储器的缓存,可分为下面三种类型:

1. 分页式虚拟存储器

在分页式虚拟存储空间中,虚拟地址空间被划分为大小想等的页面,硬盘和主存之间以页面作为交换单位,虚拟地址空间中的页面称为虚拟页(VP),主存空间也被划分为同样大小的页面,称为物理页(PP)。

虚拟存储管理采用页面请求思想,每次需要访问指令或者数据时,只把需要的页面调入主存中,不活跃页面留在磁盘中。当某个被访问的页面不在主存中时,发生页面缺失,此时从硬盘将相应页面调入主存中。

相较与cache不命中,处理缺页时从硬盘中读写一个数据需要消耗很多的时间,为了减少不命中产生的高额代价,采用可以提高命中率的全相连映射规则,并且采用写回法(见cache)。

与cache一样,需要有一种方式建立虚拟页与物理页或者磁盘位置之间的关系,通常采用页表

进程中每个虚拟页都在页表中有一个表项,表项中记录了该虚拟页的许多信息:

  1. 装入位和存放位置:用以表示该页面是否装入主存。如果装入位为1,说明该虚拟页有与之关联的内容,并且已经装入主存,称这样的页面为缓存页,存放位置指向相应的物理页。如果为0,再看存放位置,如果存放位置为空(NULL),说明这个页面没有与之关联的内容,是一个未分配页,否则,存放位置指向磁盘位置。
  2. 修改位:也叫脏位(见cache),表示该页面是否被修改,在写回法中用以判断是否需要修改磁盘内容。
  3. 使用位:描述了该页面的使用情况,用以配合相应的替换算法淘汰页面,也叫替换控制位。
  4. 访问权限位:用以标记该页面的访问权限(只读,读写等)。
  5. 禁止缓存位:标记某一个位是否可以装入cache,用以解决一致性问题。

发生缺页时,会调用缺页异常处理程序根据表项对应的存放位置,从磁盘中将相应的页面取出,装入主存中,如果没有空闲的物理页,则需要根据替换算法挑选一个物理页淘汰,并且由于采用的是写回法,此时需要判断是否要修改磁盘上的数据。

页表属于进程控制信息,存储在虚拟地址空间的内核空间,页表在主存的首地址的位置记录在页表基址寄存器上。页表的规模可能很大,都存放在主存中是不合理的,可以采用多级页表等方法(操作系统具体实现)。


地址转换工作由CPU中的存储器管理部件完成(MMU,见cache),虚拟地址分为两个字段,高位为虚拟页号,低位为页内偏移地址(简称页内地址),在一次访问中,先根据页表基址寄存器找到页表起始位置,再根据虚拟地址找到相应的表项,如果装入位为1,则根据物理页地址找到相应的物理页,根据页内地址取出相应的数据,否则交给缺页异常处理程序处理缺页异常。


访存时,首先要访问主存中的页表,从页表中获取相应的物理地址,再根据物理地址再次访问主存,在这个过程中,访存次数过多,为了减少访存此时,将页表中的几个表项复制到告诉缓存中,这种缓存称为高速转换缓冲器,也叫快表。访存时,首先从快表中查找,不命中,则再访问主存,减少了访存的次数。

快表大多采用全相连或者组相连,每个快表表项中会加上一个TLB标记字段,用以区分该表项缓存的是页表中的哪一项。在全相连下,TLB标记字段对应虚拟页号,组相连下对应虚拟页号的高位字段,低位字段称为TLB组索引,用来标记组号。

2. 分段式虚拟存储器

程序具有模块化的性质,可以根据逻辑结构划分成多个相对独立的部分,这些部分被称为段,段之间相连形成大规模的程序。分段方式下,每个段的信息记录在段表中,由于段是不定长的,因此段表项中记录了段长,同时也记录了段的位置,访问权限等信息。

分段式虚拟存储器下,虚拟地址被分为了段号以及段内地址,通过段号定位段表项,并通过段表项中的段首址以及段内地址信息得到相应的物理地址。

3. 段页式虚拟存储器

分页式和分段式虚拟存储器各有优缺点,结合两者可以得到段页式虚拟存储器。段页式虚拟存储器中,程序分段,段内分页,用段表和页表进行二级定位。

存储保护

主存被多道进程共享,为了避免一个错误的进程修改其他的进程,需要对进程进行存储保护。为了支撑存储保护,硬件需要有一下功能:

  1. 至少支持两种特权模式(内核模式,用户模式)
  2. 两种特权模式之间可以互相转换。用户进程需要通过系统调用接口间接访问内核数据或代码(自陷指令),也可以通过返回指令返回用户模式。
  3. 部分CPU状态只能由内核程序修改,用户进程只能读不能写。

存储保护包括两种情况:

访问权限保护:

访问权限保护就是看是否发生了访问越权。如果实际操作与访问权限不符,则会发生存储保护错。一般规定:程序对本程序所在的存储区可读可写,对已获权的存储区只读,对未获权的存储区不可读不可写。

存储区域保护:

  1. 加界重定位:对每个程序或程序段记录起始地址和终止地址,对虚拟地址加界后得到物理地址,如果物理地址超出了界,就发生地址越界。
  2. 键保护:为每个页分配一个键,每个用户进程分配一个键,只有当进程和页的键对上了,才能进行访问。如果需要让某个进程可以访问所有页面,可以让键不为0时进行核对,否则不核对,这样,让内核进程的键为0,就可以达到相应的效果。
  3. 环保护:将主存中的个进程分为多个保护级,构成同心环,越靠里的环权限越高,内核进程为与最内层,环号最小,权限最高。内层的环上的进程可以访问外层以及同层环上的进程,而外环则不能访问内环进程地址空间。

标签:主存,虚拟存储,访问,地址,页表,进程,页面
From: https://www.cnblogs.com/5yi33/p/16928223.html

相关文章

  • 虚拟存储器
    第六周虚拟存储器第六周虚拟存储器引言第1讲 分页存储管理的基本概念第2讲 虚拟存储器及虚拟地址空间第3讲 分页存储管理的实现第4讲 存储器层次结构及其访......
  • #yyds干货盘点# 虚拟存储技术
    在常见的存储管理方案中,必须为每个作业分配足够的空间,以便装入全部信息。当主存空间不能满足作业要求时,作业便无法装入主存执行,此时就可以使用虚拟存储技术。如果一个作业的......
  • 虚拟存储器
    虚地址空间:也称虚拟存储空间或虚拟存储器空间,它是应用程序员用来编写程序的地址空间,这个地址空间非常大。对应于虚拟地址(虚地址)主存储器的地址空间:也称主存地址空间、......