内存分页,完成虚拟地址的映射。页表与页目录又表示什么?
虚拟地址与物理地址转换
关于虚拟地址和物理地址映射有很多思路,我们可以假设以程序为单位,把一段与程序运行所需要的同等大小的虚拟空间映射到某段物理空间。
例如程序A需要10MB内存,虚拟地址的范围是从0X00000000到0X00A00000,假设他被映射到一段同等大小的物理内存,地址范围从0X00100000到0X00B00000,即从虚拟空间中的每一个字节对应于物理空间中每一个字节。
程序运行时,他们的对应关系如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MH16f32U-1637484409911)(media/16364477508484/1044352233-0.jpg)]
当程序A需要访问0X00001000时,系统会先将这个虚拟地址转换成实际的物理地址0X00101000,访问0X002E0000时,转换成0X003E0000,以此类推。
这种以整个程序为单位的方法很好的解决了不同程序地址不隔离的问题,同时也能在程序中使用固定的地址。
地址隔离
如上图所示,程序A和程序B分别被映射到了两块不同的内存,他们之间没有任何重叠,如果程序A访问的虚拟地址超出了0X00A00000这个范围,系统就会判断这是一个非法的访问,拒绝这个请求,并将这个错误报告给用户,通常的做法就是强制关闭程序。
程序可以使用固定的内存地址
虚拟内存无论被映射到物理内存的哪个区域,对于程序员来说都是透明的,我们不需要关系物理地址的变化,只需要按照从地址0X00000000到0X00A00000来编写程序、放置变量即可,程序不再需要重定位。
内存使用效率问题
以程序为单位对虚拟内存进行映射时,如果物理内存不足,被换入换出到磁盘的是整个程序,这样势必会导致大量的磁盘读写操作,严重影响运行速度,所以这种方法还是显得粗糙,粒度比较大。
内存分页机制
我们知道,当一个程序运行时,在某个时间段内,他只是频繁地用到了一小部分数据,也就是说,程序的很多数据其实在一个时间段内都不会被用到。
以整个程序为单位进行映射,不仅会将暂时用不到的数据从磁盘中读取到内存,也会将过多的数据一次性写入磁盘,这会严重降低程序的运行效率。
现代计算机都使用分页(Paging)的方式对虚拟空间和物理地址空间进行分割和映射,以减小 换入换出的粒度,提高程序运行效率。
分页(Paging)的思想是指把地址空间人为的分成大小相等(并且固定)的若干份,这样的一份称一页,就像一本书由很多页面组成,每个页面大小相等。如此,就能够以页为单位对内存进行换入换出:
- 当程序运行时,只需要将必要的数据从磁盘读取到内存,暂时用不到的数据先留在