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因爲脫離了由英特爾提出的所有可能的情況下,可能產生三重故障,這個人似乎是唯一合理的原因。
任何想法爲什麼三重故障正在產生?看起來都很清楚,並且遵循了這些步驟,但內核恐慌發生。