0

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 $と、プログラムは正しく停止しますが、ロングジャンプが完了すると、マシンが再起動します。

セグメントなどを設定するのを忘れましたか?

4

1 に答える 1