2014-10-26 82 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位模式下運行。一旦完成了正確的配置,它就會在第一次嘗試中起作用。