如果 LDT 在 64 位架构中不存在,如何在 64 位架构上模拟使用它的 32 位系统?

If LDT does not exist in 64-bit architecture how are 32-bit systems that use it emulated on a 64-bit architecture?

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

你的前提不正确。即使 运行 使用 64 位内核,x86-64 仍然可以使用 LDT。 lldt is valid in 64-bit mode. More specifically, a comment on Is an LDT needed? 表示 64 位 Windows 禁止使用它,但这只是 Windows,而不是 x86-64 ISA。例如,x86-64 Linux 仍然支持 modify_ldt() 系统调用。 (不过,IIRC,Linux 并没有费心去添加功能来让你用它创建 64 位代码段。但是一个纯粹的 32 位进程不需要这样做。)

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

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

传统模式下的 x86-64 CPU(即 运行 32 位内核)与不支持 64 位模式的 CPU 完全相同根本。 (除了如果你把某些位放在正确的位置它会切换到 64 位模式。)所以 CPU 是 64 位能力真的与 运行 宁一个完整的 32-位系统。


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

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

如果你指的是没有硬件支持的虚拟化,就像在 Intel VT 和 AMD-V 之前的糟糕日子里那样,那就更难了,但是管理程序在任何来宾之外,所以它们仍然相互独立。这很难,因为 x86 有一些 "sensitive" (in the virtualization sense) 指令不会陷入困境。这就是为什么大多数人只在硬件支持下进行 x86 虚拟化 的原因。如果那不可用,就模拟一下,比如 BOCHS,或者 Qemu 的 JIT 动态重新编译。