《自己动手写操作系统》 第三章 pmtest6源码解析——开启分页机制
来源:互联网 发布:淘宝卖家开通直播条件 编辑:程序博客网 时间:2024/05/01 18:16
摘要:在pmtest5中,我们已经看到了如何在不同的特权级之间进行跳转。那么,pmtest6中,我们将展示如何开启分页机制。读者需要明白的是,无论是分段还是分页,从本质上所都是通过逻辑来设想,然后辅助硬件设计来实现的。不同的内存单元没有本质上的不同,一眼望去,所有的内存都是一样的。所以,读者在学习这一部分的时候,一定要勤于在纸上画出内存的布局图和不同数据结构之间的转换关系。pmtest5,在pmtest2的基础上修改而来的。一、理论基础
1.分页机制原理:首先,我们需要明白与分页机制有关的物理器件和数据结构:详情请参考:《保护模式及其编程——分页机制》
2.分页机制的数据结构首先,我们要记住,分页机制中有两个重要的表项——页目录表项和页表表项,他们都是4B的,其中有20b的页面地址(对应低12b的地址为0,所以组成了一共32b地址)组成如下:
因此,为了方便编程,我们需要对分页机制中,关于页面属性的部分,设定相关的宏定义: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代码的基础上,我们需要添加两个段pagedir和pagetbl分别用于存储也目录表和页表的信息,并对相应的段进行相关处理。在保护模式下的第一个32b代码段,我们需要开启分页机制,然后在分页机制开启之后,调用显示字符串的命令,从而测试分页机制是否正常运转。三、调试心得1.我们再进行调试的时候,发现无法回到dos下面。在将pe为清零的时候,出错提示:check_CR0(0xe0000010): attempt to set CR0.PG with CR0.PE cleared 答案:mov cr0,ax这句,尝试在pe=0的情况下,设置pg,显然是失败的。因此,书中的代码实际上是不对的,必须先关闭分页机制,然后再关闭分段机制。关于分段和分页机制的开启和关闭机理,可以参考这里:http://blog.csdn.net/trochiluses/article/details/19438837
0 0
- 《自己动手写操作系统》 第三章 pmtest6源码解析——开启分页机制
- 《自己动手写操作系统》之分页机制源码错误(pmtest6/pmtest7/pmtest8)
- 《自己动手写操作系统》源码解析——第三章pmtest5.asm
- <自己动手写操作系统>第三章——pmtest3源码解析:使用LDT
- <自己动手写操作系统>第三章pmtest7源码解析——检测系统内存
- 《自己动手写操作系统》第三章 pmtest9源码解析——中断处理程序
- 《自己动手写操作系统》第三章pmtest2源码解析
- 《自己动手写操作系统》第三章 pmtest4源码解析——利用门调用实现特权级转移
- 《自己动手写操作系统》第三章 pmtest5源码解析——特权级变换与堆栈切换实例详解
- 《自己动手写操作系统》第三章pmtest8源码解析——多任务系统下的地址映射
- 自己动手写操作系统源码剖析——第三章 pmtest4.asm
- 自己动手写操作系统80x86保护模式(4)--分页机制
- 《自己动手写操作系统》第三章 pmtest1——从实模式到保护模式
- [自己动手写操作系统]的学习实践【第三章】
- 《自己动手写操作系统》第三章a/pmtest1.asm
- 写操作系统----4.开启分页
- 自己动手写操作系统——PC Bootstraps
- 《一个操作系统的实现》读书笔记--第三章--分页机制
- DirectX10一向量代数(一)
- 第一个Servlet程序
- 对HelloWrod的认识
- HDOJ - 1004 - Let the Balloon Rise(字符串)
- WMD驱动安装两种方法
- 《自己动手写操作系统》 第三章 pmtest6源码解析——开启分页机制
- ubuntu12.04——温度测量
- 四、Linux常用命令之文件操作篇(cat、more、head、tail、ln、chmod、chown、chgrp、umask)
- 两台电脑共用键盘鼠标
- leetcode Integer to Roman
- Date、Calendar和StringBuffer的综合使用
- Autorelease的疑问
- awk 常用函数!
- winpcap学习(二)