linux内核学习之全局描述符表(GDT)(二)

来源:http://www.javashuo.com/article/p-krvxyvrs-hk.htmlhtml

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

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

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

80x86中有两种描述符表:blog

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

LDT咱们之后再说,今天的重点是GDT.ip

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

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

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

 

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。

相关文章
相关标签/搜索