6
« 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