Autor Thema: Realmode in C  (Gelesen 7516 mal)

Freak5

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« am: 02. September 2004, 18:38 »
Ich möchte eigentlich auch mal eine art Hello world OS in C schreiben. Ich habe zwar schon etwas in ASM programmiert, aber die gesamte Logik mit if und schleifen würde mich sicher für den allerersten Anfang überfordern.
Ich habe jetzt von der göglichkeit gehört, dass man einen Loader mithilfe des Gcc mit .o Dateien aus dem Gcc mergen kann.
Das wäre dann aber Pmode C und ich habe bis jetzt 0 erfahrungen im P-mode und er würde auch mehr Kenntnisse erfordern um Grafik und Tastaturabfragen zu erzeugen.
Zitat
Ich hab das ganze (mithilfe einiger Tutorials) so zum laufen gebracht:
Der Bootloader wird in ASM geschrieben, mit NASM kompiliert. Der muss dann vor allem in den Protected mode schalten und dann zu einer anderen Stelle springen, an der dein C-Kompilat liegt.

Den C-Code hab ich gantz einfach mit gcc kompiliert:
Quote:
C:\Programme\DJGPP\bin\gcc -fno-builtins -c *.c

Dann gelinkt
Quote:
C:\Programme\DJGPP\bin\ld -T kernel.ld -o kernel.bin


Das LInkerscript sieht folgendermaßen aus (kernel.ld)
Quote:

OUTPUT_FORMAT("binary")
ENTRY(start)
INPUT("k_init.o" "kernel.o" "io.o" "irq.o" "pic.o" "idt.o" "panic.o" "interrupts.o" "video.o" "keyboard.o" "string.o" "input.o" "memory.o" "floppy.o")
SECTIONS
{
.text 0x100000 : {
*(.text)
}
.data : {
*(.data)
}
.bss :
{
*(.bss)
}
}
 


*.o sind die erzeugten Objektdateien

Dann wird alles mit Rawritewin hintereinander auf eine Diskette (bzw. ein virtuelles Laufwerk) geschrieben und in Bochs getestet.

Hier gibts ein gutes Tutorial: http://web105.essen082.server4free.de/lowlevel/doc/
Mir kamen dann aber zwei Fragen. 1. wo hat er den Loader eingefügt und 2. Wie hat er die Startadresse des erzeugten Codes herausgefunden und wo hat der die dem Linker übergeben??

Wenn ich die zwei Fragen beantwortet bekomme, habe ich noch eine 3.-> Open Watcom kann com Dateien erstellen und beim erstellen wirft er auch obj Dateien aus, in denen supereinfacher Rohcode stehen müsste.(ich glaube nicht einmal wirklich segmentiert)
Könnte ich diese obj, nachdem ich .com oder 16Bit-Realmode Exe erzeugt habe einfach verwenden, bevor ich mir genug Wissen gesammelt habe um weiter vorzudringen?
(Naja, jetzt weiß ich ja noch nicht einmal, wie ich den Code mit dem Linker verbinden kann und wie ich den Startpunkt herausfinde und dem Linker / Loader übergeben kann)

Naja ich bin ein großer Noob im Osproggen, auch wenn ich DirectX, Winapi usw. schon gemacht habe habe ich nie infos gefunden, wie ich mit einem Compiler Rohcode erzeugen kann und schon garnicht, wie man den verwenden könnte.
Ich würde mich über Hilfe sehr sehr freuen.

Freak5

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 03. September 2004, 16:22 »
OK ich habe die meinsten sachen schon gelöst, weil ich TeeJays Tut durchgelesen habe.
Meine frage ist noch mal, wo in seinem Tut genau in den Protected Mode geschaltet wird und warum der Linker keine 16 bit obj Dateien mag!

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #2 am: 03. September 2004, 17:24 »
1. Der Loader wird getrennt kompiliert und in den Bootsektor Diskette geschmissen

2. Die Startadresse des Codes wird mit der Zeile .text 0x100000 festgelegt

