32位机内存管理(下)

时间:2023-01-22 16:43:54

既然这样,段描述符表放在那里呢?80386中引入了两个新的寄存器来管理描述符表。一个是48位的全局描述符表寄存器GDTR,一个是16位的局部描述符表寄存器LDTR。那么,为什么有两个描述符表寄存器呢?

GDTR指向的描述符表为全局描述符表GDT。它包含操作系统中所有任务都可用的段描述符,通常包含描述操作系统所使用的代码段、数据段、堆栈段的描述符及各任务的LDT段等,全局描述符表只有一个。

LDTR则指向局部描述符表LDT。80386处理器设计成每个任务都有一个独立的LDT。它包含有每个任务私有的代码段、数据段、堆栈段的描述符,也包含该任务所使用的一些门描述符。

不同任务的局部描述符表分别组成不同的内存段,描述这些内存段的描述符当做系统描述符放在全局描述符表中。和GDTR直接指向内存地址不同,LDTR和CS,DS等段选择器一样只存放索引,指向局部描述符表内存段对应的描述符在全局描述符表中的位置。随着任务的切换,只要改变LDTR的值,系统当前的局部描述符表LDT也随之切换,这样便于各任务之间数据的隔离,但GDT并不随着人物的切换而切换。

看到这里,可能会有一个问题,既然有全局描述符表和局部描述符表两个表,那么段选择器中的索引对应哪个表中的描述符呢?实际上16位的段选择器中只有高13位表示索引值,剩下的3个数据位中,第0,1位表示程序的当前优先级RPL,第二位TI用来表示在段描述符表的位置,TI=0在GDT中,TI=1在LDT中。

啥都不说了,一张图足以:

32位机内存管理(下)

注:GDTR指向GDT表位置,LDTR本质上也指向LDT表位置,不过并不是直接给出LDT位置,而是借助GDT表间接给出位置。LDTR中的选择符指向GDT中的某项,而GDT表中存有LDT表的偏移值,这样再根据cs中的选择符在LDT中找到具体项。