2014-10-26 46 views
4

我们正在研究名为Pintos的教育操作系统,尝试将其设置为支持虚拟化。我们从32位版本开始,我们的第一步是切换到64位模式并从那里继续。 我们通过Bochs运行Pintos。设置IA32时出现三重故障EFER.LME

我们在英特尔程序员手册(第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因为脱离了由英特尔提出的所有可能的情况下,可能产生三重故障,这个人似乎是唯一合理的原因。

任何想法为什么三重故障正在产生?看起来都很清楚,并且遵循了这些步骤,但内核恐慌发生。

回答

1

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