3. Für Realmode C kannste z.B. Borland Turbo-C 2.0 benutzen
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Freak5

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 04. September 2004, 10:45 »
Also ichö habe bis jetzt alles so gemacht, wie es in TeeJays tut steht, nur dass ich die zwischen asm Datei zum starten der Main in 16bit compiliert habe und dass mein Kernel eine 16bit realmode .obj ist die ich mit openwatcom gemacht habe.

Turbo-C habe ich vorher mal versucht, aber der nimmt mein inlineasm nicht an.

Ich brauche jetzt eigentlich nur noch einen Linker, der meine openwatcom .obj unterstützt und allgemein 16bit linken kann.
Der gcc lehnt meine .obj immer ab.

Oder meinst du, dass die TurboC .obj Dateien lesbar wären???

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #4 am: 04. September 2004, 11:08 »
Naja Gcc is ja auch kein Linker, sag ma welches binär Format die obj-Files sind.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 04. September 2004, 11:42 »
Er meinte wohl ld da gcc automatisch ld aufruft und man somit auch mit gcc "linken" kann :)

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #6 am: 04. September 2004, 14:02 »
Ich versteh nich so ganz was du willst, willst du 16-Bit Code mit 32-Bit Code linken, weil das is unmöglich. oder willst du 16-Bit .obj linken.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Freak5

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 25. September 2004, 11:52 »
Es ist so, dass ich von Watcom einfach die .obj geklaut habe, die eigentlich in einer .com Datei enden sollte, um die dann wie in 32Bit Tut beschrieben, nur eben dann in 16 Bit mithilfe einer 16Bit.o Datei aus NASM, die nur die Mainfunction aufrufen soll, zwei .bin zu erhalten.

Das wollte ich dann zu einer .bin mergen und so laufenlassen wie ich im Moment meine ASM Realmmodebetriebssysteme laufen lasse.

Es scheint nur so, dass es keine möglichkeit gibt die .obj aus Watcom weiterzuverarbeiten.

Irgendjemand hat gesagt es würde mit TurboC gehen, da habe ich aber entweder Probs, dass mein INlineASM nicht gelesen werden kann, oder dass der Turbocompiler abstürzt, wenn er alles in ASM Code übersetzen soll!
TASM stürzt übrigens dann auch ab, wenn ich diesen mit dem halb erzeugten Code füttere..

Es scheint so, als bin ich gezwungen alles im PM zu machen, wenn ich C coden will:(((

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #8 am: 25. September 2004, 14:33 »
Zitat
Freak5 posteteEs scheint so, als bin ich gezwungen alles im PM zu machen, wenn ich C coden will
es scheint nicht nur so, es ist so, da der prozessor im realmode nur mit 16bit arbeitet, jedoch normal kompilierter c-code 32bit verwendet. einzige moeglichkeit waere, dass du deinen c-code als 16bit-code kompilierst/linkst - kA ob das ueberhaupt geht.

lg, hannibal
\\o
o//
\o/

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 25. September 2004, 20:48 »
Sicher :) Dos rannte im RealMode und damals gab es schon C :)

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 25. September 2004, 20:51 »
Hach das waren ja noch Zeiten... Als ich noch nicht mal in die Windeln gesch*ssen hab hat mein Vater schon unter Dos 2.11 mit AutoCAD gearbeitet...
<- Verhasst, Verdammt, Vergöttert

Freak5

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 02. October 2004, 10:50 »
Zitat
Another Stupid Coder postete
Sicher :) Dos rannte im RealMode und damals gab es schon C :)
Naja kennst du einen Compiler, der dann gleich auch nach .bin linken kann und man sonst nichts zu machen brauche???
Er sollte auch normale NASM Befehle unterstützen(war das INtelsyntax?)

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #12 am: 02. October 2004, 15:27 »
Borlan Turbo c 2 kann das soweit ich weiss, asm kannst du ja als module zulinken.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

 

Einloggen