Komischerweise funktioniert mein PMode-Jump nicht mehr. Das GDTR wird nämlich nicht richtig geladen. Ich werd nicht schlau aus meinem Code, es liegt sicher an einem lächerlichen Fehler, den irgendwer sofort finden wird:
XOR EAX, EAX ; GDT einrichten, um danach in den PM zu schalten
MOV DS, EAX
MOV ES, EAX
MOV ESI, Desc0
XOR EDI, EDI
MOV ECX, EndOfGDT-Desc0
REP MOVSB
LGDT [GDT]
MOV EAX, CR0
OR EAX, 1
MOV CR0, EAX
JMP 8h:PMStart
BITS 32
PMStart:
MOV AX, 2<<3 ; Selektoren zuweisen
MOV DS, AX
MOV ES, AX
MOV AX, 3<<3
MOV SS, AX
MOV ESP, 0FFFh
MOV EBP, ESP
XOR AL, AL ; Bildschirm löschen
MOV ECX, 320*200 ; (bei Platzproblemen weglassen)
MOV EDI, 0A0000h
REP STOSB
MOV ECX, KERNEL_SIZE*512 ; Kernel von 30000h nach 100000h kopieren
MOV ESI, 30000h
MOV EDI, 100000h
REP MOVSB
JMP 100000h ; Zum Kernel springen, der den Rest initialisiert:
; IDT, IRQs
; --------------------
; Daten
; --------------------
GDT:
DW 10000h ; Limit
DD 0 ; Basisadresse
Desc0: ; Null
DW 0
DW 0
DB 0
DB 0
DB 0
DB 0
Desc1: ; Systemcode 0 - 7F F000h
DW 07FFh
DW 0000h
DB 00h
DB 10011010b
DB 11000000b
DB 00h
Desc2: ; Systemdaten 0 - 7F F000h
DW 07FFh
DW 0000h
DB 00h
DB 10010010b
DB 11000000b
DB 00h
Desc3: ; Temp. Stack
DW 00FFFh ; Grösse 4 KB
DW 8000h ; Basis 8000h
DB 00h
DB 10010010b
DB 01000000b
DB 00h
EndOfGDT: