Wie schreibt man ein Betriebssystem in C und erhält man den Objektcode?
-
Ein komplett selbstgeschriebenes Betriebssystem ist ja ein Kernel und enthält somit selbst POSIX Befehle ohne aber die Möglichkeiten zu geben für den Code die POSIX bzw. Standardlib Befehle des Gastsystems auf dem es programmiert wird zu verwenden.
D.h. Funktionsaufrufe wie open() laufen ins leere, da man das ja für das eigene OS alles selbst implementieren müßte.
Wie aber compiliert man nun bootbaren Objektcode mit z.B. dem gcc Compiler?
-
Direkt bootbaren Code (für x86) kann man mit dem gcc nicht erzeugen. Das Hauptproblem ist, dass PCs im 16 Bit Modus starten und der gcc keinen 16 Bit Code erstellen kann. Daher benötigt man zu Beginn etwas Assembler Code, der den eigentlichen Kernel läd, in den 32 Bit Modus schaltet und dann in den Kernel springt.
Da das etwas frickelig ist, wird man da in der Regel einen fertigen Bootloader wie z.B. Grub einsetzen. Grub unterstützt dabei das ELF Format, um zu erkennen welche Bereiche des Kernels wo in den Speicher sollen. Daher empfiehlt es sich ein Linkerscript zu nutzen, damit man die Bereiche gezielt einstellen kann. Ansonsten gibt man dem gcc noch -ffreestanding mit, damit dieser nicht auf irgendwelche Libs und Header des Systems auf dem man Entwickelt einbindet.
-
Danke für die ausführliche Antwort, das beantwortet meine Fragen.
-
Tobiking2 schrieb:
Direkt bootbaren Code (für x86) kann man mit dem gcc nicht erzeugen. Das Hauptproblem ist, dass PCs im 16 Bit Modus starten und der gcc keinen 16 Bit Code erstellen kann. Daher benötigt man zu Beginn etwas Assembler Code, der den eigentlichen Kernel läd, in den 32 Bit Modus schaltet und dann in den Kernel springt.
Da das etwas frickelig ist, wird man da in der Regel einen fertigen Bootloader wie z.B. Grub einsetzen. Grub unterstützt dabei das ELF Format, um zu erkennen welche Bereiche des Kernels wo in den Speicher sollen. Daher empfiehlt es sich ein Linkerscript zu nutzen, damit man die Bereiche gezielt einstellen kann. Ansonsten gibt man dem gcc noch -ffreestanding mit, damit dieser nicht auf irgendwelche Libs und Header des Systems auf dem man Entwickelt einbindet.
Es gibt auch eine 16 bit variante, is leider nur net so gut entwickelt...
-
Es dreht sich ja nicht nur darum, auch die A20-Leitung aktivieren sowie die GDT, IDT und die LDTs initialisieren kann man nur in Asm.
-
Wo sucht der Computer bei z.B. einem USB-Stick nach dem zu ladenden Assemblercode?
Also mal angenommen ich habe ein kleines Assemblerprogamm gechrieben, daß Hello World auf dem Bildschirm ausgeben soll. Quasi als mein erstes OS.
Wie kriege ich den Computer nun dann dazu, daß er es beim Booten läd?Also ich bräuchte den Einstiegspunkt für den Computer.
-
Wenn dein USB-Stick bootbar ist, wird der erste Sektor gelesen und geschaut ob die letzten 2 Bytes dieses Sektors dem Wert 0xAA55 entsprechen, und läd diesen dann ggf.
-
Auf all Deine Fragen gibt es schon gute Antworten, schau mal im passenden Forum:
C/C++ Forum :: Projekt: OS-Development
http://www.c-plusplus.net/forum/viewforum-var-f-is-62.htmlUnd schau Dir das Tutorial an! http://www.henkessoft.de/OS_Dev/OS_Dev1.htm