CSapp lab5 MAlloc Lab && CSapp第九章学习 1 更加深入的计算机体系结构学习

  首先,在《高级数据库系统》的实现上实现了一个DBMS的缓冲系统。

  这个缓冲系统其实就是Memory以及Disk之间的读写策略。用户使用一个Page的物理地址来请求一个页。一个Page的大小为4096B。Memory当中有1024个Frame。也就是说,Memory的可用大小为4MB。

  该程序需要缺页处理读命中写命中读缺失写缺失,这是这个模拟器的四大功能。

  如何将page的物理地址定位到Disk当中的Page涉及到文件系统

  这其实虽然是一个数据库的实验,但它更是一个早期的微型计算机的基本模型。

  虚拟内存早在20世纪60年代就出现了,那个时候还没有因为CPU和Memory之间的速度差异产生SRAM组成的Cache。有关Cache我们在前面的Tiling前置知识的回忆——Cache,Memory - TheDa - 博客园 (cnblogs.com)这里已经提到了,Cache和Cpu之间的数据交流基本单位大小是Cache Line,一般为64B也就是512bit,而Memory和Disk之间的数据交流基本单位是4096B的一个Page。

  这篇博客的主要工作,就是基于CSapp的这个实验将这些东西(包括Iinux的进程地址空间管理)统一起来。

 

  我们考虑具有虚拟内存管理技术的一台计算机。

  很重要的一点就是如何实现VA(Virtual Address)到PA(Physical Address)的转变。因为具有虚拟内存管理技术的计算机当中,进程的地址空间使用的地址一定是Virtual Address。

  在CSapp的第九章P568有这样的一张图:

  可以看得出来,通过页表(Page Table)这个工具实现了虚拟地址到物理地址的转换。

  很重要的一点就是,根据虚拟地址,如何确定这个Virtual Address所对应的Page是否在Memory当中呢?(DBMS的实验中是通过对PageNumber做Hash的方法来判断一个Page是否在Memory中的)

  书上写的是,通过Virtual Address映射到Page Table的时候,通过Page Table上的有效位来判断该Page是否在Memory。那么Virtual Address又是怎么映射到Page Table上的呢?

   是通过VPN(Virtual Page Number)虚拟页号来找到PPN(Physical Page Number)物理页号。也就是说虚拟地址有n位,VPN有n-p位,那么页表的大小就是2^(n-p)。也就是说这个页表有这么多的PTE(Page Table Entry)页表条目。

  可以知道,对于虚拟内存地址下的所有页,页表是能够容纳得下所有“虚拟页”的。

  在进一步说明之前,先来再谈一谈什么是虚拟地址虚拟地址感觉可以比喻成磁盘地址。请注意我说的这一句话,它很重要!!虚拟地址可以比喻成磁盘地址。比如说我是程序员,开发了一款叫做刺客信条的游戏,这个游戏有100GB的大小,因此显然我在写游戏程序代码的时候,使用的地址需要能索引这100GB的游戏文件。显然100GB的游戏文件在Disk当中,并且我写代码用的地址是虚拟地址。但是我们知道,代码要加载到内存当中才能使用,但是大多数人的内存比较小,只有8GB或者16GB,那怎么办呢?那么就动态地利用局部性加载这些代码。

  我们将内存按照Page的大小划分成一片一片的区域,如上图,一个区域就是一个页框,总共有2^(m-p)页框(Page Frame)。页框这个名字取的很形象,用来装Page的框框,Page会被拿入或者取出。

  这就是虚拟内存管理的替换算法,以及缺页管理算法

  我们可以假设:一开始页表是空的,Memory也是空的。我们在刺客信条.cpp这个程序当中请求一个虚拟地址,注意我们之前说的,虚拟地址可以比喻成磁盘地址,那么显然一开始发生了缺页(因为页表是空的)。缺页就要从Disk调取缺失的Page。那么我们就需要找到某种方法来找到Disk当中的这个Page。猜测可能可以根据虚拟地址找到。

  找到这个Page之后,Page就会被从Disk调入Memory中的某一个页框。注意CSapp的说法:DRAM是全相联的。所以Page可能被装入任意Frame中。我们知道,Memory就是由DRAM组成的。所以Memory中的页框没有装满还好,装满了就要考虑替换算法的事情了。

  不论页面是装入空闲页框,还是替换装入,装入的Page就会因为页框获得一个物理地址

  所以说,物理地址和磁盘地址其实没有什么卵关系。物理地址更适合被叫做内存地址

  所以说问题就来了:VPN和PPN的这种映射关系是怎么建立的?更具体的说,页表是怎么建立和修改的(猜测是虚拟地址访问页表发生缺失时,将Page从Disk写回并装入Frame之后修改的)?还有虚拟地址到底和磁盘地址有什么关系?也就是缺页时如何在Disk当中找到缺失的页

  QQQQQQQQQQQQQQ注意以上问题!!!!!!!!!!!!!!!!

  接着分析。

  暂时不考虑这两个问题,来分析相关的硬件处理设备。

  如上图。可以看到MMU是CPU的单元。Memory和Cpu之间也加入了Cache。

  这里回答了上面的问题1:页表怎么建立和修改

 

 

  从CSapp当中的权威说明,可以了解到:调入Disk中的Page是由缺页处理程序完成的。页表的页表项PTE就是在上面的第六步被更新的。

  所以说,问题就来到了,缺页处理程序如何定位Disk当中的缺失页的位置

  QQQQQQQQQQQQQQ注意以上问题!!!!!!!!!!!!!!!!

  暂且不谈这个问题,接下来说明Cache在这个过程的工作

  我以前一直觉得使用物理地址来访问Cache是天经地义的,没想到CSapp给出了这样的有趣的观点:

  Cache加速地址转换的思路就是这样:CPU将虚拟地址转换为物理地址,必须经过一次Memory的读写,即将Memory中的页表中的PTE读回CPU中的MMU进行处理

  Cache干的就是适配现代Cpu与Memory读写速度差异的活。

  

  这是一个粗糙的模型。

  因为Cache由很多个,我们把完成这项工作的Cache独立出来,叫做TLB。注意,数据cache作用在PA得到之后!!具体看下面Core i7的例子。

  

  再来谈谈多级页表的问题。显然单独设置一个全相联的一级页表实在太大了。参照前面对于页表大小的分析。

 

  单独一级页表有2^(n-p)个页表项(页表基地址在寄存器里),那么这里的一级页表有2^(VPN1)个页表项,页表项内容是对应的二级页表的基地址。依次类推。

  显然,最后一级页表的页表项是页框号

  下面举Core i7的例子。

  可以看到,数据Cache作用在PA得到之后。这样我们就把所有东西串起来了。

  CSapp还对页表更新作了更详细的说明:

  只是问题还没有解决。

  进入新的博客CSapp lab5 MAlloc Lab && CSapp第九章学习 2 Linux虚拟内存系统与Linux进程虚拟地址空间 - TheDa - 博客园 (cnblogs.com)解决。

  

posted @ 2021-12-24 13:40  TheDa  阅读(375)  评论(0编辑  收藏  举报