type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
全局描述符表 (GDT) 是特定于 IA-32 和 x86-64 体系架构的二进制数据结构。它包含告诉 CPU 内存段的条目。存在一个类似的中断描述符表,其中包含任务和中断描述符。
推荐阅读 GDT 教程

1 GDTR

GDT 由 GDTR 寄存器中的值指向。这是使用 LGDT 汇编指令加载的,其参数是指向 GDT 描述符结构的指针:
notion image
  • 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:内存管理寄存器。

2 Table

GDT 中的条目长 8 个字节,并形成如下表格:
notion image
GDT 中的第一个条目(条目 0)应始终为空,而应使用后续条目。
表中的条目由段选择器访问,段选择器通过汇编指令或硬件功能(如中断)加载到分段寄存器中。

3 段描述符

表中的每个条目都有一个这样的复杂的结构:
notion image
  • Base :一个 32 位值,包含段开始的线性地址。
  • Limit :一个 20 位的值,表示最大可寻址单元,以 1 字节为单位,或以 4KiB 页为单位。因此,如果您选择页面粒度并将限制值设置为 0xFFFFF,则该段将在 32 位模式下跨越整个 4 GiB 地址空间。
在 64 位模式下,Base 和 Limit 值被忽略,每个描述符都覆盖整个线性地址空间,无论它们设置为什么。
有关详细信息,请参阅英特尔软件开发人员手册第 3-A 卷的第 3.4.5 节:段描述符和图 3-8:段描述符。
notion image
  • 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将设置它。
notion image
  • G:粒度标志,表示限制值被缩放的大小。如果清除 (0),则限制为 1 字节块(字节粒度)。如果设置为 (1),则限制为 4 KiB 块(页面粒度)。
  • DB:大小标志。如果清除 (0),描述符定义一个 16 位保护模式段。如果设置为 (1),它定义了一个 32 位保护模式段。 GDT 可以同时拥有 16 位和 32 位选择器。
  • L:长模式代码标志。如果设置为 (1),则描述符定义 64 位代码段。设置后,DB 应始终清晰。对于任何其他类型的段(其他代码类型或任何数据段),它应该是清除(0)。

4 系统段描述符

对于系统段,例如定义任务状态段或本地描述符表的系统段,访问字节的格式略有不同,以便定义不同类型的系统段而不是代码和数据段。
有关详细信息,请参阅英特尔软件开发人员手册第 3-A 卷的第 3.5 节:系统描述符类型和图 3-2:系统段和门描述符类型。
notion image
  • Type: 系统段的类型。
在 32 位保护模式下可用的类型:
  • 0x1:16 位 TSS(可用)
  • 0x2:LDT
  • 0x3:16 位 TSS(忙)
  • 0x9:32 位 TSS(可用)
  • 0xB:32 位 TSS(忙)
长模式下可用的类型:
  • 0x2:LDT
  • 0x9:64 位 TSS(可用)
  • 0xB:64 位 TSS(忙)

5 长模式系统段描述符

对于长模式下的任务状态段或本地描述符表,段描述符的格式不同,以确保基值可以包含 64 位线性地址。它以小端格式占用两个常用条目的表中的空间,使得该条目的下半部分在表中的上半部分之前。
有关详细信息,请参阅英特尔软件开发人员手册第 3-A 卷的第 7.2.3 节:64 位模式下的 TSS 描述符和图 7-4:64 位模式下的 TSS 和 LDT 描述符的格式。
notion image

6 See Also

6.1 Articles

6.2 External references

wiki.osdev.org 系列之(九)- GDT 教程wiki.osdev.org 系列之(八)- 开发教程概述