全局描述符 table(GTD) 的现代用法是什么?

What is the modern usage of the global descriptor table(GTD)?

看了半天,真是一头雾水。 据我所读:

  1. 现代 OS 根本不使用段。

  2. GDT用于在内存中定义一个段(包括约束)。

  3. 页面 table 有一个主管位,指示当前位置是否为内核。

  4. 维基百科说“GDT 在 64 位模式下仍然存在;必须定义 GDT,但通常不会更改或用于分段。”

我们为什么需要它? linux 如何使用它?

  1. Modern OS does not use segments at all.

现代OS(64位80x86)仍然使用段寄存器;只是它们的使用在 user-space 中“大部分隐藏”了(并且大多数 user-space 代码可以忽略它们)。具体来说; CPU 将从 OS 加载(从 GDT 或 LDT)到 CS 的任何代码确定代码是否为 64 位(或 32 位或 16 位),中断仍然保存CSSS 用于中断的代码(并在 iret 处再次加载它们), GS and/or FS 通常用于 thread-local and/or CPU 本地存储等

  1. The GDT is used to define a segment in the memory (including constraints).

代码和数据段只是 GDT 的用途之一。另一个主要用途是定义任务状态段的位置(用于查找 IO 端口权限映射、当中断导致特权级别更改时加载到 CS、SS 和 RSP 的值等)。 64 位代码(以及 64 位内核下的 32 位 code/processes 运行)仍然可以使用 GDT 中定义的调用门,但大多数操作系统不使用该功能对于 64 位代码(他们使用 syscall 代替)。

  1. The page table has a supervisor bit that indicates if the current location is for the kernel.

是的。页面 table 的管理员位决定 CPL=3 can/can 处的代码 运行 是否访问该页面(或者代码是否必须为 CPL=2、CPL=1 或 CPL= 0 访问页面)。

  1. Wikipedia says that "The GDT is still present in 64-bit mode; a GDT must be defined but is generally never changed or used for segmentation."

是的 - 维基百科是正确的。通常,OS 会在引导早期设置 GDT(用于 TSS、CS、SS 等),然后没有任何理由在引导后修改它;并且段寄存器不用于“分段内存保护”(但用于其他事情 - 确定代码大小,中断处理程序是否应该 return 到 CPL=0 等)。