为什么我们需要虚拟内存
提供一个虚拟化封装,让上层的程序员不用担心内存分配,物理地址的总大小。同时如果要手动管理内存是一件麻烦的事,比如一个程序读到另一个程序的物理地址,并且也很难保障多个处理器不会同时读取写入同一块物理地址,同时page table上也可以记录下对页的访问权限。
虚拟内存的定义
Give the programmer the illusion of a large address space while having a small physical memory
就是利用小块空间,并且软硬件结合来给程序员一个错觉-----我们有一个大到用不完的空间,并且对每个处理器来说都是这样。
虚拟内存的实现
比如我们有2^31的虚拟地址和2^27的物理地址,然后都有12bit的page offset,也就是4kb一个页
那我们怎么完成这个地址的转换呢?
通过一个page table。
VPN就是page table entris的编号,然后page table entires存了物理地址PPN,然后两个共用一个offset,这样就组成了物理地址,就可以去内存中寻址了。
同时为了确定在不在内存里面,或者还没有分配,多了一个valid bit。
但是这样的话,load和store,已经取instruction都要先到内存里面访问page table然后再访问物理地址。这样就进行了两次内存访问。
所以我们有了TLB(translation lookside buffer)也就是把一部分的page table缓存在cache里面,来加快访问。这样做有可行性------因为pc一般都是+4,而一个page又很大,有4kb,也就是支持1000条取指令。硬件如下。
同时多个processor都独自拥有page table,可以不用担心别的处理器会对其产生影响,也可以通过一些库来共享physical page。Using different page tables for different programs provides memory protection。
软硬件的分工
当page hit的时候,处理器发送地址给MMU,然后MMU到内存或者cache中取物理地址,然后到内存中取数据。
发生了page fault,第四步触发了异常,然后异常处理程序,就从disk取page,然后重新执行。
物理页替换算法
因为如果要严格的LRU的话,要保存全局访问顺序,开销太大。我们就用一个bit来粗劣的估计