80386保护模式

来源:互联网 发布:java rss 编辑:程序博客网 时间:2024/05/17 19:16

一、保护模式简述

在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间;扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换和保护任务环境;4个特权级和完善的特权检查机制,既能实现资源共享以能保证代码及数据的安全和保密、及任务的隔离。

80386采用称为描述符(descriptor)的数据来描述段的位置、大小和使用情况。虚拟存储器的地址(逻辑地址)由指示描述符的选择子(selector)段内偏移两部分构成,这样的地址集合称为虚拟地址空间,但要注意的是,这与实模式下的段值+偏移量来获取物理地址是不同的。在保护模式下,由选择子和段内偏移计算出来的只是虚拟地址,需要将虚拟地址转换成实际的物理地址。

transformaddr地址映射转换示意

80386分两步实现虚拟地址空间到物理地址空间的映射,其中第二步是可选的。分页管理机制把线性地址空间和物理地址空间分别划分为大小相同的块,这样的块称之为页。通过在线性空间的页与物理地址空间的页之间建立的映射表,分页管理机制实现线性地址到物理地址空间的映射,实现线性地址到物理地址的转换。分页管理机制是可选的,在不采用分页管理机制时,线性地址空间就直接等同于物理地址空间,线性地址就直接等于物理地址。

在保护模式中,在一个任务之内,定义有4种执行特权级别,用于限制对任务中的段进行访问。特权级别分别用0~3表示,数字0表示最高特权级别,而数字3表示最低特权级别。在任何时候,一个任务总是在4个特权级别之一下运行 ,任务在特定时刻的特权级称为当前特权级(Current Priviledge Level),标记为CPL。而每个存储器段也都与一个特权级别相联系。每当一个程序试图访问一个段时,就把 CPL与要访问的段的特权级进行比较,以决定是否允许这一次访问。

priv

4层特权级别

特权级的典型用法是,把操作系统的核心放在内层的0级,操作系统的其余部分放在1级,而应用程序放在3级,留下2级供中间软件使用。

二、分段管理机制

1.段定义和地址转换

segmentationpage

上面的图描述了分段和分页机制下逻辑地址到物理地址的详细转换过程。简单地说,就是段选择子确定了段描述符,由段描述符和偏移确定了线性地址,线性地址再由分页机制转换成相应的物理地址。

段是实现虚拟地址空间到线性地址转换机制的基础。在保护方式下,每个段由如下三个参数进行定义:段基地址(Base Address)、段界限(Limit)和段属性(Attributes)。

段基地址规定线性地址空间中段的开始地址。在80386保护方式下,段基地址长32位。因为基地址长度与寻址长度相同,所以任何一个段都可以从32位线性地址空间中的任何一个字节开始,而不像实方式下规定段的边界必须被16整除。

段界限规定了段的大小。在80386保护模式下,段界限用20位表示,而且段界限可以是以字节为单位或以4K字节为单位。段属性中有一位对此进行定义,该位称为粒度位,以符号G标记。G=0表示段界限以字节为单位,此时20位的段界限可表示1字节~1M字节,增量为1字节;G=1表示段界限以4K字节为单位,此时20位的段界限可表示的范围是4K字节到4G字节,增量为4K字节。段属性中还有一个标记ED表示段的扩展方向位,用以区别数据段和堆栈段的扩展方向位。

2.存储段描述符

用于表示上述段的三个参数的数据称为描述符。每个描述符长8个字节。在保护模式下,每一个段都有一个相应的描述符来描述。按描述符所描述的对象来划分,描述符可分为如下三类:存储段描述符、系统段描述符、门描述符(控制描述符)。

segment

存储段属性描述如下:

  • P:说明所描述的段是否存在,P=1表示描述符所描述的段存在于内存中,P=0表示描述符所描述的段不在内存中。
  • DPL:为描述符所描述段的特权级,只有有效特权级EPL大于等于DPL时,才能对段进行访问。
  • DT:存储段描述为1,以区别于系统段描述符和门描述符(DT=0)。
  • TYPE:说明存储段描述符所描述存储段的具体属性
    • 位0表示被描述的段是否被访问过,该位为0表示未被访问过,为1则表示该段先前已经被访问过。
    • 位1的定义在于描述符所描述段的类型。当所描述的是代码段时,该位指示所描述的代码段是否可读,为1则可读,为0则不可读;当所描述的是数据段时,该位指示所描述的数据段是否可写,为1则可写,为0则不可写。
    • 位2的定义也在于描述符所描述段的类型。当所描述的是代码段时,该位指示所描述的代码段是否是一致代码段,为1表示该代码段是一致代码段,为0表示该代码段不是一致代码段,即是普通的代码段。当所描述的是数据段时,该位指示该段的扩展方向,为1时表示该段向低地址扩展,为0时表示该段向高地址扩展。
    • 位3指示所描述的段类型。为1表示所描述的段是代码段,是可以被执行的;为0表示所描述的段是数据段,是不能被执行的。前面已经说了,在保护模式下应该把堆栈段理解为特殊的数据段,为0时也包括堆栈段。
  • G:段界限粒度位,表示段界限的计数单位,该位为0时表示段界限以字节为单位,为1时表示以4K为单位。这样计算下来,20位的段界限就可以描述大小为64K或4G的段了。
  • D/B:说明描述符所描述的段是32位环境还是16位的环境。
    • 在可执行代码段描述符中,这一位叫做D位。D=1时,在默认情况下指令使用32位地址及32位或8位操作数;D=0时,在默认情况下,使用16位地址及16位或8位操作数。
    • 在向下扩展数据段的描述符中,这一位叫做B位。B=1时,段的上部界限为4GB;B=0时,段的上部界限为64KB。
    • 在描述堆栈段(由ss寄存器指向的段)的描述符中,这一位叫做B位。B=1时,隐式的堆栈访问指令(如push、pop和call)使用32位堆栈指针寄存器esp;B=0时,隐式的堆栈访问指令(如push、pop和call)使用16位堆栈指针寄存器sp。
  • AVL:是软件可用位。80386对该位的使用未做规定,Intel公司也保证今后开发生产的处理只要与80386兼容,就不会对该位的使用做任何定义或规定。

