LDT 和 GDT 在英特尔 x86 中的使用方式有何不同?

How are LDT and GDT used differently in intel x86?

我知道这两个表都包含段描述符,提供每个段的访问详细信息,包括基地址、类型、长度、访问权限...等。

看这个blog描述区别如下:
1. GDT在系统中只有一份而LDT可以有很多份
2. GDT在执行过程中可能不会改变,而LDT在任务切换时经常改变
3. LDT的条目保存在GDT中。 GDT 和 LDT 中的条目具有相同的结构。

系统在实际程序中如何不同地使用这些结构?

GDT 用于存储包含主管代码的内存块,例如 interrupt/exception 处理程序,以及内核本身使用的块,因此它们是系统范围的。

OTOH,多任务 OS 必须存储组成特定任务的内存块在内存中的位置。为此,每个任务可以使用一个单独的 LDT。切换过程涉及将不同的 LDT 加载到 LDTR 寄存器。

每个任务都可以看到其描述符在当前LDT或GDT中被引用的内存块。对于用户模式内存访问,它将使用本地描述符。对于系统调用,它可以使用各种技术,例如 INT 指令。该指令有效地跳转到驻留在 GDT 描述符中的代码。我不记得调用门是特定于 GDT 还是它们也可以用于 LDT。