在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间;扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换和保护任务环境;4个特权级和完善的特权检查机制,既能实现资源共享以能保证代码及数据的安全和保密、及任务的隔离。
80386采用称为描述符(descriptor)的数据来描述段的位置、大小和使用情况。虚拟存储器的地址(逻辑地址)由指示描述符的选择子(selector)和段内偏移两部分构成,这样的地址集合称为虚拟地址空间,但要注意的是,这与实模式下的段值+偏移量来获取物理地址是不同的。在保护模式下,由选择子和段内偏移计算出来的只是虚拟地址,需要将虚拟地址转换成实际的物理地址。
地址映射转换示意
80386分两步实现虚拟地址空间到物理地址空间的映射,其中第二步是可选的。分页管理机制把线性地址空间和物理地址空间分别划分为大小相同的块,这样的块称之为页。通过在线性空间的页与物理地址空间的页之间建立的映射表,分页管理机制实现线性地址到物理地址空间的映射,实现线性地址到物理地址的转换。分页管理机制是可选的,在不采用分页管理机制时,线性地址空间就直接等同于物理地址空间,线性地址就直接等于物理地址。
在保护模式中,在一个任务之内,定义有4种执行特权级别,用于限制对任务中的段进行访问。特权级别分别用0~3表示,数字0表示最高特权级别,而数字3表示最低特权级别。在任何时候,一个任务总是在4个特权级别之一下运行 ,任务在特定时刻的特权级称为当前特权级(Current Priviledge Level),标记为CPL。而每个存储器段也都与一个特权级别相联系。每当一个程序试图访问一个段时,就把 CPL与要访问的段的特权级进行比较,以决定是否允许这一次访问。
4层特权级别
特权级的典型用法是,把操作系统的核心放在内层的0级,操作系统的其余部分放在1级,而应用程序放在3级,留下2级供中间软件使用。
上面的图描述了分段和分页机制下逻辑地址到物理地址的详细转换过程。简单地说,就是段选择子确定了段描述符,由段描述符和偏移确定了线性地址,线性地址再由分页机制转换成相应的物理地址。
段是实现虚拟地址空间到线性地址转换机制的基础。在保护方式下,每个段由如下三个参数进行定义:段基地址(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表示段的扩展方向位,用以区别数据段和堆栈段的扩展方向位。
用于表示上述段的三个参数的数据称为描述符。每个描述符长8个字节。在保护模式下,每一个段都有一个相应的描述符来描述。按描述符所描述的对象来划分,描述符可分为如下三类:存储段描述符、系统段描述符、门描述符(控制描述符)。
存储段属性描述如下:
描述符表是由描述符组成的线性表。在80386中有三种类型的描述符表:全局描述符表GDT、局部描述符表LDT和中断描述符表IDT。在整个系统中,全局描述符表GDT和中断描述符表IDT只有一张。局部描述符表可以有若干张,每个任务可以有一张。每个描述符表本身形成一个特殊的数据段。这样的特殊数据段最多可以含有8K个描述符(因为段选择子用于表示索引的只有13位)。
每个任务的局部描述符表LDT含有该任务自己的代码段、数据段和堆栈段的描述符,也包含该任务所使用的一些门描述符。随着任务的切换,系统当前的局部描述符表LDT也随之切换。全局描述符表GDT含有每一个任务都可能或可以访问的段描述符,通常包含描述操作系统所使用的代码段、数据段和堆栈段的描述符,也包含多种特殊数据段的描述符。在任务切换时,并不切换GDT。
在实方式下,逻辑地址空间中存储单元的地址有段值和段内偏移两部分组成。在保护方式下,虚拟地址空间(逻辑地址)中存储单元的地址有段选择子和段内偏移两部分组成。与实方式相比,段选择子替代了段值。
段选择子
段选择子长16位,具体的属性如下:
段选择子确定描述符,描述符确定段基地址,由段基地址和偏移之和就是线性地址。
80386有4个32位控制寄存器,分别命名为CR0、CR1、CR2、CR3。但CR1被保留,供今后开发的处理器使用,在80386中不能使用CR1,否则将引起无效指令操作异常。CR0包含指示处理器工作方式的控制位,包含启用和禁用分页管理机制的控制位,包含控制浮点协处理器操作的控制位。CR2及CR3由分页管理机制使用。CR0中的位5~位30及CR3中的位0~位11是保留位,这些位不能随意值,必须为0。
控制寄存器CR0中的位0用PE标记,位31用PG标记,这两个位控制分段和分页管理机制的操作。把它们称保护控制位。PE控制分段管理机制,PE=0处理器运行于实方式,PE=1处理器运行于保护模式。PG控制分页管理机制,PG=0禁用分页管理机制,PG=1启用分页管理机制。
全局描述符表GDT、局部描述符表LDT和中断描述符表IDT等是保护模式下非常重要的特殊段,它们包含有对段机制所用的重要表格。为了方便快捷地定位这些段,处理器采用一些特殊的寄存器保存这些段的基地址和界限。这些特殊的寄存器就称为系统地址寄存器。
全局描述符表寄存器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汇编语言程序设计教程》