一、描述符表
描述符表有3种,由描述符顺序排列组成,由系统地址寄存器(GDTR、IDTR、LDTR)指示其在物理内存的位置和大小。有3种表,全局描述符表GDT、中断描述符表IDT和局部描述符表LDT。
在一般情况下,若要进入保护方式,需要首先定义全局描述符表、中断描述符表和局部描述符表,至少定义全局描述符表。定义方法:用专门的指令向相应的系统地址寄存器传送基地址、界限值,然后再将所需要的描述符送入指定的描述符表中。GDT和LDT最多可以存放8192个描述符,IDT最多可以放256个描述符。
描述符表(即段表)定义了386系统的所有段的情况。所有的描述符表本身都占据一个 字节为8的倍数的存储器空间,空间大小在8个字节(至少含一个描述符)到64K字节(至多含8K)个描述符之间。
1. 全局描述符表(GDT)
全局描述符表GDT(Global Descriptor Table),除了任务门,中断门和陷阱门描述符外,包含着系统中所有任务都共用的那些段的描述符。它的第一个8字节位置没有使用。
2. 中断描述符表(IDT)
中断描述符表IDT(Interrupt Descriptor Table),包含256个门描述符。IDT中只能包含任务门、中断门和陷阱门描述符,虽然IDT表最长也可以为64K字节,但只能存取2K字节以内的描述符,即256个描述符,这个数字是为了和8086保持兼容。
3. 局部描述符表(LDT)
局部描述符表LDT(local Descriptor Table),是保护模式下存储器寻址的一种数据表,它包含了与某个任务相关联的段描述符。在设计操作系统时,通常每个任务有一个独立的LDT。LDT提供 了将一任务的代码段、数据段与操作系统的其余部分相隔离的机制。
4. LDT 与 GDT 的关系
LDT的定位与GDT不同,LDT的段基址与段限由LDT描述符表示,该描述符同一般的描述符 一样存放在全局描述符表中,因此首先要从GDT中找到LDT描述符,80386微处理器中有一个局部描述符表寄存器 LDTR,这是一个16位寄存器,LDTR中存放一个被称为“段选择符”(Segment Selector)的16位数,段选择符用来在GDT中寻找LDT描述符。
二、描述符
描述符记录着对段的管理信息,按段的性质分为三类描述符:程序段描述符、系统段描述符、门描述符。
所有的描述符都由8个字节组成,其中有32位段起始地址、20位段界限值,12位的属性位。(具体属性就不讲了)
三、段地址转换
在分段的情况下,用户使用的是逻辑地址,即一个16位的段选择器和一个32位的段偏移量。分段部分在保护方式下要根据段选择符(索引码)首次访问内存,从段描述符表中取出相应的描述符,以取得段基址、界限值、段特权级以及允许访问的类型等信息。32位的段基址加32位的偏移量得到线性地址。
四、虚拟空间
32位机能提供给编程者的最大编程空间就是它能完成变换的那些空间,成为虚拟空间。它的最大值可以按以下计算:
段寄存器的TI为决定了2个描述符表;
13位选择码决定了最多有8192个描述符;
每个描述符可以访问4G的空间;
所以2*8192*4G=64T