全局描述符表(GDT)——《x86汇编语言:从实模式到保护模式》读书笔记09

在进入保护模式之前,我们先要学习一些基础知识。今天我们看一下全局描述符表(Global Descriptor Table, 简称GDT)。

同实模式一样,在保护模式下,对内存的访问仍然使用段地址加偏移地址。但是,在保护模式下,在每个段能够访问之前,必须先登记。这就好比像C语言中,“对变量的使用必须先定义”一样。

每个段在能够使用之前,都要为这个段建立一个描述符。每个描述符占8个字节,这些描述符集中存放在内存的某个区域,一个挨着一个,就构成了一张“表”。

80x86中有两种描述符表:

  • 全局描述符表(Global Descriptor Table, 简称GDT)
  • 局部描述符表(Local Descriptor Table,简称LDT)

LDT我们以后再说,今天的重点是GDT.

在进入保护模式之前,必须要定义GDT,也就是说,我们要在内存中构建出一张表。

需要说明的是:在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT);GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口。

你也许会问:CPU如何知道GDT的入口呢?别担心,在处理器内部,有一个48位的寄存器,名叫GDTR,也就是全局描述符表寄存器。其结构如下图:

 

GDTR

 

该寄存器分为2部分:

  • 32位的线性基地址:GDT在内存中的起始线性地址(我们还没有涉及到分页,所以这里的线性地址等同于物理地址,下同,以后同);
  • 16位的表界限:在数值上等于表的大小(总字节数)减去1;

注意:在处理器刚上电的时候,基地址默认为0,表界限默认为0xFFFF; 在保护模式初始化过程中,必须给GDTR加载一个新值。

因为表界限是16位的,最大值是0xFFFF,也就是十进制的65535,那么表的大小就是65535+1=65536.又因为一个描述符占用8个字节,所以65536字节相当于8192个描述符(65536/8=8192).故理论上最多可以定义8192个描述符。实际上,不一定这么多,具体多少根据需要而定。

理论上,GDT可以放在内存中的任何地方。但是,我们必须在进入保护模式之前就定义GDT(不然就来不及了),所以GDT一般都定义在1MB以下的内存范围中。当然,允许在进入保护模式后换个位置重新定义GDT。

posted @ 2016-01-09 12:11  漂泊的指针  阅读(2213)  评论(0编辑  收藏  举报