微机原理保护模式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微机原理学习报告

——关于INTEL保护模式

张正清082602

一,摘要

本报告的主题为介绍什么是微处理器的保护模式。教材中第一次出现保护模式是在2-3节中,介绍了保护模式的储存器寻址(memory addressing),虽然没有直接介绍什么是保护模式,但却是实现寻址模式不可忽略的问题。除此之外,本报告将主要介绍保护模式的核心:权限级别(Privilege Levels)。包括如何限制对数据的访问(Restricting Access to Data)、控制执行的转移(Control of Execution Transfers)等。另外还有保护模式对多任务机制(Multitasking)的有效支持。

二,正文

1,主要特性

在网上搜索到的对保护模式的介绍中,百度百科的介绍虽然并不是很严谨很有条理,但算是最易懂的一个,所以先借鉴百科中的话来总述一下保护模式的特点:保护模式,(Protected Mode,或有时简写为pmode) 是一种80286 系列和之后的x86 兼容CPU 操作模式。保护模式有一些新的特色,设计用来增强多工和系统稳定度,像是内存保护,分页系统,以及硬件支援的虚拟内存。尽管用软件的方式也有某些可能在真实模式的系统下使用多工,但保护模式下内存保护的特色,可以避免有问题的程序破坏其他工作或是操作系统核心所拥有的内存。保护模式也有中断正在执行程序的硬件支援,可以把execution content 交给其他工作,得以实现先占式多工。

2,存储器寻址

首先从课本上说起。保护模式(PM)与先前的实模式(RM)的一个重要区别就在段地址上。PM下的段地址不再像实模式那样由段寄存器提供,而是在原来放段地址的段寄存器里放一个选择子(selector),来选择描述表内的一个描述符(descriptor),描述符描述了存储器段的位置、长度以及访问权限。

可见,选择子是为描述符服务的,而描述符在存储器中的表现形式为一个描述表,通常分为全局描述表(GDT,Global Descriptor Tables),局部描述表(LDT)。那GDT和LDT 又是为何而设置的呢?

对于段模式来讲,访问一个内存地址仍然使用Segment:Offset的方式,这是很自然的。由于Protected Mode运行在32-bit系统上,那么Segment的两个因素:Base Address和Limit 也都是32位的。另外,Protected Mode,顾名思义,又为段模式提供了保护机制,也就说一个段的描述符需要规定对自身的访问权限(Access)。所以,在Protected Mode下,对一个段的描述则包括3方面因素:[Base Address, Limit, Access],它们加在一起被放在一个64-bit 长的数据结构中,被称为段描述符。这种情况下,如果我们直接通过一个64-bit段描述符来引用一个段的时候,就必须使用一个64-bit长的段积存器装入这个段描述符。但Intel为了保持向后兼容,将段积存器仍然规定为16-bit(尽管每个段积存器事实上有一个64-bit长的不可见部分,但对于程序员来说,段积存器就是16-bit的),那么很明显,我们无法通过16-bit 长度的段积存器来直接引用64-bit的段描述符。

解决的方法就是把这些长度为64-bit的段描述符放入一个数组中,而将段寄存器中的值作为下标索引来间接引用(事实上,是将段寄存器中的高13 -bit的内容作为索引)。这个全局的数组就是GDT。事实上,在GDT中存放的不仅仅是段描述符,还有其它描述符,它们都是64-bit长。GDT可以被放在内存的任何位置,那么当程序员通过段寄存器来引用一个段描述符时,CPU必须知道GDT的入口,也就是基地址放在哪里,所以Intel的设计者门

提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此积存器,从此以后,CPU就根据此积存器中的内容作为GDT的入口来访问GDT了。

GDT是Protected Mode所必须的数据结构,也是唯一的——不应该,也不可能有多个。另外,正像它的名字(Global Descriptor Table)所揭示的,它是全局可见的,对任何一个任务而言都是这样。

除了GDT之外,IA(Intel Architecture)-32还允许程序员构建与GDT类似的数据结构,它们被称作LDT(Local Descriptor Table),但与GDT不同的是,LDT在系统中可以存在多个,并且从LDT的名字可以得知,LDT不是全局可见的,它们只对引用它们的任务可见,每个任务最多可以拥有一个LDT。另外,每一个LDT自身作为一个段存在,它们的段描述符被放在GDT中。

关于选择子(selector):

就如前面提到的,选择子是用来选择描述表内的一个描述符。选择子包括三部分:标志指针(the index),表指示符(table indicator ,TI) 以及权限级别(requester’s privilege level ,RPL). 标志指针告诉我们在描述表中选择那条描述。表指示符告诉我们选择哪个描述表, 当TI=1时,为局部藐视表LDT (TI=1) ,当TI=0时为全局描述表,GDT (TI=0). 而权限级别则将在保护模式的主要保护部分起到关键作用. 下面是一张从段寄存器读取选择子的流图:

3,保护和保护模式

(1)类型检验(Type Checking)

类型检验是用来确保所使用的段是否为所预期的类型。比如在执行一个代码段时,需要保证只读段不能被写入。因此,就需要引入一些简明的规则,这些规则基于描述符中所提供的关于类型的信息。

下面是INTEL 486的参考手册中有关的内容:(由于规则是严谨的,为了以防学生的翻译出现错误,我在后面附上了英文的原版。)

(Microprocessor Programmer’s Reference Manual.)

1,一个描述符的选择子要存入一个段寄存器,条件是该寄存器只能含有与描述符中类型相符的类型。

(When a selector for a descriptor is loaded into a segment register. Certain segment

registers can contain only certain descriptor types.)

例如:

∙ CS寄存器只能由可执行段的选择子来访问。

(The CS register only can be loaded with a selector for an executable segment.)

∙ 可执行段的选择子(不可见的)不能存入数据段的寄存器。[DS,ES FS,GS]

(Selectors of executable [code] segments which are not readable cannot be loaded

into data-segment registers [DS, ES, FS, GS].)

∙ 只有可写的数据段选择子能够存入SS寄存器。

(Only selectors of a writable data segment can be loaded into the SS register.)2. 一个种类的段只能被相应的预先定义的指令所使用。

(Certain segments can be used by instructions only in certain predefined ways)

例如:

∙ 指令无法写入可执行段

(No instruction may write into an executable [code] segment.)

∙ 如果可写位被设为1,则指令无法写入一个数据段

(No instruction may write into a data segment if the writable bit is set.)∙ 如果可读位被设为0,则指令无法写入一个可执行段

(No instruction may read an executable [code] segment unless the readable bit

is not set.)

这些规则让程序员能够更容易的保证每个段得到合理准确的运用。在每一次附带新的数据值访问段时,类型检查就会启动。如果违反了其中任何的规定,将会触发保护模式,并报错。

(2)段的最大长度检查(Limit Checking)

这个概念比较简单。在Real Mode下,我们对一个内存地址的访问是通过Segment:Offset的方式来进行的,其中Segment是一个段的Base Address,一个Segment 的最大长度是64 KB,这是16-bit系统所能表示的最大长度。而Offset则是相对于此Segment Base Address的偏移量。Base Address+Offset就是一个内存绝对地址。由此,我们可以看出,一个段具备两个因素:Base Address和Limit(段的最大长度),而对一个内存地址的访问,则是需要指出:使用哪个段?以及相对于这个段Base Address的Offset,这个Offset应该小于此段的Limit。而对于Protected Mode运行在32-bit系统上,那么Segment的两个因素:Base Address和Limit也都是32位的。

相关文档
最新文档