2

我读到 LDT(本地描述符表)在 64 位架构中不存在,并且想知道如何模拟使用它的 32 位系统。

4

1 回答 1

6

你的前提不正确。即使在运行 64 位内核时,x86-64 仍然可以使用 LDT。 lldt在 64 位模式下有效。更具体地说,评论是否需要 LDT?表示 64 位 Windows 禁止使用它,但这只是 Windows,而不是 x86-64 ISA。例如,x86-64 Linux 仍然支持modify_ldt()系统调用。(IIRC,Linux 并没有费心添加功能来让您使用它创建 64 位代码段。但纯粹的 32 位进程不需要这样做。)

但这仅与需要创建 LDT 条目的 32 位用户空间进程相关。

您询问的是 32 位系统,即引导一个根本不知道 x86-64 的旧内核。

传统模式(即运行 32 位内核)的 x86-64 CPU 与根本不支持 64 位模式的 CPU 完全相同。(除非您将某些位放在正确的位置,它将切换到 64 位模式。)因此,具有 64 位能力的 CPU 与运行完全 32 位系统无关。


如果您真正的意思是emulated,那么底层硬件是无关紧要的。用任何图灵完备的语言编写您的模拟器,并包含该功能。(或使用现有的,如 BOCHS 或 Qemu。)

如果您指的是硬件虚拟化(例如 Intel VT 或 AMD-V),那么 VM 来宾可以做任何它想做的事情,包括在传统模式下运行并启动 32 位 Windows 或在真实的、受保护的、或长模式。主机VM是否运行64位Windows或其他无关紧要,来宾的LDT是它自己的事情,不涉及主机上的LDT。

如果你的意思是没有硬件支持的虚拟化,就像在 Intel VT 和 AMD-V 之前的糟糕的过去那样,那就更难了,但是虚拟机管理程序在任何来宾之外,所以它们仍然相互独立。这很难,因为 x86 有一些“敏感”(在虚拟化意义上)指令不会陷入困境。这就是为什么大多数人只在硬件支持的情况下进行 x86虚拟化。如果这不可用,只需进行模拟,例如使用 BOCHS 或 Qemu 的 JIT 动态重新编译。

于 2020-07-24T06:48:22.393 回答