计算机组成与设计-虚拟内存

虚拟内存

写在前面

本来不打算虚拟内存这一小节的,打算写深入理解计算机系统一书的笔记的时候在进行介绍(在CSAPP书的第九章),但是昨天在看MIT 6.S081的时候发现虚拟内存在操作系统中也是比较重要的一个概念,所以我决定今天就把虚拟内存简单的概括一下,当做第五章的补充。

虚拟内存我目前的感觉是和操作系统和计算机组成原理都有一定的关系,虚拟内存事实上在硬件的结构中就已经实现了,在处理器中就有专门处理虚拟内存的一小部分。在操作系统的视角中,操作系统实际上给每个进程都提供了完全独立的内存空间,类似于专门的一个区域,这使得每个进程之间都实现了相互独立。虚拟内存会通过某种方式映射到真实的物理内存上,不过这属于内核的操作权限,对程序员实际上是屏蔽的。也就是说,我们实际上以为的内存实际上是抽象出来的虚拟内存,并非真实的物理内存,因为直接操作硬件的安全风险极大。

虚拟内存的基本概念

我们为了实现在多个进程(在原书中,此处是虚拟机,由于我并没有介绍虚拟机的概念,而虚拟机又属于进程的范畴,所以我用进程来替换,在此后的同样问题中不做叙述)之间安全而有效的共用一个存储器,引入了虚拟内存的概念。

在进程的运行过程中,我们希望进程只能访问属于自己的内存区域,即将每个程序都编译到它自己的地址空间。虚拟存储器会实现程序虚拟地址空间到物理地址的转换。这种地址转换的方式会加强每个程序地址空间之间的保护。

保护就是将各个程序隔离开来,防止程序之间有意或无意读取不属于自己的内存空间,导致异常的发生。

虚拟存储器和cache的工作原理是一样的,但是一些概念与cache不同。在虚拟存储器中块被称为页,访问缺失(不命中)被称为缺页。

在虚拟存储器中,处理器产生虚拟地址,再结合软硬件转为一个物理地址,就可以访问内存中的空间的对应位置。这个过程就被称为一种映射(地址映射或地址转换)。

计算机组成与设计-虚拟内存

实际上,映射既可以一对一,也可以一对多。我们接下来引入重定位的概念。

重定位用来简化执行时的程序加载过程。在程序地址访存之前,重定位将程序需要使用的虚拟内存映射到不同的物理地址。

在虚拟内存中,地址被划分为虚页号和页偏移。而虚页号需要转换为物理页号。物理页号构成了物理地址的高位,而页偏移是不需要改变的,构成物理地址的低位部分。页偏移的位数决定了页的大小。需要注意的是,虚拟内存可以寻址的页数与物理内存可以寻址的页数不一定是相同的。

计算机组成与设计-虚拟内存

虚拟内存中的存放和查找

就像寻找图书那样,我们不能在整座图书馆中寻找我们想要阅读的书籍。同样,我们需要引入一个东西来帮助我们更加高效的进行查询。在虚拟内存中,我们使用一个索引存储器的表来定位页,被称为页表。它被存放在存储器中,页表使用虚拟地址中的页号来索引,对应找到相应的物理页号。每个程序的页表都是不同的,用来将程序的虚拟地址映射到内存上(物理内存)。在硬件设计中,存在一个指向页表首地址的寄存器,称为页表寄存器。

计算机组成与设计-虚拟内存

缺页处理

当发生缺页时(有效位为0),就会发生缺页故障,这时控制权交给操作系统,控制的转移由异常处理机制完成。与cache的处理机制相同,必须在下一级存储器层次找到该页,并将它放到主存中。虚拟内存不会马上告诉我们页在磁盘中的位置,所以在创建进程的时候会在闪存或磁盘上为进程中所有的页创建空间。这一空间被称为交换区。

同样也会创建一个数据结构来记录每个虚拟页在磁盘上的具体位置。

计算机组成与设计-虚拟内存

替换的时候,我们如果还是要使用LRU算法的话(之前在cache技术中提到),代价会十分的高,因为每次访问都需要更新数据结构。所以计算机提供了一个引用位,当一页被访问时该位置被设为1。操作系统会定期将引用位清零然后重新记录。

TLB

我们的页表存放在内存中,因此程序每次访问内存至少需要两次:

  1. 第一次先获得物理地址
  2. 第二次才获得数据

因此现代处理器都包含一个特殊的cache用来跟踪最近使用过的地址变换。这个特殊的地址转换cache被称为快表(TLB),TLB就像一些特别方便的小纸条,可以帮助我们快速定位目标的位置。

计算机组成与设计-虚拟内存

TLB的每个标记存放虚页号的一部分,每个数据项中存放了物理页号。

每次访问,我们都要在TLB中查找页号。如果命中,物理页号就用来形成地址,相应的引用位设为1.如果处理器执行的是写操作,脏位同样要被设为1。如果TLB发生缺失,那么我们就必须判断是仅仅TLB发生了缺失还是缺页。如果仅仅是TLB缺失,那么就重新加载。如果是缺页,就交由异常机制处理。

计算机组成与设计-虚拟内存

对于写请求,如果访问位是关闭的,那就不能进行访问。如果程序试图进行写操作,则会发生异常。

有关虚拟内存的大致知识就这么多,后续在操作系统和CSAPP中可能还会对虚拟内存作出讨论和更进一步的解释,到时候我会重新叙述。本人水平有限,目前只读了计算机组成原理,对虚拟内存的了解肯定很浅薄,如果有什么更好的对虚拟内存了解的知识,可以与我分享,共同进步。

这篇是匆忙赶出来的~

上一篇:LINUX学习


下一篇:《操作系统概念精要》之内存篇(二)-分段-分页