欢迎来到天天文库
浏览记录
ID:37501153
大小:217.17 KB
页数:19页
时间:2019-05-24
《x86保护模式基础》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、保护模式基础作者:RobertCollins翻译:colyli我记得当我第一次学习保护模式的时候,我刚刚自学完了汇编语言,于是我就有了一个疯狂的念头——自学保护模式。我买了一本包括保护模式示例的80286汇编语言教材,然后就开始学习了。没过几个小时,我意识到我买的书里没有任何有用的示例,因为书里的例子是介绍如何EPROMCHIPS编程的。因此我将那个误导我买此书的海报痛打了一顿。直到现在,很多年以后,我唯一发现的关于任务切换的示例还是那么的费解和缺少文档说明,虽然我已经无法指出它了。借助IBM技术参考手册和我的那本80286教材,我坐下来尝试着理解保护
2、模式。在3天里花费了大约40个小时之后,我最后从IBM技术参考手册中复制出来一些源代码,能够进入保护模式了,然后我退回了DOS。自从那时起,我学习了很多关于保护模式的知识,以及CPU内部是如何处理它的。我发现CPU内有一系列应用程序不可访问的隐藏寄存器。我也学习了这些寄存器是如何被装载的,他们在内存管理中的角色,以及更重要的,他们的精确内容。虽然这些寄存器对于应用程序是不可访问的,理解他们在内存管理中的角色的知识也可以被应用到实际编程中。在编程中使用这些知识,可以使用更少的数据,更少的代码,更快的速度来达到我们想要的结果。保护模式基础从一个应用的观点来
3、看,保护模式和实模式没有什么太大的区别。都是使用内存段,中断和设备驱动程序去处理硬件。但是有一些细微的区别,使得将DOS应用移植到保护模式下并不是一件琐碎的事情(就是说比较麻烦?)。在实模式中,内存段通过与段寄存器结合起来,使用一种内在机制自动处理。这些段寄存器中的内容构成了CPU当前地址总线上的部分物理地址(参看图1a)。这些物理地址通过段寄存器乘以16得到,然后再加上一个16bit的偏移量。使用16bit偏移量也就暗示了CPU使用的段最大尺寸为64KB。一些程序员通过增加段寄存器中的内容来解决64K段的尺寸限制。他们的程序通过将指向64K段的指针递
4、增16字节的方式来一个段紧接着一个段的方式访问内存。任何在保护模式下使用这种技术访问内存的程序都会产生一个异常错误(CPU产生的异常中断),因为在保护模式下,段寄存器的使用方法是不同的。在保护模式下,内存段被一系列的表定义着(这些表成为描述符表),段寄存器被用来保存指向这些表的指针。每一个表项有8个字节宽,因此在段寄存器中的数值被定义为8的整数倍(如08h,10h,18h等等)。段寄存器中的低3位被定义了,但是由于一些简单的原因,我们说任何加载了内容不是8的倍数的段寄存器的程序,都会引起一个保护错误。有两种表格被用来定义内存段:全局描述符表(Globa
5、lDescriptorTable:GDT),和局部描述符表(LocalDescriptorTable:LDT)。GDT中保存了所有应用程序都可以访问到的段信息,LDT中保存着为某一个特定的任务或者程序指定的段信息。如前所述,段寄存器在保护模式下不够成物理地址的任何一部分,而是被用作指向GDT或者LDT的表项的指针(见图1b)。每一次段寄存器被加载时,基地址从表项中被取出,然后保存在一个内部的、程序员不可见的被称为“段描述符缓冲(segmentdescriptorcache)”的寄存器中。出现在CPU地址总线上的物理地址通过将描述符缓冲中的基址加上32位
6、的偏移量而构成。描述符缓冲寄存器不论是在实模式,或者是在保护模式下,CPU将每一个段的基地址保存在一些叫做描述符缓冲寄存器的隐藏寄存器中。每次CPU加载一个段寄存器,段基地址、段大小限制和访问属性(访问权限)信息也被加载,(或者被缓冲)到这些隐藏的寄存器中。为了提高性能,CPU让之后的内存引用都通过描述符缓冲寄存器来计算,以替代通过查找描述符表来计算物理地址。理解这些隐藏的寄存器的角色和作用,对于采用新的更先进的编程技术和采用未公开的LOADALL指令是非常重要的。图2a展示了80286上描述符缓冲的结构,图2b展示了80386和80486上的描述符缓
7、冲的结构。Figure2(a)80286DescriptorCacheRegister[47..32]31[30..29]28[27..25]24[23..00]16-bitLimitPDPLSTypeA24-bitbaseaddressFigure2(b)80386/80486DescriptorCacheRegister[31..24]23[22..21]20[19..17]161514[13..00]0PDPLSTypeA0D0[63..32]32-bitPhysicalAddress[95..64]32-bitLimit在上电时,描述符缓冲寄存
8、器使用固定的缺省值加载,CPU处于实模式,所有的段都被标记为可读/写的数据段,包括代码段(CS
此文档下载收益归作者所有