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

我们已经在《英特尔程序员手册》(第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,因为在Intel建议的所有可能产生三重故障的情况下,这似乎是唯一合理的原因。

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

最佳答案

我们终于设法解决了这一烦人的问题。原来,我们用来模拟Pintos bochs的虚拟机未配置为在64位模式下运行。正确配置后,即可进行首次尝试。

09-25 16:29