【问题标题】:Are there multiple LDTs?是否有多个 LDT?
【发布时间】:2018-09-04 18:39:04
【问题描述】:

以下Wikibooks page 声明:

GDT 包含指向每个 LDT 的指针。

我目前正在学习分段,这意味着有多个 LDT。据我所知,只有一个:我读过的多个参考文献都提到了“LDT”,暗示只有一个。引用页面的含义是否正确?意思是“LDT entry”吗?

【问题讨论】:

  • 操作系统可以为系统中每个正在运行的任务或正在运行的线程指定一个单独的LDT。如果使用硬件任务切换(由于性能原因不推荐),CPU 甚至会在任务切换时跟踪(保存/恢复)LDT

标签: x86 x86-64 hardware intel gdt


【解决方案1】:

虽然 lgdt 指令 - 用于设置 GDT - 将 m16&32/64 作为操作数,但 lldt 指令采用 r/m16 操作数。

解读行话,这意味着lgdt 需要一个指向包含GDT 大小和基地址的结构的指针。 另一方面,lldt 采用 段选择器 - 此段选择器必须将 TI(表指示符)字段设置为 0 以指向 GDT.
长话短说,LDT 没有像GDT 那样设置基地址和大小,而是在 GDT 中设置了段描述符——所以它取决于GDT

lldt的段选择器选择的段类型必须是LDT类型(十进制值2)。

如果上述任何条件失败,则会引发#GP。


对于给定的硬件线程和给定的时间点,只能有一个LDT 和一个GDT 处于活动状态。
但是,操作系统可以稍后更改活动的LDTGDT(罕见) - 基于其自己的策略(例如,针对特定进程)。

然而,操作系统很少完全改变GDT,通常它会预先填充它需要的所有段描述符——包括所有必要的LDTs。
在任何情况下,GDT 可以保存多个LDT 段描述符——但在任何给定时间,每个硬件线程只有一个处于活动状态。

【讨论】:

    【解决方案2】:

    LDTR 一次包含单个活动 LDT 的地址。 GDT 可以包含多个 LDT 的条目,这些条目根据需要一次加载到 LDTR。

    【讨论】:

    • 值得一提的是,使用分页的主流操作系统通常实际上并不使用单独的 LDT。 (wiki.osdev.org/…)。内核对所有任务使用相同的共享 LDT,因此不必在上下文切换时更改它。
    猜你喜欢
    • 2020-10-24
    • 2012-02-09
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多