全局描述符表

处理器将内存划分成逻辑上的段,并在指令中使用段内地址偏移,

在保护模式下,对内存的访问,仍然使用段地址和偏移地址,但是每个段在访问之前,必须先登记。

登记的信息包括段的起始地址,段的界限和段的各种访问属性等。

这样每次你的程序和你要访问的段不符时,就要被阻止,并产生一个叫做内部异常的中断。

和一个段有关的信息需要用8个字节来描述,称为段描述符(Segment Descriptor)。

每个段都需要一个描述符,为了存放这些描述符,在内存中需要开辟处一段空间,

这段空间里,所有段描述符都时挨在一起的,集中存放,称为描述符表。

最终要的描述符表是全局描述符表(Global Descriptor Table)GDT。

所谓全局,意思是该表是为整个软硬件系统服务的。

在进入保护模式前,必须先定义全局描述符表。

为了跟踪全局描述符表,处理器内部有一个48位的寄存器,称为全局描述符表寄存器(GDTR)。

该寄存器分为两部分,分别是32位的线性地址和16位的边界。

32位地址部分保存的是全局描述符表在内存中的起始线性地址,

16位的边界部分保存的是全局描述符表的界限,其在数值上等于表的大小(总字节数)减一。

换句话说,全局描述符表的界限值就是表内最后一个字节(也是表内最后一个描述符的第8个字节)的偏移量,第一个字节的偏移量是0,

因为GDTR的界限是16位,所以该表最大是2的16次方个字节,也就是65536(64K)个字节,又因为一个描述符占8个字节,故最多可定义8192个描述符。

理论上,全局描述符表可以定义在内存的任何地方,

但是,由于在进入保护模式后,处理器需要立即按新的访问模式工作,所以必须在进入保护模式前定义GDT。

但是,由于在实模式下只能访问1M的内存,故GDT通常都定义在1M以下的范围内,当然,允许进入保护模式后,重新定义GDT。

描述符不是由用户程序自己建立的,而是在加载时,操作系统跟据你的程序结构而建立的,用户程序通常是无法建立和修改GDT的。

操作系统为你的程序建立了几个段,你的程序就只能在这几个段内工作,超出这个范围,或未按照预定的方法访问这些段,都将被处理器阻止。

-----------------------------------------------------------------------

书11.2 全局描述符表

书11.3 存储器的段描述符

原文地址:https://www.cnblogs.com/a-s-m/p/12755634.html