Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: TPSeverino am 01. March 2005, 20:52

Titel: Bootloader teilen
Beitrag 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
Titel: Bootloader teilen
Beitrag von: Ironfoot am 01. March 2005, 21:00
wenn du den Code mit nasm compilierst, solltest du


[ORG 0x10000]


davor schreiben. Sollte dann auch die Richtige Adresse für die GDT haben.
Titel: Bootloader teilen
Beitrag von: TPSeverino am 01. March 2005, 21:19
Hab beide geändert. Sobald der Far-Jump gemacht wird, bricht BOCHS mit dem Fehler "3rd (13) exception without resolution" ab ....
Titel: Bootloader teilen
Beitrag von: Ironfoot am 01. March 2005, 21:22
@blueXseven:
Warum sollte er den Wert des Datensegments nach AX speichern, und diesen dann in ES und SS ablegen?
Titel: Bootloader teilen
Beitrag von: TPSeverino am 01. March 2005, 21:48
so hab ich das auch verstanden... ne ahnung woran es noch liegen könnte??
Titel: Bootloader teilen
Beitrag von: TPSeverino am 02. March 2005, 15:02
also für alle, die es interessiert... der Far-Jump ging an die falsche Stelle, deswegen ist er abgeschmiert.
Titel: Bootloader teilen
Beitrag von: joachim_neu am 02. March 2005, 16:35
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)