Moin,
Ich beschäftige mich seit einer Weile mit dem Thema des bootloaders.
Bei meinem kleinen loader kommt es allerdings zu einem für mich merkwürdigen verhalten.
Ich hoffe nur das mir jemand beschreibt warum dieses Verhalten auftritt.
Und zwar habe ich einen kleinen bootloader der den zweiten Sector einer Floppy einliest, ihn dann in 0x1000:0x0000
speichert und anschliesend an diese Stelle springt. Wenn ich den jmp Befehl an diese Position ausführe Passiert jedoch nichts.
Dabei sind mir jedoch folgende verhalten aufgefallen:
Der bootloader
Der "kernel"
Ich hoffe ihr könnt mir dieses Verhalten erläutern.
Großen Dank im vorraus!
Ps: Ich arbeite unter Linux (Fedora 16) falls das irgendwie behilflich sein könnte
Ich beschäftige mich seit einer Weile mit dem Thema des bootloaders.
Bei meinem kleinen loader kommt es allerdings zu einem für mich merkwürdigen verhalten.
Ich hoffe nur das mir jemand beschreibt warum dieses Verhalten auftritt.
Und zwar habe ich einen kleinen bootloader der den zweiten Sector einer Floppy einliest, ihn dann in 0x1000:0x0000
speichert und anschliesend an diese Stelle springt. Wenn ich den jmp Befehl an diese Position ausführe Passiert jedoch nichts.
Dabei sind mir jedoch folgende verhalten aufgefallen:
- Wenn ich den 1 Sector der Floppy einlese und dann an die neue Position springe, passiert genau das was ich erwarte, der Rechner rebootet
- Wenn ich den Rest des zweiten Sectors mit Nullen auffülle und die Standart boot Signatur anhänge wird der zweite Sector ausgeführt, so wie ich es will
- Dies geschieht auch wenn ich "times 512-($-$$) hlt" anhänge. (Das kommt mir aber mehr als unsauber vor, hab ich auch nur mal kurz ausprobiert
)
Der bootloader
Code: [Auswählen]
BITS 16
org 0x7C00
start:
;erzeuge Stack
cli
mov ax, 0x9000
mov ss, ax ;stack nach 0x9000
mov sp, 0 ;stackpointer auf anfang
mov ax, 0x0000 ;
mov es, ax ;Setzt das Datensegment nach 0x0000
mov ds, ax ;
sti
;Stack erzeugt an Pos. 0x7F00
call test
;--------------Kernel laden---------------
call read_floppy ;Kernel aus 2tem Sektor laden
cli ;keine interupts
mov ax, 0x1000 ;Datensegment zur neuen Kernel Pos.
mov es, ax
mov ds, ax
sti ;interupts an
jmp 0x1000:0x0000 ;wechsel zum kernel
;------------------------------------------
call reboot
read_floppy:
mov ah, 0x02 ;int funktion 0x02
mov bx, 0x1000
mov es, bx ;read into 1000:0000
mov bx, 0x0000 ;offset 0
mov al, 1 ; 1 Sektor lesen
mov ch, 0 ; auf Track 0
mov cl, 2 ; Sektor 2
mov dh, 0 ; Auf head 0 (oben)
mov dl, 0 ;Auf std. Floppy
int 0x13
jc read_floppy ;wenn fehler, neu versuchen (jc = jump if carry)
ret
test:
mov ah, 0x0E
mov al, 0xA5
int 0x10
ret
reboot:
;jmp 0xffff:0x0000
mov ax, 0
int 0x16
int 0x19
times 510-($-$$) db 0 ; Setzt die boot signatur am ende des boot Sectorsc
dw 0xAA55 ; The standard PC boot signature
Der "kernel"

Code: [Auswählen]
org 0x1000
jmp start
start:
call test
hlt
test:
mov ah, 0x0E
mov al, 0x68
int 0x10
ret
times 512-($-$$) hlt
;times 510-($-$$) db 0 ; Setzt die boot signatur am ende des boot Sectorsc
;dw 0xAA55 ; The standard PC boot signature
Ich hoffe ihr könnt mir dieses Verhalten erläutern.
Großen Dank im vorraus!
Ps: Ich arbeite unter Linux (Fedora 16) falls das irgendwie behilflich sein könnte

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert

