wiki.osdev.org 系列之(九)- 全局描述符表 (GDT)

全局描述符表 (GDT) 是特定于 IA-32 和 x86-64 体系架构的二进制数据结构。它包含告诉 CPU 内存段的条目。存在一个类似的中断描述符表,其中包含任务和中断描述符。

推荐阅读 GDT 教程。

GDTR

GDT 由 GDTR 寄存器中的值指向。这是使用 LGDT 汇编指令加载的,其参数是指向 GDT 描述符结构的指针:

Untitled.png

  • Size:表的大小(以字节为单位)减去 1。发生这种减法是因为 Size 的最大值为 65535,而 GDT 的长度最多可达 65536 个字节(8192 个条目)。此外,没有 GDT 的大小可以为 0 字节。
  • 偏移量:GDT 的线性地址(不是物理地址,分页适用)。

注意 LGDT 加载的数据量在 32 位和 64 位模式下是不同的,偏移量在 32 位模式下为 4 字节长,在 64 位模式下为 8 字节长。

有关详细信息,请参阅英特尔软件开发人员手册第 3-A 卷的第 2.4.1 节:全局描述符表寄存器 (GDTR) 和图 2-6:内存管理寄存器。

Table

GDT 中的条目长 8 个字节,并形成如下表格:

Untitled.png

GDT 中的第一个条目(条目 0)应始终为空,而应使用后续条目。

表中的条目由段选择器访问,段选择器通过汇编指令或硬件功能(如中断)加载到分段寄存器中。

段描述符

表中的每个条目都有一个这样的复杂的结构:

Untitled.png

  • Base :一个 32 位值,包含段开始的线性地址。
  • Limit :一个 20 位的值,表示最大可寻址单元,以 1 字节为单位,或以 4KiB 页为单位。因此,如果您选择页面粒度并将限制值设置为 0xFFFFF,则该段将在 32 位模式下跨越整个 4 GiB 地址空间。

在 64 位模式下,Base 和 Limit 值被忽略,每个描述符都覆盖整个线性地址空间,无论它们设置为什么。

有关详细信息,请参阅英特尔软件开发人员手册第 3-A 卷的第 3.4.5 节:段描述符和图 3-8:段描述符。

Untitled.png

  • P:现在位。允许条目引用有效段。对于任何有效的段,必须设置为(1)。
  • DPL:描述符特权级别字段。包含段的 CPU 特权级别。 0 = 最高权限(内核),3 = 最低权限(用户应用程序)。
  • S:描述符类型位。如果清除 (0),则描述符定义系统段(例如,任务状态段)。如果设置为 (1),它定义了一个代码或数据段。
  • E:可执行位。如果清除 (0),则描述符定义数据段。如果设置为 (1),它定义了一个可以从中执行的代码段。
  • DC:方向位/一致性位。
    • 对于数据选择器:方向位。如果清除 (0),则该段向上增长。如果设置 (1),则该段向下增长,即。偏移量必须大于限制。
    • 对于代码选择器:一致性位。
      • 如果清除 (0) 此段中的代码只能从 DPL 中设置的环中执行。
      • 如果设置 (1),则此段中的代码可以从相等或更低的特权级别执行。例如,环 3 中的代码可以远跳到环 2 段中的一致性代码段。 DPL 字段表示允许执行段的最高权限级别。例如,环 0 中的代码不能远跳转到 DPL 为 2 的一致性代码段,而环 2 和 3 中的代码可以。请注意,特权级别保持不变,即。从环 3 到 DPL 为 2 的段的远跳在跳转后仍保留在环 3 中。
  • RW:可读位/可写位。
    • 对于代码段:可读位。如果清除 (0),则不允许对该段进行读取访问。如果设置 (1) 则允许读取访问。代码段永远不允许写访问。
    • 对于数据段:可写位。如果清除 (0),则不允许对该段进行写访问。如果设置 (1) 则允许写访问。始终允许对数据段进行读取访问。
  • A:最佳左清零(0),当段被访问时,CPU将设置它。

Untitled.png

  • G:粒度标志,表示限制值被缩放的大小。如果清除 (0),则限制为 1 字节块(字节粒度)。如果设置为 (1),则限制为 4 KiB 块(页面粒度)。
  • DB:大小标志。如果清除 (0),描述符定义一个 16 位保护模式段。如果设置为 (1),它定义了一个 32 位保护模式段。 GDT 可以同时拥有 16 位和 32 位选择器。
  • L:长模式代码标志。如果设置为 (1),则描述符定义 64 位代码段。设置后,DB 应始终清晰。对于任何其他类型的段(其他代码类型或任何数据段),它应该是清除(0)。

系统段描述符

对于系统段,例如定义任务状态段或本地描述符表的系统段,访问字节的格式略有不同,以便定义不同类型的系统段而不是代码和数据段。

有关详细信息,请参阅英特尔软件开发人员手册第 3-A 卷的第 3.5 节:系统描述符类型和图 3-2:系统段和门描述符类型。

Untitled.png

  • Type: 系统段的类型。

在 32 位保护模式下可用的类型:

  • 0x1:16 位 TSS(可用)
  • 0x2:LDT
  • 0x3:16 位 TSS(忙)
  • 0x9:32 位 TSS(可用)
  • 0xB:32 位 TSS(忙)

长模式下可用的类型:

  • 0x2:LDT
  • 0x9:64 位 TSS(可用)
  • 0xB:64 位 TSS(忙)

长模式系统段描述符

对于长模式下的任务状态段或本地描述符表,段描述符的格式不同,以确保基值可以包含 64 位线性地址。它以小端格式占用两个常用条目的表中的空间,使得该条目的下半部分在表中的上半部分之前。

有关详细信息,请参阅英特尔软件开发人员手册第 3-A 卷的第 7.2.3 节:64 位模式下的 TSS 描述符和图 7-4:64 位模式下的 TSS 和 LDT 描述符的格式。

Untitled1.png


标题:wiki.osdev.org 系列之(九)- 全局描述符表 (GDT)
作者:糖醋鱼
地址:https://expoli.tech/articles/2022/06/11/1654937103303.html

    评论
    1 评论
    2022-06-13 15:47 回复»

    您好~我是腾讯云+社区的运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan

    您好~我是腾讯云+社区的运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan

    作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物。

    作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物。

avatar

取消