【发布时间】:2020-11-13 21:39:33
【问题描述】:
我读到 LDT(本地描述符表)在 64 位架构中不存在,想知道如何模拟使用它的 32 位系统。
【问题讨论】:
标签: assembly x86 x86-64 instruction-set gdt
我读到 LDT(本地描述符表)在 64 位架构中不存在,想知道如何模拟使用它的 32 位系统。
【问题讨论】:
标签: assembly x86 x86-64 instruction-set gdt
你的前提不正确。即使在运行 64 位内核时,x86-64 仍然可以使用 LDT。 lldt 在 64 位模式下有效。更具体地说,Is an LDT needed? 上的评论表明 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 位系统无关。
如果您真正的意思是模拟,那么底层硬件是无关紧要的。用任何图灵完备的语言编写您的模拟器,并包含该功能。 (或使用现有的,如 BOCHS 或 Qemu。)
如果您指的是硬件虚拟化(例如 Intel VT 或 AMD-V),那么 VM 来宾可以做任何它想做的事情,包括在传统模式下运行并启动 32 位 Windows 或运行您自己的在真实、受保护或长模式下自定义裸机操作系统。主机VM是否运行64位Windows或其他无关紧要,来宾的LDT是它自己的事情,不涉及主机上的LDT。
如果您指的是没有硬件支持的虚拟化,例如在 Intel VT 和 AMD-V 之前的糟糕时代,那就更难了,但是虚拟机管理程序位于任何来宾之外,因此它们仍然相互独立。这很难,因为 x86 有一些不会陷入陷阱的 "sensitive" (in the virtualization sense) 指令。这就是为什么大多数人只在硬件支持的情况下进行 x86 虚拟化。如果这不可用,只需进行模拟,例如使用 BOCHS 或 Qemu 的 JIT 动态重新编译。
【讨论】: