Bootbare Programme

nabend!
ich möchte seit einiger zeit mit dem programmieren von boot-fähigen programmen anfangen, weiß aber leider wenig darüber.
ich würde gerne später mal so etwas wie einen RAM-Test schreiben (den man dann von CD startet) oder halt ähnliche sachen.

kennt ihr tutorials oder gar bücher dazu?
vllt soetwas wie ein bootbare "Hello World"?

lieblingssprache is C/C++ aber ich denke um ein wenig ASM kommt man nich herum.

mfg,
nidda
 
hej
naja also prinzipiell kannst du das rein in c auch schreiben, kommt drauf an was du damit machen möchtest. du meinst also, dass das programm unter einem betriebssystem startet oder direkt anstatt diesem? unter einem betriebssystem ist das ja nicht so schwer.

die frage geht aber gleich von meiner seite aus weiter:
wie realisiert man eine bootbare CD bzw. wie startet man ohne betriebsystem ein programm dass sich auf einer CD z.b. befindet?

lg
 
das programm soll vor dem betriebssystem starten, also eigendlich mit dem os nichts zu tun haben -> bootfähig oder bootbar (wie auch immer)
 
Hi,

Ein Bootsektor ist nichts anderes als ein 512 Byte großes in 16-Bit Assembler geschriebenes Programm, das mit "0xAA55" aufhört.

Im 16-Bit Modus (Real Mode) kannst du zwar nur 1 MB RAM Adressieren, aber dafür die BIOS Interrupts verwenden um Text auszugeben, auf Laufwerke zuzugreifen u.Ä.
Um aber einen RAM Test zuschreiben, musst du wohl oder übel in den 32-Bit Modus (Protected Mode) oder 64-Bit Modus (Long Mode) schalten. Da kannst du zwar die komplette RAM Adressieren, aber nicht mehr auf die BIOS Ints zugreifen, d.H. du musst selber Treiber für Maus, Tastatur, Festplatte und wenn du Grafik willst auch für Grafikkarte schreiben.

Ich habe mal ein 16-Bit OS geschreiben, welches man als DOS Clone mit weniger Befehlen bezeichnen kann, aber selbst das war Relativ kompliziert.

Du kannst natürlich C und C++ verwenden, musst dabei aber beachten, das du die Includes von Windows/Linux nicht verwednen kannst und selber welche schreiben musst, also auch hier bleibt dir das schreiben eigener Treiber nicht erspart.

Ich kann, wie hamill schon gesagt hat, Lowlevel nur empfehlen, da hab ich meine kompletten Erfahrungen über OS Entwicklung her...
Aber als ich mit dem DOS Fertig war, hab ich mich gefreut wie einfach doch das Programieren unter Windows ist :D

Gruß Chris
 
Hi,

Ich hab grad auf einer meiner DVDs der Source von meinem Bootsektor wiedergefunden...
Der macht nichts anders, als einen oder meherer Sektoren in die RAM zu Laden und dann auszuführen.
Kann zwar kein OS, müsste aber auf alles Datenträgern funktioniren, auf denen das BIOS überhaput probiert zu Booten, da ich die erweiterten Lesefunktionen verwenden...

Hier der Code (NASM-Syntax):

Code:
[BITS 16]
[CPU PentiumPro]

jmp short MainEntryPoint
nop

%define Bootdrive 0x200 + 0x00

%define DiskAdressPacket             0x200 + 0x01
%define DiskAdressPacket.Size        DiskAdressPacket + 0x00
%define DiskAdressPacket.Reserved    DiskAdressPacket + 0x01
%define DiskAdressPacket.Count       DiskAdressPacket + 0x02
%define DiskAdressPacket.Buffer      DiskAdressPacket + 0x04
%define DiskAdressPacket.LBALow      DiskAdressPacket + 0x08
%define DiskAdressPacket.LBAHigh     DiskAdressPacket + 0x0C

MainEntryPoint:
    
    cli         ; Keine Interrupts zulassen
        
        mov AX, 0x07C0  ; Segmentregister updaten
        mov DS, AX      ;
        mov ES, AX      ;
        mov FS, AX      ;
        mov GS, AX      ;
        
        xor AX, 0x9000  ; Stack setzen
        mov SS, AX      ;
        xor SP, SP      ;
        
    sti         ; Interrupts wieder zulassen
    
    mov [Bootdrive], DL ; Bootlaufwerk speichern
    
