Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: TPSeverino am 01. March 2005, 20:52
-
Da mir die 512 Bytes für den Bootloader nicht ausreichen bevor ich in den PMode schalte, will ich meinen Bootloader teilen. Der erste Teil lädt (unter anderem :-) ) den Code des zweiten Teils des Bootloaders in den Speicher und führt in aus. Im zweiten Teil soll der PMode aktiviert werden. Nun funktioniert der Code, welcher vor dem Teilen funktioniert hat, nicht mehr.
Ich denke es liegt daran dass die Adresse der GDT nicht mehr stimmt...
Hier der Code des zweiten Teils meines Bootloaders, welcher in den PMode schalten soll. Er liegt an 1000h:0000h im Speicher.
cli
call _enable_a20
xor ax ,ax
mov ax, ds
gdt [gdt_descriptor]
mov eax, cr0
or eax, 1
mov cr0, eax
jmp gdt_code:_init
[bits 32]
_init:
mov ax, 10h
mov ds, ax
mov es, ax
mov ss, ax
mov esp, 090000h
jmp $
; Es folgen Funktionen und Variablen
THX
-
wenn du den Code mit nasm compilierst, solltest du
[ORG 0x10000]
davor schreiben. Sollte dann auch die Richtige Adresse für die GDT haben.
-
Hab beide geändert. Sobald der Far-Jump gemacht wird, bricht BOCHS mit dem Fehler "3rd (13) exception without resolution" ab ....
-
@blueXseven:
Warum sollte er den Wert des Datensegments nach AX speichern, und diesen dann in ES und SS ablegen?
-
so hab ich das auch verstanden... ne ahnung woran es noch liegen könnte??
-
also für alle, die es interessiert... der Far-Jump ging an die falsche Stelle, deswegen ist er abgeschmiert.
-
ein tipp an alle: baut eure GDT-Pointer in den 0-Deskriptor ein, funktioniert bei mir hervorragend und is schön leicht zu handhaben! und spart noch 3 bytes 8)