全局描述符表详解:x86 内存管理的基石

全局描述符表 :

  • 全局描述符表是一种数据结构,从 80286 开始,Intel x86 系列处理器就开始使用它来定义程序执行期间使用的各个内存区域(段)的特征,包括大小、基址以及读写和可执行等访问权限。
  • 英特尔公司是一家美国科技公司和跨国企业。其总部位于加利福尼亚州圣克拉拉的硅谷。英特尔公司是全球最大的半导体芯片制造商。它还开发了 x86 系列微处理器。
  • x86 是一系列微处理器,我们可以在大多数个人计算机 中找到它们。
  • Intel 80286 也被称为 iAPX 286Intel 286 它是一款 16 位微处理器,于 1982 年 2 月 1 日发布。它是第一款基于 8086 的 CPU,拥有独立的数据总线和非多路复用地址。它也是第一款具有内存管理和强大保护能力的 CPU。

结构 :

确切地说,在 Intel 架构的保护模式下,中断服务程序和内存管理本质上是由描述符表来管理的。每个描述符保存着关于单个对象的信息,例如;一个任务、一个服务程序、一部分数据或代码等,这些是 CPU 在某些时候可能需要的。如果有人试图向段寄存器填充一个新值,CPU 需要执行安全和访问控制检查,以确定你是否真的被允许访问那个指定的内存区域。如果这些检查成功执行,有用的值会被缓存在 CPU 的不可见寄存器中。Intel 定义了 3 种类型的表,如下所示。

  • 中断描述符表(它取代了 IVT)
  • 全局描述符表 (GDT)
  • 局部描述符表 (LDT)

注意 –

所有上述表都通过 LIDT、LGDT、LLDT 指令依次向 CPU 表示为一个线性地址和大小。在大多数情况下,操作系统直接在启动时通知这些表的位置,然后显然,操作系统通过指针去写入或读取这些表。

GDT 概述 :

全局描述符表包含告诉 CPU 有关内存段的条目。它是 IA32 架构特有的。

组成 :

在这里,我们将逐步理解 GDT 的组成,如下所示。

步骤-1 :

通过使用 LGDT 汇编指令,GDT 被加载。它会寻找 GDT 描述结构的地址。:

GDTR
步骤-2 :

在这里,Offset 是描述符表的线性地址,这意味着分页适用,而这里的 Size 是描述符表的大小减去 1。描述符表的大小减去 1 是因为 65535 是大小的最大值,但 GDT 最大只能为 65536 字节(这意味着条目最多为 8192 个)。此外,任何 GDT 的大小都不能为 0。

步骤-3 :

GDT 包含 8 字节的条目,每个条目具有如下所示的复杂结构。

GDT Entry
步骤-4 :

在这里,Limit 0:15 意味着该字段携带限制值的 0-15 位。Base 有 32 位值,包含段开始的线性地址,这里的 20 位值表示最大可寻址单元(以 1 字节为单位或以页为单位)。因此,如果有人选择页粒度,例如 4 KiB,然后将限制值设置为 0xFFFFF,这里的段将覆盖 4 GiB 的地址空间。以下是标志位和访问字节的组成,如下所示。

GDT Bits
步骤-5:
符号描述 –

  • Pr –

它代表存在位。对于所有有效的段,它应该是 1 位。

  • Privl –

它代表特权级。它应该包含 2 位,其中环级别 0 = 最高(内核),3 = 最低(用户应用程序)。

  • S –

它代表描述符类型。对于数据段或代码必须设置它,对于系统段(例如,任务状态段)应该为空。

  • Ex –

它代表可执行位。如果 Ex 为 1,则该段中的代码可以被执行(即,代码选择子),如果 Ex 为 0,则它是数据选择子。

  • DC –

它代表方向位,也称为 conforming 位。它指示方向。如果 DC = 0,则段向上增长,如果 DC = 1,则段向下增长(意味着限制值小于偏移量)。

步骤-6:
代码选择子的 Conforming 位 –

如果为 1,则给定段中的代码可以从相等或更低的特权级别执行。例如,环 3 的代码可以远跳转到环 2 的 conforming 代码

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/39976.html
点赞
0.00 平均评分 (0% 分数) - 0