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)解决。