保护虚地址模式下的寻址
与实地址模式相同,在保护模式下,一个存储单元的地址也是由段基地址和段内偏移两部分组成。段内偏移,除扩展到全地址(32位)外,与实地址方式下区别不大。这两种寻址方式的根本区别在于如何肯定段基地址。
实地址模式下,段寄存器的内容×16(即左移4位)就造成段基地址,故段基地址是20位的,只能寻址1MB。
在保护模式下,段基地址是32位的,因此不能由段寄存器的内容直接造成32位的段基地址,而要通过转换。安全
80x86中,内存中有一个表,每一个表项包含32位的段基地址。为了适应多用户、多任务操做系统的须要,一个段还要有一些其余信息,例如,段的大小和读写权限、段的类型等。一个段用一个8字节的描述符来描述,这些描述符构成了一个表项,称为段描述符表。
段描述符中的段基地址加上32位的段内偏移量就能够寻址一个存储单元。段基地址(32位)和段内偏移(32位)造成的地址称为线性地址(32位)。
在80x86处理器内有分页的MMU,当启用页机制时(CR0最高位PG=1),通过分页机制能够把线程地址转换为存储器的物理地址;当不启用分页机制时(CR0的PG=0),线程地址即为内存的物理地址。保护方式下的段内偏移量为32 位,故一个段最大可达4GB。
在80x86中为了可以快速寻址,对每一个段寄存器都增长了一个扩展部分,称为段描述符缓冲器,用于暂存当前段相对应的描述符。这时,段寄存器用于存放该段的描述符在描述符表中的索引值,又称为段选择符(器)。spa
描述符与描述符表
描述符表定义了用于80x86系统的全部的段。80x86共有3种类型的描述符表,分别是全局描述符表GDT、局部描述符表LDT和中断描述符表IDT。GDT和IDT只有一个,LDT能够有若干个,每一个任务一个。
最多能够有8K(8192=2^13)个描述符。每一个描述符描述一个段,包括段的基址、界限和其余特性。
(1) 全局描述符表GDT
GDT含有系统中每个任务均可以访问的段描述符,通常包括系统使用的代码段、数据段和堆栈段、各任务状态段、系统中全部的局部描述符表的描述符等。
(2) 局部描述符表LDT
局部描述符表包含了一个任务的专用描述符。操做系统为每一个任务创建一个LDT。LDT能够包含代码段、数据段、堆栈段、任务门和调用门。
从每一个任务的虚拟地址空间来看,整个虚拟地址空间能够分红两半,一半空间的描述符在全局描述符表中,另外一半空间的描述符在局部描述符表中。每个表都 能够包含多达8192个描述符(即对应的空间可由8192个段组成),每一个段最大可为4GB。故每一个任务最大的虚拟地址空间可 为:2×8192×4GB=64TB
(3) 中断描述符表IDT
中断描述符表包含了最多256个描述符,每一个描述符包含一个中断服务程序的入口地址和属性。IDT中能够包含任务门、中断门和自陷门。
在系统中,每一个描述符表都有一个与之对应的寄存器,它们分别是全局描述符表寄存器GDTR、局部描述符表寄存器LDTR和中断描述符表寄存器IDTR。
GDTR与IDTR寄存器存放全局描述符表与中断描述符表的基址和界限。
16位LDTR寄存器存放当前任务段的局部描述符表对应的描述符在全局描述符表中的索引值(LDT选择符),根据索引值,自动将该任务的局部描述符表的描述符装入程序不可见的高速缓冲器。
(4) 描述符
描述符有两大类:一类是段描述符,另外一类是系统描述符。
1) 段描述符
段描述符的各个域是:
(a) 段界限(20);
(b) 段的基地址(32位);
(c) 访问权限(8位)。
其中G位用于段限制域所用的单位:当G位为0时,表示段限制单位为字节;当G位为1时,段限制单位为页(4KB)。
以上内容分散在描述符的不一样字节中,这种不规整的安排彻底是为了与286兼容。
2)系统描述符
系统描述符定义了特殊的系统数据段和控制转移机构。
特殊的系统数据段是指令含有局部描述符表的段和含有任务状态的段;控制转移机构则是指各类控制门。所以,在系统描述符描述了有关各类操做系统表、任务和门的信息。
特殊的系统数据段描述符与段描述符具备类似的结构,与段描述符相比,不一样的仅仅是访问权限域,它具备了不一样的含义。
另外一类系统控制描述符为控制转移描述符,这类描述符一般称为门描述符,简称门。门描述符定义了一个代码段的保护入口。有各类门描述符,包括调用门、任务 门、中断门自陷门。这些门为源和目标之间的控制转移提供了一个间接方法,这种方法容许系统自动地完成保护检查。门也使系统设计者能够控制操做系统的入口 点。调用门用于改变特权级,任务门用于任务切换,而中断门和自陷门用于肯定中断服务程序。
因为门主要用于控制转移,因此要肯定目标程序的入口。目标程序的入口一样是由选择符(从描述符表中取出目标程序段的描述符)和偏移量两部分组成。操作系统