在使用的计算机内存(4G)上面用户可以使用的内存只有0~3G,3~4G是系统内核使用的区域。
但是在物理内存上面,任何的区域和位置都是可读可写操作的,假如进程直接访问的是物理内存,那么系统就会存在很大的不安全性。
页表
页表的存在很好的协调了物理内存和虚拟内存,从而很好的提高系统的安全性。
在一个进程里面使用的内存可能是很少的一部分,但是存在的实际内存确实很大的,所以在使用页表的时候可能会映射很小的一部分。
由于每个进程都存在自己的页表数据结构,那么很有可能在相同的虚拟内存上面看到不一样的数据,那时候因为在用户看到的内存地址都是虚拟地址,而数据存储是在物理内存,物理地址的不同则数据就会不同。
多级页表
假如在系统里面,物理内存和虚拟内存是一一对应的,那么在进程空间里面就会存在很多的页表,同时也会占据很多的空间,那么解决这个问题就出现了多级页表。
liunx里面使用的4级页表:
在计算机系统体系结构里面,将页表划分成不同的项,从而不同的项保存地址的不同位。
- cr3里面保存的是进程的PID
地址的翻译过程:
- bit22~bit31作为页目录索引项,在cr3里面找到相应的页目录项
- bit12~bit21作为寻找到的页目录项的页表索引,在页表项里面找到相应的页表
- bit0~bit11作为页表索引项,在页内找到也得偏移量和页得到相应的物理地址
所以在进程进行替换的时候只需要将cr3的指向替换即可