Autor Thema: OS programmieren unter Linux  (Gelesen 7105 mal)

MrBigBrain

  • Beiträge: 18
    • Profil anzeigen
Gespeichert
« am: 30. December 2005, 15:26 »
Hallo, ich habe eine Frage:
Benutzt einer von euch Linux zum OS programmieren, wenn ja wie kann man z.B kernel.bin und boot.bin zusammenkopieren? Mit "cp boot.bin>kernel.bin Os.img"?
Die zweite frage die ich habe, wenn ich QEMU mit "qemu -fda my.img -boot a" starte steht im QEMU Fenster nur loading, aber nicht die Meldung die der Kernel aus dem Lowlevel Magazin 1 ausgeben soll und ist es normal das im QEMU Fenster Bochs Bios steht?

Danke schonmal im voraus.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 30. December 2005, 16:04 »
Ich benutze Linux zum OS programmieren^^
Das zusammenkopieren geht mit cat file1 file2 > ergebniss Ich habe aber mein Floppy Image mit FAT formatiert, mounte es dann und kopiere einfach mit cp meinen Kernel drauf. Als Bootloader benutze ich GRUB.

QEMU benutzt das Bochs BIOS, das ist ganz normal.

MrBigBrain

  • Beiträge: 18
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 30. December 2005, 16:18 »
Danke das zusammenkopieren hab ich jetzt hinbekommen, nur im QEMU Fenster steht halt nur "loading...", heißt das das mein Kernel garnicht aufgerufen wird?

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 30. December 2005, 17:19 »
hm, gib mal deinen Code und dein makefile.

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 30. December 2005, 20:52 »
Mein Bootloader bindet einfach die fertige Kernelbin an seinem ende ein.

z.B. in fasm:file "kernel"
oder in nasm:incbin "kernel"
db 0x55AA

MrBigBrain

  • Beiträge: 18
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 31. December 2005, 17:03 »
Also das ist der Bootloader und der Kernel aus dem Lowlevel 1 Magazin.
Bootloader:

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



Kernel:

; ---------------------------------------------------
; Unser Kernel
; ---------------------------------------------------

mov ax, 1000h ; Segmentregister updaten
mov ds, ax
mov es, ax

start:
mov si, msg
call putstr   ; Schicke Bootmessage :)

mov si,msg_boot
call putstr   ; Noch eine Message :D

call getkey   ; Warte auf einen Tastendruck
jmp reboot    ; Reboot

; -------------------------------------------------
; Funktionen und Variablen
; -------------------------------------------------

msg db "Welcome to StupidOS 1.0",13,10,0
msg_boot db "Press any key...",10,0

; Stringausgabe
putstr:
lodsb            ; Byte laden
or al,al
jz short putstrd ; 0-Byte? -> Ende!
mov ah,0x0E      ; Funktion 0x0E
mov bx,0x0007    ; Atrribut-Byte
int 0x10         ; schreiben
jmp putstr       ; nächstes Byte
putstrd:
retn

; Warte auf einen Tastendruck
getkey:
mov ah, 0 ; Funktion 0
int 016h  ; Ausführen
ret

; Rebooten (HEX Dump).
reboot:
db 0EAh
dw 0000h
dw 0FFFFh



Kompilieren tue ich das ganze mit "nasm -f bin -o boot.bin boot.asm" und "nasm -f bin -o kernel.bin kernel.asm".
Dann kopiere ich das ganze zusammen "cat boot.bin kernel.bin >myOs.img".
Jetzt kopier ich das Image auf die Diskette "dd bs=2x80x18b <myOs.img> /dev/fda", danach starte ich QEMU mit "qemu -fda /dev/fd0". Im QEMU Fenster steht dann loading..., aber nicht "welcome to stupid OS". In der Konsole steht aber auch "Could not open '/dev/qvm86' - QEMU acceleration layer not activated".

mfg MrBigBrain

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 01. January 2006, 15:07 »
Das Acceleration Layer ist erstmal egal, das ist einfach nur ein art Plugin, das die Geschwindigkeit deutlich erhöht.

hackgod

  • Beiträge: 70
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 01. January 2006, 15:38 »
Offtopic:
kann mir jemand sagen, wo ich das QEMU-binary für windows noch runterladen kann? der link auf der QEMU seite funzt nicht.

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 01. January 2006, 21:18 »
Zitat von: hackgod
Offtopic:
kann mir jemand sagen, wo ich das QEMU-binary für windows noch runterladen kann? der link auf der QEMU seite funzt nicht.

Hier scheint es ein Windows-Binary zu geben: http://www.h7.dion.ne.jp/~qemu-win/

@MrBigBrain: Versuch mal dein OS ohne den Umweg über die Diskette zu starten. Also so:

cat boot.bin kernel.bin > myOs.img
qemu -fda myOs.img -boot a

 

Einloggen