zoukankan      html  css  js  c++  java
  • linux内核学习之全局描述符表(GDT)(二)

    来源:https://www.cnblogs.com/longintchar/p/5224406.html

    在进入保护模式之前,我们先要学习一些基础知识。今天我们看一下全局描述符表(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。

  • 相关阅读:
    POJ-2387-Til the Cows Come Home 解题报告
    编程能力与编程年龄
    POJ-1703-Find them, Catch them 解题报告
    科学计算和可视化
    判断素数
    余初闻回文数,初试函数解,竟成!(指出前n个回文素数)
    经典题:*年*月*日是第几天
    验证码的校验
    天天向上的力量终于好了!!
    阶乘
  • 原文地址:https://www.cnblogs.com/zgq0/p/8612910.html
Copyright © 2011-2022 走看看