《自己动手写操作系统》 第三章 pmtest6源码解析——开启分页机制

摘要:在pmtest5中,我们已经看到了如何在不同的特权级之间进行跳转。那么,pmtest6中,我们将展示如何开启分页机制。读者需要明白的是,无论是分段还是分页,从本质上所都是通过逻辑来设想,然后辅助硬件设计来实现的。不同的内存单元没有本质上的不同,一眼望去,所有的内存都是一样的。所以,读者在学习这一部分的时候,一定要勤于在纸上画出内存的布局图和不同数据结构之间的转换关系。pmtest5,在pmtest2的基础上修改而来的。

一、理论基础

1.分页机制原理: 首先,我们需要明白与分页机制有关的物理器件和数据结构:详情请参考:《保护模式及其编程——分页机制》

2.分页机制的数据结构 首先,我们要记住,分页机制中有两个重要的表项——页目录表项和页表表项,他们都是4B的,其中有20b的页面地址(对应低12b的地址为0,所以组成了一共32b地址)组成如下:

《自己动手写操作系统》 第三章 pmtest6源码解析——开启分页机制_第1张图片
因此,为了方便编程,我们需要对分页机制中,关于页面属性的部分,设定相关的宏定义:
254 PG_P        EQU 1   ; 页存在属性位
255 PG_RWR      EQU 0   ; R/W 属性位值, 读/执行
256 PG_RWW      EQU 2   ; R/W 属性位值, 读/写/执行
257 PG_USS      EQU 0   ; U/S 属性位值, 系统级
258 PG_USU      EQU 4   ; U/S 属性位值, 用户级

3.内存布局原理:在本节中,我们采用F(x)=x的线性地址和物理地址的映射模式。如下图:



二、代码分析 
1.段分析:

我们来开启分页机制,然后在分页机制下访问内存变量。为此,pmtest2代码的基础上,我们需要添加两个段pagedirpagetbl分别用于存储也目录表和页表的信息,并对相应的段进行相关处理。

在保护模式下的第一个32b代码段,我们需要开启分页机制,然后在分页机制开启之后,调用显示字符串的命令,从而测试分页机制是否正常运转。

三、调试心得

1.我们再进行调试的时候,发现无法回到dos下面。在将pe为清零的时候,出错提示:
check_CR0(0xe0000010): attempt to set CR0.PG with CR0.PE cleared 
答案:mov cr0ax这句,尝试在pe=0的情况下,设置pg,显然是失败的。
因此,书中的代码实际上是不对的,必须先关闭分页机制,然后再关闭分段机制。
关于分段和分页机制的开启和关闭机理,可以参考这里:http://blog.csdn.net/trochiluses/article/details/19438837

你可能感兴趣的:(自己动手写操作系统,分页机制)