来源:http://www.javashuo.com/article/p-krvxyvrs-hk.htmlhtml
在进入保护模式以前,咱们先要学习一些基础知识。今天咱们看一下全局描述符表(Global Descriptor Table, 简称GDT)。学习
同实模式同样,在保护模式下,对内存的访问仍然使用段地址加偏移地址。可是,在保护模式下,在每一个段可以访问以前,必须先登记。这就比如像C语言中,“对变量的使用必须先定义”同样。.net
每一个段在可以使用以前,都要为这个段创建一个描述符。每一个描述符占8个字节,这些描述符集中存放在内存的某个区域,一个挨着一个,就构成了一张“表”。htm
80x86中有两种描述符表:blog
LDT咱们之后再说,今天的重点是GDT.ip
在进入保护模式以前,必需要定义GDT,也就是说,咱们要在内存中构建出一张表。内存
须要说明的是:在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT);GDT能够被放在内存的任何位置,但CPU必须知道GDT的入口。get
你也许会问:CPU如何知道GDT的入口呢?别担忧,在处理器内部,有一个48位的寄存器,名叫GDTR,也就是全局描述符表寄存器。其结构以下图:it
该寄存器分为2部分:基础
注意:在处理器刚上电的时候,基地址默认为0,表界限默认为0xFFFF; 在保护模式初始化过程当中,必须给GDTR加载一个新值。
由于表界限是16位的,最大值是0xFFFF,也就是十进制的65535,那么表的大小就是65535+1=65536.又由于一个描述符占用8个字节,因此65536字节至关于8192个描述符(65536/8=8192).故理论上最多能够定义8192个描述符。实际上,不必定这么多,具体多少根据须要而定。
理论上,GDT能够放在内存中的任何地方。可是,咱们必须在进入保护模式以前就定义GDT(否则就来不及了),因此GDT通常都定义在1MB如下的内存范围中。固然,容许在进入保护模式后换个位置从新定义GDT。