CheckLBAExtensions:
    
    mov AH, 0x41              ; ExtLBA Installation Check
    mov BX, 0x55AA            ; Test Muster
    mov DL, byte [Bootdrive]  ; Bootlaufwerk
    int 13h                   ; Interrupt 13h ausführen
    
    jb short LBAExtensions.Exception.NotFound    ; Falls ein Fehler auftritt --> Exception auslösen
    
    cmp BX, 0xAA55                                    ; Überprüfen, ob das Testmuster richtig zurückgegeben wurde
    jne short LBAExtensions.Exception.NotFound   ; Falls nein --> Exception auslösen
    
    cmp CL, 00000100b                                 ; Überprüfen, ob das Laufwerk unterstützt wird (ob Bit 3 gesetzt ist)
    je short LBAExtensions.Exception.NoSupport   ; Falls nein --> Exception auslösen
    
    jmp short LoadBootloader  ; Zur Lade Routine des Bootloaders springen
    
    ; Exception, falls Die LBA Erweiteruingen nicht installiert sind
    LBAExtensions.Exception.NotFound:
        mov SI, Error1
        jmp short RaiseError  
        
      ; Exception, falls Die LBA Erweiteruingen nicht verfügbar sind (für das aktuelle Laufwerk)
      LBAExtensions.Exception.NoSupport
        mov SI, Error2
        jmp short RaiseError
           
LoadBootloader:
    
    mov AH, 0x42
    mov DL, byte [Bootdrive]
    mov byte  [DiskAdressPacket.Size], 0x10
    mov byte  [DiskAdressPacket.Reserved], 0x00
    mov byte  [DiskAdressPacket.Count], 0x01
    mov dword [DiskAdressPacket.Buffer], 0x10000000
    mov dword [DiskAdressPacket.LBALow], 0x000000001
    mov dword [DiskAdressPacket.LBAHigh], 0x000000000
    
    mov SI, DiskAdressPacket
    int 13h
    jb LoadBootloader.Exception
    jmp short ShellBootloader
    
    LoadBootloader.Exception:
        mov SI, Error3
        jmp short RaiseError
    
ShellBootloader:
    
    cli         ; Keine Interrupts zulassen
        
        mov AX, 0x07C0  ; Segmentregister updaten
        mov DS, AX      ;
        mov ES, AX      ;
        mov FS, AX      ;
        mov GS, AX      ;
        
        xor SP, SP      ; Stack neu setzen
        
    sti         ; Interrupts wieder zulassen
    
    push 0x1000     ; Segment laden...
    push 0x0000     ; Offset laden...
    retf            ; Zum Bootloader springen
    
Print:
    
    mov AL, byte [SI]   ; Zeichen aus RAM laden 
    inc SI              ; 
    or AL, AL           ;
    jz short PrintEnd   ; Wenn Zeichen = 0 Routine beenden
        
        mov AH, 0x0E        ; Zeichen ausgeben mit Int 0x10
        mov BX, 0x0007      ;
        int 0x10            ;
        jmp short Print     ; Nächstes Zeichen laden
        
    PrintEnd:           ; Alle Zeichen sind Ausgegeben
    ret                 ; 
    
RaiseError:
    
    push SI		; Felher ausgeben
    mov SI, GlobalError ;
    call Print		;
    pop SI		;
    call Print          ;
    jmp $               ;

GlobalError db "Fatal Error:", 13, 10, "  ** STOP (0x000000)", 0
Error1      db 13, 10, "  --> Das BIOS unterstützt keine Logische Laufwerksadressierung!"
Error2      db 13, 10, "  --> Ihr BIOS unterstützt keinen Lesezugriff für das aktuelle Laufwerk!"
Error3      db 13, 10, "  --> Fehler beim Laden des Bootloader!"

times 510-($-$$) db 0x00     ; Den Rest des Bootsektors mit Nullen füllen (Bis auf 2 Bytes)
dw 0xAA55                    ; Bootsignatur anhängen "U?"
 
Zurück
Oben