0

我正在浏览 GDT。我可以了解数据结构的实现方式及其用途。

但是,我不明白 GDT 是如何使用的。CPU需要加载段的场景是什么?GDT是如何做到的?如果 GDT 涉及键盘驱动的中断,那将是一个很好的解释示例。

4

2 回答 2

0

GDT 或全局描述符表包含有关内存段的信息。GDT 的地址存储在称为 GDTR 的特殊寄存器之一中。每个段映射到一个内存区域。该段的目的是提供硬件内存保护。CPU 并不真正加载整个段,因为段通常指的是内存区域。相反,当您使用具有偏移量的段寄存器(CS、DS、SS 等)之一来寻址内存区域时,CPU 将使用存储在 GDT 中的信息执行检查。例如,如果您将其中一个段设置为只读,然后您尝试写入它,cpu 将阻止访问。对于系统确实使用段,每次有人访问内存时都会涉及 GDT。

今天的操作系统很少使用段。他们中的大多数建立了“平面内存模型”,每个段跨越整个内存空间。分页和虚拟内存用于内存保护。段的存在主要是因为向后兼容。您可以在osdev上阅读有关 GDT 的更多信息

于 2019-05-08T00:42:43.757 回答
0

对于不使用分段(很多)的现代操作系统;您可能会发现 GDT 包含:

  • “CPL=0”和“CPL=3”代码的 2 或 3 个描述符(如果 64 位操作系统支持较旧的 32 位进程,那么它可能具有“32 位 CPL=3 代码”和“64 位 CPL” =3 代码”,除了“64 位 CPL=0 代码”)
  • “CPL=0”堆栈的描述符
  • “CPL=3”堆栈和数据的描述符
  • CPU 的 TSS(任务状态段)的每个 CPU 的描述符
  • 对于 32 位(对于可以使用的 64 位而言,不是那么多swapgs)每个 CPU 有一个或两个描述符,用于查找“CPU 本地”数据和/或“线程本地”数据
  • (可选,不太可能);为内核 API 定义调用门的描述符
  • (可选,用于特殊目的);一个或多个描述 LDT 的描述符(有时用于仿真)

对于其他操作系统,GDT 可以包含任何内容。

于 2019-05-08T03:20:31.517 回答