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, ax

    mov si, msg ; Print msg
    print:
    lodsb ; AL=memory contents at DS:SI

    cmp al, 0 ; If AL=0 then hang
    je hang

    mov ah, 0Eh ; Print AL
    mov bx, 7
    int 10h

    jmp print ; Print next character

    hang: ; Hang!
    jmp hang

    times 510-(-$) db 0
    dw 0AA55h
    ; end hellocyberspace.asm

    das 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


Anmelden zum Antworten