Тройная ошибка при настройке IA32 EFER.LME
Мы работаем над образовательной операционной системой под названием Pintos, пытаясь настроить ее для поддержки виртуализации. Мы начинаем с версии, работающей на 32-битной версии, и нашим первым шагом будет переключение в 64-битный режим и продолжение с этого момента. Мы запускаем Пинтос через Бохса.
Мы рассмотрели шаги, чтобы сделать это в Руководстве по программированию Intel (глава 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, которые могут вызвать тройной сбой, этот показался единственной разумной причиной.
Есть идеи, почему возникает тройной недостаток? Все кажется ясным, и шаги выполняются, все еще происходит атака паники ядра.
1 ответ
Нам наконец удалось решить эту досадную проблему. Оказалось, что виртуальная машина, которую мы использовали для эмуляции Pintos, bochs, не была настроена для работы в 64-битном режиме. После того, как были сделаны правильные конфигурации, это сработало с первой попытки.