Autor Thema: Bootloader: 2.Sektor laden  (Gelesen 6671 mal)

Al3x

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« am: 05. April 2010, 18:31 »
Hallo,
ich bin neu in diesem Forum und möchte etwas mehr über das Programmieren von Betreibssystemen wissen, kenne mich aber mit Assembler relativ gut aus.

Nun wollte ich zum besseren Verständnis von Betriebssystemen einen Bootlader schreiben, der den 2. Sektor von Diskette nachlädt und einen String, der sich in diesem 2. Sektor befindet, ausgibt. Ich habe zuerst den Code von http://wiki.osdev.org/Babystep2 übernommen, der einen String ausgibt.
Das funktioniert auch perfekt, aber wenn ich nun per int10 den 2. Sektor von der Diskette lade und den String dort ausgeben will, passiert nichts.

Ich denke, der Fehler liegt vlt daran, dass ich nicht so richtig verstanden habe, was mit dem Datensegment (mov ds, ax) gemacht wird und wann das ausgeführt werden soll.

Soll der Code vom Kernel/2. Sektor hinter den Bootlader geladen werden?
Wenn nein, was ist die beste Stelle?
Muss ich irgendwie das Datensegment updaten? oder springen?
Ich darf doch später per include einfach den Kernel an den ersten Sektor hängen?

Vielen Dank für eure Hilfe!!!
Viele Grüße

Alex

[BITS 16]
[ORG 0x7c00]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   xor ax, ax  ;make it zero
   mov ds, ax

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
   mov si, msg
   call bios_print
   
   call LoadKern     ; NEU
   mov si, msg2     ; NEU
   call bios_print    ; NEU
 
hang:
   jmp hang
 
msg   db 'Welcome to Macintosh', 13, 10, 0
 
bios_print:
   lodsb
   or al, al  ;zero=end of str
   jz done    ;get out
   mov ah, 0x0E
   int 0x10
   jmp bios_print
done:
   ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Load kernel procedure          ; NEU
LoadKern:
        mov ah, 0x02    ; Read Disk Sectors
        mov al, 0x01    ; Read one sector only (512 bytes per sector)
        mov ch, 0x00    ; Track 0
        mov cl, 0x02    ; Sector 2
        mov dh, 0x00    ; Head 0
        mov dl, 0x00    ; Drive 0 (Floppy 1) (This can be replaced with the value in BootDrv)
        mov bx, 0x7E00  ; Segment 0x7E00
        mov es, bx      ;  again remember segments bust be loaded from non immediate data
        mov bx, 0x0000  ; Start of segment - offset value

        int 0x13        ; Call BIOS Read Disk Sectors function
        ret
     

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
   times 510-($-$$) db 0
   db 0x55
   db 0xAA
   msg2   db 'Hello World!', 13, 10, 0       ; NEU
   times 1024-($-$$) db 0                         ; NEU
« Letzte Änderung: 05. April 2010, 19:26 von Al3x »

Cool-Andy

  • Gast
Gespeichert
« Antwort #1 am: 05. April 2010, 19:03 »
'Hello World!'
Das schreibt man doch so, oder?:
"Hello World"
Ich hoffe ich hab dir geholfen.

Al3x

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 05. April 2010, 19:13 »
Ich hab es jetzt geändert, doch es ändert nichts am Problem. Auch wenn ich anstatt "Hello World" die ursprüngliche Nachricht ausgeben will, passiert nichts.
« Letzte Änderung: 05. April 2010, 19:15 von Al3x »

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 05. April 2010, 19:21 »
der booloader wird an die stelle 0:07c00 geladen, soweit ist es richtig. die adressierung wird im folgenden maße angegeben: segement:offsett. das bedeutet, dass du deine daten in segment 0 an offsett 07c00h+512dez laden. dann sollte es auch mit der addresse hinhauen.
mfg
chris
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

Al3x

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 05. April 2010, 19:31 »
Ah, danke, ich hab Segment und Sektor vertauscht  :roll:

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 06. April 2010, 08:33 »
Hallo,


ich hab Segment und Sektor vertauscht
Ja, der x86-Real-Mode ist schon was blödes.
siehe auch http://lowlevel.brainsware.org/wiki/index.php/Real_Mode oder besser http://wiki.osdev.org/Real_Mode


Edit:
auch hier gibt es ein paar interessante Infos und Code-Beispiele http://lowlevel.brainsware.org/wiki/index.php/Eigener_Bootloader


Grüße
Erik
« Letzte Änderung: 06. April 2010, 12:15 von erik.vikinger »
Reality is that which, when you stop believing in it, doesn't go away.

 

Einloggen