Autor Thema: EIN OS IN C MIT BOOTLOADER...  (Gelesen 14042 mal)

linuxuser

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« am: 05. March 2005, 14:17 »
hi  @all

ich und mein freund haben schon seit laengern vor ein eigenes OS zu
schreiben, das wir RaileX getauft haben. wir haben keine probleme mit dem
programmieren aber mit dem booten. wir haben folgendes ausprobiert:

----------------------------
unser Bootloader: [boot.asm]
----------------------------

org 0x7C00


start:
cli               ;Interrupts sperren
mov ax, 0x9000    ;Adresse des Stacks speichern
mov ss, ax        ;Stackadresse festlegen
mov sp, 0         ;Stackpointer auf 0 setzen
sti               ;Interrupts wieder freigeben

mov [bootdriv], dl  ;Hier wird das Bootlaufwerk gespeichert
call load

mov ax, 0x1000   ;0x1000 ist die Speicheradresse des Kernels
mov es, ax
mov ds, ax
push ax
mov ax, 0
push ax
retf

bootdriv db 0     ;Das ist das Bootlaufwerk
loadmsg db "Bitte warten! Lade RaileX Kernel...", 13,10,0

;mit der folgenden Funktion wird ein String ausgegeben
putstr:
lodsb
or al, al
jz short putstrd
mov ah, 0x0E
mov bx, 0x0007
int 0x10
jmp putstr
putstrd:
retn

;mit der folgenden Funktionwird der Kernel geladen
load:
push ds
mov ax, 0
mov dl, [bootdriv]
int 13h
pop ds
jc load

loadl:
mov ax, 0x1000
mov es, ax
mov bx, 0
mov ah, 2
mov al, 5
mov cx, 2
mov dx, 0
int 13h
jc loadl
mov si, loadmsg
call putstr
retn

times 512-($-$$)-2 db 0
dw 0AA55h

-----------------------------------------
ENDE
-----------------------------------------


diesen haben wir dann mit NASM zu einer *.bin datei assembliert

------------------------------
der startpunkt des kernels [ks.asm]
------------------------------

[BITS 32]

[global start]
[extern main]

start:
    call main
    jmp $
       

------------------------------
ENDE
------------------------------          

ich weiß zwar dass man bei "main" einen unterstrich vorsetzen muss, aber da
hat dann er linker [ld] unter linux gemotzt.

und jetzt unser KERNEL in C

--------------------------------------
KERNEL in [C] [kernel.c]
--------------------------------------

int main()
{
    char *Text = "WELCOME TO RAILEX OS";  
    char *VideoMem = (char*)0xA8000;  
 
    while(*Text)  
{  
        *VideoMem = *Text;  
        *VideoMem++;  
        *VideoMem = 7;  
        *VideoMem++;  
        *Text++;  
}
    return(0);
}

--------------------------------------
ENDE
--------------------------------------

und so sieht die Linker Datei aus:

--------------------------------------
link.ld
--------------------------------------

UTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
    .text    0xFF800000   :   {
        *(.text)
        }
    .data    : {
        *(.data)
        }
    .bss   :
        {
        *(.bss)
        }
}

--------------------------------------
ENDE
--------------------------------------


ERSTELLUNG

so haben wir den Kernel kompiliert:

gcc -c -ffreestanding -nostdinc -I ./ -O3 -Wall -o kernel.o kernel.c

boot.asm haben wir folgendermaßen assembliert:

nasm -f bin -o boot.bin boot.asm

ks.asm haben wird so assembliert:

nasm -f aout -o ks.o ks.asm

Nun haben wir die Objekt Dateien so gelinkt:

ld -T lihnk.ld -o kernel.bin ks.o kernel.o


So viel zum Erstellen.

Dann haben wir so weitergemacht:

cat boot.bin kernel.bin >/railex.img
cat railex.img >/dev/fd0

