bootsektor schreiben
-
hallo
ich versuche grad (einfach aus interesse) einen eigenen bootsektor zu schreiben und meinen rechner direkt damit zu booten..jetzt hab ich folgendes beispiel gefunden:; start hellocyberspace.asm
; 2.ASM
; Print "Hello Cyberspace!" on the screen and hang; Tell the compiler that this is offset 0.
; It isn't offset 0, but it will be after the jump.
[ORG 0]jmp 07C0h:start ; Goto segment 07C0
; Declare the string that will be printed
msg db 'Hello Cyberspace!'start:
; Update the segment registers
mov ax, cs
mov ds, ax
mov es, axmov si, msg ; Print msg
print:
lodsb ; AL=memory contents at DS:SIcmp al, 0 ; If AL=0 then hang
je hangmov ah, 0Eh ; Print AL
mov bx, 7
int 10hjmp print ; Print next character
hang: ; Hang!
jmp hangtimes 510-($) db 0
dw 0AA55h
; end hellocyberspace.asmdas ganze kompiliert mit "nasm hellocyberspace.asm -o hellocyberspace.bin"
so, wenn ich jetzt mit meinem disk-editor den inhalt dieser bin-datei auf den bootsektor meines usb-sticks schreibe und meinen rechner starte, bekomme ich beim booten folgendes:
"Searching for Boot Record from USB RMD-HDD..OK"
...und sonst nix weiter...die Meldung "Hello Cyberspace!" wird nicht angezeigt. Woran kann das liegen; klappt es bei euch?
Danke,
Martin
-
Hi, das hier ist jetzt ein ganz anderer Code, aber mit dem geht es. Den habe ich von http://lowlevel.brainsware.org/index.php?pagename=home . Auf der Seite gibt es auh noch andere Tutorials über OS Development.
org 0x7C00 ; Unsere Startadresse ; ----------------------------------------- ; Unser Bootloader ; ----------------------------------------- start: ; Erst brauchen wir einen Stack. cli ; Keine Interrupts! mov ax, 0x9000 ; Stackadresse mov ss, ax ; SS = 9000 (unser Stack) mov sp, 0 ; SP = 0000 (der Stackpointer) sti ; Interrupts zulassen ; Bootlaufwerk aus DL speichern mov [bootdrv], dl ;Lade unseren Kernel call load ;Springe zu diesem Kernel mov ax, 0x1000 ; Die Adresse des Programms mov es, ax ; Segmentregister updaten mov ds, ax push ax mov ax, 0 push ax retf ; ---------------------------------------------- ; Funktionen und Variablen ; ---------------------------------------------- bootdrv db 0 ;Das Bootlaufwerk loadmsg db "Loading...",13,10,0 ; Einen String ausgeben: putstr: lodsb ; Byte laden or al,al jz short putstrd ; 0-Byte? -> Ende! mov ah,0x0E ; Funktion 0x0E mov bx,0x0007 ; Attribut-Byte (wird nicht ben�tigt) int 0x10 ; schreiben jmp putstr ; N�chstes Byte putstrd: retn ; Lade den Kernel vom Bootlaufwerk load: ; Diskdrive reset (Interrupt 13h, 0) push ds ; Sichere DS mov ax, 0 ; Die gew�nschte Funktion (reset) mov dl, [bootdrv] ; Dieses Laufwerk ist gew�nscht int 13h ; Den Interrupt ausf�hren pop ds ; DS wiederherstellen jc load ; Geht nicht? -> Noch mal! load1: mov ax,0x1000 ; ES:BX = 10000 mov es,ax mov bx, 0 ; Sektoren lesen (Interrupt 13h, 2) mov ah, 2 ; Funktion 2 (Lesen) mov al, 5 ; Lese 5 Sektoren mov cx, 2 ; Cylinder=0, Sector=2 mov dx, 0 ; Head=0, Laufwerk=0 int 13h ; ES:BX = Daten vom Laufwerk jc load1 ; Fehler? Noch mal! mov si,loadmsg call putstr ; Meldung ausgeben retn times 512-($-$$)-2 db 0 ; Dateil�nge: 512 Bytes dw 0AA55h ; Bootsignatur
-
hi
ja, auf der seite bin ich auch mittlerweile gelandet...
der code funktioniert bei dir? hast du es von floppy oder von usb stick gebootet?
ich habe nämlich kein floppy-laufwerk, und würde gern wissen, ob und was ich beachten muss, wenn ich das von usb-stick booten will!
versuchs bitte mal von usb zu booten und sag mir wie dus gemacht hast (falls du es hinbekommst)danke,
martin
-
Ne von USB hab ichs nicht gebootet, weil ich keinen USB-Stick habe. Ich habe das mit QEMU gemacht.
-
Hab was vergesse: Du musst natürlich noch den Kernel von der Seite assemblieren und mit dem Bootloader zusammenkopieren.
-
Hallo Sancho,
du hast gar keinen Stack eingerichtet. Spätestens beim Interruptaufruf wird der aber wichtig...
Und du verbietest auch nicht die Interrupts (cli), ob das so wichtig ist weiß ich aber nicht.Ansonsten sieht das ganz gut aus, normalerweise vergisst man ja die Bootsektorsignatur, aber die ist ja drin.
Viel Erfolg noch und Spaß dabei,
Jenz