64 ビットで非常に単純なオペレーティング システムを作成しようとしています。最初に保護モードに入ろうとしていますが、この時点で失敗しています。
32 ビットにファー ジャンプすると、マシンが再起動します。
私のコードは、アドレス 0x100 の別のアセンブリ プログラムでメモリにロードされます。
コードはnasmでコンパイルされており、qemu -fda
.
これまでに取得したコードは次のとおりです。
[BITS 16]
jmp _start
_start:
cli
lgdt [GDT64]
; Switch to protected mode
mov eax, cr0
or al, 1b
mov cr0, eax
; Desactivate pagination
mov eax, cr0
and eax, 01111111111111111111111111111111b
mov cr0, eax
jmp (CODE_SELECTOR-GDT64):pm_start
[BITS 32]
pm_start:
jmp $
GDT64:
NULL_SELECTOR:
dw GDT_LENGTH ; limit of GDT
dw GDT64 ; linear address of GDT
dd 0x0
CODE_SELECTOR: ; 32-bit code selector (ring 0)
dw 0x0FFFF
db 0x0, 0x0, 0x0
db 10011010b
db 11001111b
db 0x0
DATA_SELECTOR: ; flat data selector (ring 0)
dw 0x0FFFF
db 0x0, 0x0, 0x0
db 10010010b
db 10001111b
db 0x0
LONG_SELECTOR: ; 64-bit code selector (ring 0)
dw 0x0FFFF
db 0x0, 0x0, 0x0
db 10011010b ;
db 10101111b
db 0x0
GDT_LENGTH:
ロングジャンプの前に実行するjmp $
と、プログラムは正しく停止しますが、ロングジャンプが完了すると、マシンが再起動します。
セグメントなどを設定するのを忘れましたか?