Тройная ошибка при настройке 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-битном режиме. После того, как были сделаны правильные конфигурации, это сработало с первой попытки.

Другие вопросы по тегам