专注于操作系统19之走进分页

来源:互联网 发布:java字符串转date类型 编辑:程序博客网 时间:2024/04/29 21:04

      在保护模式下,还提供了分页机制。为什么要分页呢?在开始的分段中,是静态分配的(也就是说段的大小是固定的),这样使内存不能充分利用(因为如果一个小程序放到了一个较大的段中,这样,这个段就有空闲空间,而这个空闲空间又不能被其它程序利用)。后来引入了动态分配(段的大小可以根据程序大小相应的变化),这解决了内存不能充分利用的问题。但在程序结束后,回收内存时,要将空闲内存连起来,这很麻烦。分页可以很好的解决内存充分利用的问题,又不用把空闲内存连起来,并且分页的内存分配更灵活,每一个线性地址对应的页可以对应任意的物理页。

    分页机制中的地址变化是:虚拟地址(48位,由16位的段选择子和32位的段内偏移组成)-->线性地址(32位,通过段选择子得到段的基址再加上段内偏移地址得到)-->物理地址(32位,通过32位的线性地址高20位用于查页目录表和页表找到相应的物理页,得到物理页的首地址,再将这个地址加上线性地址的低12位)。 这里有两个表,页目录表(表项存的是页表的地址),页表(表项存的是物理页的地址)。页目录表的地址存放在CR3中。具体变换可以看下面的图:


    怎么启动分页机制呢?在CR0的最高位PG,如果PG=1则启动分页。分页我们需要做:1.建立页目录表,2.建立页表,3.将页目录表的地址放到CR3中,4.将CR0中的PG置1表示启动分页。

原创粉丝点击