Ошибка медитации VirtualBox Guru при входе в защищенный режим

#assembly #x86 #virtualbox

#сборка #x86 #virtualbox

Вопрос:

Я использую VirtualBox для эмуляции ПК x86. Я написал загрузчик, который переходит в защищенный режим. Но я всегда получаю ошибку Guru Meditation. Вот мой код:

 ; clear interrupts
cli
; set up gdt
xor eax, eax
mov ax, ds
shl eax, 4
add eax, gdt
mov [gdtr   2], eax
mov eax, gdt_end
sub eax, gdt
mov [gdtr], ax
lgdt [gdtr]
; enter protected mode
mov eax, cr0
or  al, 1
mov cr0, eax
; enter kernel
jmp 08h:0
  

Я также тестировал jmp 0x2000: 0000, но это тоже не сработало. Что я делаю не так?

PS: Вот мой GDT-код:

 ; global descriptor table
gdt:
dq 0 ; null descriptor

; code descriptor kernel
dw 0x0000 ; base low word
dw 0x4000 ; limit low word
db 0x00   ; base high byte
db 0x40   ; flags
db 0x9A   ; access byte
db 0x02   ; base center byte

; data descriptor kernel
dw 0x0000 ; base low word
dw 0x4000 ; limit low word
db 0x00   ; base high byte
db 0x40   ; flags
db 0x92   ; access byte
db 0x02   ; base center byte
gdt_end:
  

Комментарии:

1. Например, после публикации полного кода мы не можем определить, поврежден ли ваш gdt. Кроме того, научитесь использовать отладчик.

2. @Jester добавил gdt-код

3. @Jester сложно использовать отладчик, когда вы программируете загрузчик…

4. @BlackBear если вы программируете загрузчик или ОС, ожидается, что вы уже сможете использовать отладчик. Это не особенно сложно, поскольку он использует виртуальную машину: P Вместо этого он не предоставляет нам полный код и ожидает, что мы каким-то образом угадаем недостающие части и отладим его за него.

5. Понятия не имею, это должно быть возможно. Поля в ваших записях GDT перепутаны, порядок должен быть limit low , base low , base center access , flags base high ,,,,,,,,,,,,,.

Ответ №1:

Согласно моему опыту работы с CentOS-6.5, ошибка Guru Meditation возникает, когда вашему приложению требуется больший объем оперативной памяти, чем выделенный объем оперативной памяти или загрузка процессора превышает 100%. Таким образом, увеличение размера выделенной оперативной памяти является одним из решений проблемы

Ответ №2:

Закройте все запущенные виртуальные машины, после этого отключите виртуализацию из bios. Затем перезагрузитесь. А затем включите виртуализацию из bios. Перезагрузка. У меня это сработало