要知道保护模式下地址的变换,就要知道几张表,和几个寄存器。三张表GDT,LDT,IDT。四个寄存器GDTR,LDTR,IDTR,TR。先区分两个名词,描述符和选择符。描述符是用来描述一个段,包括段的基地址,段限,段的属性。选择符是用来查找描述符用的。
GDT是全局描述符表,这个表只有一张。其中有段的描述符,LDT的描述符(描述LDT表的位置,长度等),TSS描述符(描述任务的状态信息,如该任务是否忙碌,该任务的位置等)。
LDT是局部描述符表,这个表可以多张,一个任务至少有一个LDT表。其中有段的描述符(与GDT表中的段描述符的区别是,GDT表中的段描述符描述的是系统段,而这里的段描述符描述的是任务的段)。
IDT是中断描述符表,有中断和异常的描述符。注意这里的描述符与前面的描述符有区别,这里的描述符里包含一个选择符,用这个选择符来查找到中断程序段的描述符。
GDTR是全局描述符表寄存器,里面放的是,GDT这个表的地址和表的限长。通过它可以找到GDT这个表。
LDTR寄存器里面放的是一个LDT表的选择符,通过这个选择符,可以再GDT表中找到LDT的描述符,从而找到这个LDT表的位置。
IDTR是中断描述符表寄存器,里面放的是IDT表的地址和表的限长。
TR是TSS描述符寄存器,里面放的是TSS描述符的选择符,通过选择符可在GDT表中找到TSS描述符。
GDT是全局描述符表,这个表只有一张。其中有段的描述符,LDT的描述符(描述LDT表的位置,长度等),TSS描述符(描述任务的状态信息,如该任务是否忙碌,该任务的位置等)。
LDT是局部描述符表,这个表可以多张,一个任务至少有一个LDT表。其中有段的描述符(与GDT表中的段描述符的区别是,GDT表中的段描述符描述的是系统段,而这里的段描述符描述的是任务的段)。
IDT是中断描述符表,有中断和异常的描述符。注意这里的描述符与前面的描述符有区别,这里的描述符里包含一个选择符,用这个选择符来查找到中断程序段的描述符。
GDTR是全局描述符表寄存器,里面放的是,GDT这个表的地址和表的限长。通过它可以找到GDT这个表。
LDTR寄存器里面放的是一个LDT表的选择符,通过这个选择符,可以再GDT表中找到LDT的描述符,从而找到这个LDT表的位置。
IDTR是中断描述符表寄存器,里面放的是IDT表的地址和表的限长。
TR是TSS描述符寄存器,里面放的是TSS描述符的选择符,通过选择符可在GDT表中找到TSS描述符。
注意,LDTR中放的是选择符(LDT表的地址和限长是在GDT表中的LDT描述符所描述的),而GDTR和IDTR放的是表的地址和表的限长。
下面是我在网上找的图片。
选择符的格式:
段描述符(包括数据段,代码段),系统描述符(包括用于描述LDT表的描述符,TSS描述符) 的格式:
中断描述符的格式:
总的关系图: