64-bit - 设置 IA32 EFER.LME 时出现三重故障

标签 64-bit virtualization pintos

我们正在开发一种名为 Pintos 的教育操作系统,试图对其进行设置以支持虚拟化。我们从在 32 位上运行的版本开始,我们的第一步是切换到 64 位模式并从那里继续。
我们正在通过 Bochs 运行 Pintos。

我们在 Intel Programmer's Manual(第 9.8.5 章,第 3 卷)中查找了执行此操作的步骤,并且当我们想要将 IA32 EFER.LME 位设置为 1 以启用 IA32e 模式时,系统会生成三重故障并再次从头开始工作。

这是我们一直在处理的代码。

#Step 1: Disable paging CR0_PG = 0. Use MOV CR0 instr. to disable paging (instr. must be located in an identity-mapped page.
    movl %cr0, %eax
    andl $0x7fffffff, %eax
    movl %eax, %cr0

#Step 2: Enable physical-address extensions by setting CR4_PAE = 1
    movl %cr4, %eax
    orl $CR4_PAE, %eax
    movl %eax, %cr4

#Step 3: Load CR3 with the physical base address of the level 4 page map table PML4
    movl $0xe000, %eax
    movl %eax, %cr3

    xchg %bx, %bx
#Step 4: Enable IA-32e mode by setting IA32_EFER_LME = 1
    movl $0xc0000080, %ecx
    rdmsr
    or $IA32_EFER_LME, %eax
    wrmsr

#Step 5: Enable paging CR0_PG = 1.
    movl %cr0, %eax
    orl $CR0_PG, %eax
    movl %eax, %cr0

我们已尝试设置我们自己的 TSS,因为在英特尔建议的所有可能产生三重故障的情况中,这似乎是唯一合理的原因。

任何想法为什么会产生三重故障?一切似乎都清楚了,并且按照步骤进行了操作,但内核 panic 攻击仍然发生。

最佳答案

我们终于设法解决了这个烦人的问题。事实证明,我们用来模拟 Pintos 的虚拟机 bochs 并未配置为在 64 位模式下运行。一旦进行了正确的配置,它就会在第一次尝试中起作用。

关于64-bit - 设置 IA32 EFER.LME 时出现三重故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26575538/

相关文章:

c++ - 如何最轻松地预取内存区域?

python - Cython 无法在 Windows 7 x64 上编译

docker - docker for Windows 是否可以实现 GPU 直通?

linux - 虚拟化环境下的CLFLUSH

linux - Pintos 编程项目 2

memory-management - 为什么内核有一个单独的用户页面虚拟地址?

ruby - 如何在 x64 Linux 上安装 Ruby Shoes?

sql-server - 适用于 Windows7 64 位的 Golang MSSQL 驱动程序

virtual-machine - 无法为虚拟机打开 session

c - Bochs 中的 PintOS 安装