3.全局和局部描述符表

描述符表是由描述符组成的线性表。在80386中有三种类型的描述符表:全局描述符表GDT、局部描述符表LDT和中断描述符表IDT。在整个系统中,全局描述符表GDT和中断描述符表IDT只有一张。局部描述符表可以有若干张,每个任务可以有一张。每个描述符表本身形成一个特殊的数据段。这样的特殊数据段最多可以含有8K个描述符(因为段选择子用于表示索引的只有13位)。

每个任务的局部描述符表LDT含有该任务自己的代码段、数据段和堆栈段的描述符,也包含该任务所使用的一些门描述符。随着任务的切换,系统当前的局部描述符表LDT也随之切换。全局描述符表GDT含有每一个任务都可能或可以访问的段描述符,通常包含描述操作系统所使用的代码段、数据段和堆栈段的描述符,也包含多种特殊数据段的描述符。在任务切换时,并不切换GDT。

4.段选择子

在实方式下,逻辑地址空间中存储单元的地址有段值和段内偏移两部分组成。在保护方式下,虚拟地址空间(逻辑地址)中存储单元的地址有段选择子和段内偏移两部分组成。与实方式相比,段选择子替代了段值。

selector段选择子

段选择子长16位,具体的属性如下:

  • 高13位是描述符索引。所谓描述符索引是指描述符在描述符表中的序号。
  • T1位是引用描述符表指示位。T1=0指示从全局描述符表GDT中读取描述符;T1=1指示从局部描述符表LDT中读取描述符。
  • RPL是请求特权级,用于特权检查。

段选择子确定描述符,描述符确定段基地址,由段基地址和偏移之和就是线性地址。

三、控制寄存器和系统地址寄存器

1.控制寄存器

80386有4个32位控制寄存器,分别命名为CR0、CR1、CR2、CR3。但CR1被保留,供今后开发的处理器使用,在80386中不能使用CR1,否则将引起无效指令操作异常。CR0包含指示处理器工作方式的控制位,包含启用和禁用分页管理机制的控制位,包含控制浮点协处理器操作的控制位。CR2及CR3由分页管理机制使用。CR0中的位5~位30及CR3中的位0~位11是保留位,这些位不能随意值,必须为0。

cr

控制寄存器CR0中的位0用PE标记,位31用PG标记,这两个位控制分段和分页管理机制的操作。把它们称保护控制位。PE控制分段管理机制,PE=0处理器运行于实方式,PE=1处理器运行于保护模式。PG控制分页管理机制,PG=0禁用分页管理机制,PG=1启用分页管理机制。

2.系统地址寄存器

全局描述符表GDT、局部描述符表LDT和中断描述符表IDT等是保护模式下非常重要的特殊段,它们包含有对段机制所用的重要表格。为了方便快捷地定位这些段,处理器采用一些特殊的寄存器保存这些段的基地址和界限。这些特殊的寄存器就称为系统地址寄存器。

gdtr

全局描述符表寄存器GDTR,长48位,其中高32位含基地址,低16位含界限。GDTR是用于保存的首个字节所在的线性内存地址。

局部描述符表寄存LDTR,由程序员可见的一个16位寄存器和程序员不可见的高速缓冲寄存器组成。实际上,每个任务的局部描述符表LDT作为系统的一个特殊段,由一个描述符描述,而用于描述LDT的描述符存入在GDT中。

中断描述符表寄存器IDTR,与GDTR的作用类似,IDTR寄存器用于存放中断描述符表IDT的32位线性基地址和16位表长度值。指令LIDT和SIDT分别用于加载和保存IDTR寄存器的内容。在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0xFFFF。

任务寄存器TR,TR寄存器用于存放当前任务TSS段的16位段选择符、32位基地址、16位段长度和描述符属性值。它引用GDT表中的一个TSS类型的描述符。指令LTR和STR分别用于加载和保存TR寄存器的段选择符部分。当使用LTR指令把选择符加载进任务寄存器时,TSS描述符中的段基地址、段限长度以及描述符属性会被自动加载到任务寄存器中。当执行任务切换时,处理器会把新任务的TSS的段选择符和段描述符自动加载进任务寄存器TR中。

引用:80X86汇编语言程序设计教程

原创粉丝点击