Я делаю это согласно книге Ника Бланделла. Я пишу программу MBR, которая сначала запускается в реальном режиме, а некоторые команды в программе будут переключать процессор в защищенный режим. Сначала я поставил GDT так:Мне не удалось переключить процессор из реального режима в защищенный режим
gdt_start:
gdt_null:
dd 0x0
dd 0x0
gdt_code:
dw 0xffff
dw 0x0
db 10011010b
db 11001111b
db 0x0
gdt_data:
dw 0xffff
dw 0x0
db 0x0
db 10010010b
db 11001111b
db 0x0
gdt_end:
gdt_descriptor :
dw gdt_end - gdt_start - 1
dd gdt_start
CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start
Затем процессор выполняет следующие инструкции:
cli
lgdt [gdt_descriptor]
mov eax,cr0
or eax,0x1
mov cr0,eax ;this will set the cpu to protected-mode
;jmp $ ;I use this instrction to find where is wrong
jmp CODE_SEG:init_pm
jmp $
[bits 32]
init_pm:
jmp $
mov ax,10
jmp $
mov ds,eax
mov ss,eax
jmp $
mov es,ax
mov fs,ax
mov gs,ax
mov ebp,0x90000
mov esp,ebp
call BEGIN_PM
Инструкция jmp CODE_SEG:init_pm
заставит процессор сбой и перезагрузка. Если я изменю это на jmp init_pm
, следующая инструкция mov ax,10
приведет к сбою процессора и его перезапуску. И в книге говорилось, что операция переключения требует длительного прыжка.
Не могли бы вы помочь мне выполнить операцию переключения?
Я думаю, что современные процессоры позволяют использовать инструкцию 'zif', чтобы избежать дробления. –
И попробуйте [чтение OSDev] (http://wiki.osdev.org/Protected_Mode) перед чем-либо еще, что охватывает большинство основ. –