So! Dann haben wir die Diskette drinnen gelassen und neu gestartet.
Und das Ergebnis: Traurig starrten wir auf einen leeren Bildschirm mit einem
einzelnen blinkenden Cursor.




Was könnte da bloß falsch sein?

Wir wissen das im LowLevel mit GRUB booten erklärt wird. Aber wir waren
nicht sehr erfolgreich, da jeder der etwas über GRUB schreibt
vergisst, das es auch schon eine Hürde ist Grub überhaupt richtig auf
Diskette bekommt.

Falls es dir zu aufwendig ist unseren Code zu korrigieren, oder überhaupt
richtig anzuschauen, dann bitte wir wenigstens um eine genauere
beschreibung von GRUB. Zum Beispiel: Wo findet man ihn? Wie compiliert man
ihn (wenn das überhaupt nötig ist)? Wie kann man ihn
auf Diskette installieren? Wie bekomme ich GRUB !!UND!! meinen Kernel auf
Diskette?

In diesem Sinne vielen Dank im voraus.

mfg
Das RaileX Team
ARE YOU SICK OF CRASHING... USE LINUX

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 05. March 2005, 14:28 »
Also Grub ist nicht schwer:
Du brauchst:
- 2 Disketten, eine davon formatiert.
-  die GRUB-Dateien stage1, stage2 und menu.lst

Also als erstes nimmst du stage1 und stage 2 und schreibst diese nacheinander auf die unformatierte Disktette:

cat stage1 stage2 > /dev/fd0

Jetzt kommt die formatierte Diskette rein, auf diese packst du mal deinen kernel und dann machst du ein verzeichnis "boot" darin ein unterverzeichnis "grub" und in dieses packst du "stage1", "stage2" und "menu.lst" rein (menu.lst muss schon für deine Bedürfnisse angepasst sein.),
Jetzt bootest du von der unformatierten Diskette, da sollte jetzt eine Commandline kommen. Wenn diese da ist und er fertig geladen hat (floppy-lampe leuchtet nimmer) schiebst du die formatierte Diskette rein und tippst:

setup (fd0)

in die Commandline. Jetzt sollte er GRUB auf der Diskette installieren, von der kannst du dann booten (von der formatierten)

Wenn du GRUB auf deiner Festplatte hast, kannst du unter Linux auch einfach "grub" aufrufen und hast gleich die Commandline wo du nur noch "setup (fd0)" eingeben musst :)

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 05. March 2005, 14:33 »
oder guck dir das mal an:
http://www.lowlevel.brainsware.org/forum/viewtopic.php?t=522
und das diskettenimage von grub bekommst du auf osdever.net.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 05. March 2005, 22:55 »
Zitat
ich weiß zwar dass man bei "main" einen unterstrich vorsetzen muss, aber da
hat dann er linker [ld] unter linux gemotzt.

jupp, das ist nur unter DOS so...

char *VideoMem = (char*)0xA8000;
muss 0xB8000 heissen, weil da der Videospeicher in Textmodus ist.

.text 0xFF800000 : {
muss .text 0x00010000 heissen, weil der kernel an 0x1000:0x0000 (also 0x00010000 linear) geladen wird.

Das größte Problem ist allerdings, dass ihr einen 32-bit (also Protected-Mode) Kernel habt, aber nicht in den Protected Mode wechselt. Den entsprechenden Code müsst ihr noch ergänzen. (siehe pm-tuts auf dieser seite ...)
Dieser Text wird unter jedem Beitrag angezeigt.

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 06. March 2005, 10:56 »
Ich benutze grub und der schaltet für mich in den pm

LastManStanding

  • Beiträge: 1
    • Profil anzeigen
    • http://www.bos-ried.tk
Gespeichert
« Antwort #5 am: 07. March 2005, 10:51 »
Hallo an alle!
Ich bin der 2e der an RaileX beteiligt ist.
Vielen dank für die tolen antworten.

mfg LastManStanding
Für nur 4€ im Monat könnte hier ihre Werbung stehen...

 

Einloggen