Bootstrap

操作系统虚拟内存,段页式寻址产生原因、实现总结

操作系统虚拟内存

1.为什么需要虚拟内存

需要虚拟内存的原因,即去掉的话会有什么问题(面对什么问题设计的虚拟内存)

  1. 直接使用物理内存的话那物理内存和cpu的寻址必须是一一匹配的(现在中间加一层即可以不许需要一一对应,比如i7使用48位虚拟地址(64位的其他位用来标识其他信息,如内核还有用户程序)和52位物理地址),而且内存是稀缺的,比虚拟内存能表示范围一般要小,可以作为缓存使用
  2. 直接使用多进程可能会映射到同一位置
  3. 不方便管理
总结:

1)简化管理
2)内存保护
3)可以缓存高速访问

2.实现方式比较

了解实现方式,先对应基本的要求:
1)从内存访问保护来说:不内存越界、多进程能同时使用不会冲突
2)性能和管理来说:尽可能使用更小的空间、更快的查询、更方便的管理

了解了基本要求就可以看几种方式:

分段管理

分段是根据段表来进行管理,每个项需要记录三个信息

Col1Col2Col3
段号段长段在主存地址

以上就能看出段的查找,地址在 段主存地址<addr<段主存地址+段长的地址就位于该段。
分段能满足上面基本的需求,但查找时还是稍慢,因为存在比较,优点就是上面要求,缺点会造成外部碎片。

分页管理

分页管理根据页表来进行,主要看48位(按4k分页)

前36位后12位
虚拟页号vpn页内偏移vpo

这样我能也能得到页表的基本寻址方式,首先由虚拟页号作为index找到实际的地址号,页内偏移由于都是由12位表示,所以ppo=vpo。页表也能满足我们的需求,不需要比较效率更好些,缺点就是会出现内部碎片。
由于页表更为普遍,下面专门介绍

3.多级页表

将页表分级,首先能想到搞个和剩余位数一样的最低级页表(2^36-1),很明显存在问题(太多了),根据程序的局部性和使用的页稀疏,那就用索引方式索引这些使用的页,就分为了四级:1.PGD(全局页表目录) 2.PUD(页上级目录) 3.PMT(页中间目录) 4.PTE(页表项)每级占用9位地址,这样就组成了每级512叉的树

4.寻址过程

寻址过程就是通过PGD找到PUD然后通过PUD找到PMD,然后PMD找到PTE,然后利用PTE对应的前36位和偏移地址找到物理地址。上述每级页目录查找分别使用VPN1,VPN2,VPN3和VPN4
在这里插入图片描述

;