Betriebssystem

Hallo!
Bei vielen Image-Programmen (also um eine Kopie einer Bootfähigen Partition zu erstellen), wird die Software auf CD geliefert. Bei den älteren Versionen (zum Beispiel Drive Image 5) kann man auch zwei Disketten erstellen. Diese sind dann Bootfähig. Auf einer ist eine Art DOS und auf der anderen das Programm mit grafischer Benutzeroberfläche. Es läuft also unabhängig von jedem Betriebsystem. Da die Software auf 2 Disketten geht, können die PRogramme nicht so umfangreich sein.
Ich würde gerne selbst auch so etwas programmieren (C, C++, Assembler, Delphi - eigentlich egal, so lange nicht JAVA, was hier sowieso bestimmt wie Basic und Delphi nicht viel helfen wird). Dennr echnet man die Daten für die Aufgabe des Programmes weg, bleibt für den Kernel nicht mehr viel übrig.
Wie kann ich also selbst ein bootfähiges Programm schreiben, dass vielleicht sogar graphisch ist? Jetzt hier einen gesamten Quelltext mir zu erhoffen ist sicherlich utopisch, aber über zahlreiche Links würde ich mich sehr freuen (egal ob Englisch oder Deutsch)! Hat da jemand was?

Christian

Moin

Wie kann ich also selbst ein bootfähiges Programm schreiben,
dass vielleicht sogar graphisch ist?

Grafisch (also >640x480) wird tricky. Multi-theard wird auch komplex. Als Vorlage für einfache, single-Theard Programme kann ich aber den Quellcode von lilo und Grub empfehlen.

Ansonten evtl. doch einfach normales MS-DOS 6 (

Hi!
Und wie finde ich den Quelltext dazu?

Christian

Müsstest du dazu nicht tonnenweise Treiber schreiben/liefern, für IDE-Hard Disks, Floppy Controls, (S)VGA-Karten etc. ?

Ist doch ne riesen Arbeit, weil eben keine OS-Libs/Dienste zur Verfügung stehen würden…

Hallo Christian
Um einen Kernel zu schreiben brauchst du gute C(++) Kenntnisse und zumindest grundlegendes Wissen über Assembler. Andere Sprachen wie z.B Basic, Pascal sind dafür nicht geeigent, da sie zu sehr vom Betriebssystem abhängen. C++ hat ebenfalls einige Features (new, delete…) die Unterstüzung durch ein Os benötigen, man kann diese Funktionen allerdings auch selbst programmieren (oder einfach auf sie verzichten). Die am meisten verwendete Sprache ist daher C.

Die Beste Site zum Einsteigen ist meiner Meinung nach Bonafide:
http://osdev.neopages.net/
Es gibt dort einige Anfängertutorials (Tutorials/Kernels) die du dir durchlesen solltest sowie Dokumente und ein Forum.

Foren zum Thema OS-Dev
http://www.osdev.org/
http://www.mega-tokyo.com/forum/

OS-Newsgroups:
alt.os.development

Eine graphische Oberfläche ist kein Problem, du solltest allerdings nicht zu großen Wert auf das Aussehen des Betriebssystems legen bevor nicht die weitaus grundlegenderen Sachen erledigt sind.

Du solltest auch bedenken, dass die Kernel die von Image-Programmen verwendet werden eher simpel sind, da spezialisiert. Ein echtes Betriebsystem dass Programme ausführen kann ist deutlich komplexer.

Noch ein gutgemeinter Rat:
Versuche nicht deinen eigenen Bootsector zu schreiben! Der Bootsector befindet sich im ersten Sector eines Datenträgers und ist daher 512Byte groß. Nach den Booten des Systems durch das BIOS wird der dort gespeichert Code ausgeführt, der dann zum eigentlichen Kernel spingt.
Da der Bootsector auf 512Byte begrenzt ist, muss er in Assembler programmiert werden. Das Schreiben eines Bootsektors hat nichts mit dem eigentlichen Betriebsystem zu tun und kann aufgrund von 16Bit real-mode ziemlich deprimierend sein. Ich rate dir daher dringendst einen bereits bestehenden Bootloader wie z.B GRUB zu verwenden !
Ich selbst verwede John Fine’s Bootsector:
http://my.execpc.com/~geezer/johnfine/bootr01.zip
Er ist sehr einfach gehalten und daher für Anfänger möglicherweie besser geeignet als GRUB.

BIOS -> Bootsector -> Kernel

Falls du Probleme haben solltest, einfach in den oben genanten Foren posten. Du kannst mich auch direkt unter gaffi_at_haefft_de erreichen, ich beschäftige mich aber selbst erst sein ca. 1/2 Jahr mit Betriebsystemen und kann deshalb nicht Garantieren dir immer helfen zu können.

Falls du nach einen guten Buch zum Thema suchst:
http://en2.wikipedia.org/wiki/Andrew_S._Tanenbaum (das 2.te)
Ich habe es zwar selbst noch nicht gelesen, es wird aber ständig in allen Foren hoch gelobt.

grüße,
Daniel Raffler

Moin

im 2. Treffer von google:
ftp://ftp.debian.org/debian/dists/stable/main/source…

cu

Hi!
Das ist richtig das das ein großer Stress ist, aber man lernst bestimmt auch verdammt viel dabei! Und es gibt genügend Programmeirer Teams bei großen Firmen und sicherlich auch privat die genau das tun. Es geht nicht darum so was hochkomplexes wie Windows oder Linux nachzuprogrammieren, sondern nur darum mal selbst ein primitives Betriebssystem zu bsateln. Auf Mikrocontrollern (was natürlich kein Vergleich ist), habe ich es bereits geschafft. Ich brauche eine neue Aufgabe. Wobei mit der Festplatte ist das so eine Sache. Da musst du ja auch was basten, damit der kapiert was ein Dateisystem ist und so. Wenn der nur eine einzige Konkrete Aufgabe ausführen würde, zum Beispiel ein Spiel bei dem man eine Zahl erreaten muss, würde das schon genügen (also Grafik, Tastatur, CD-Laufwerk, Arbeitsspeicher).

Christian

Hallo
Man kann alles . Wie Du wissen solltest kann man relativ leicht ein paar Makros in Assembler schreiben , welche dann eine Art Basic erlauben . Damit könnte man schneller ein Programm für Textverarbeitung schreiben .
Den bloßen Bootsektor kann man noch mit „debug“ erstellen .
Ob nun das vielfach favorisierte C geeignet ist möchte ich bezweifeln , denn bereits bei der Assemblerprogrammierung müßte ich erst mal suchen , wie man die Ausrichtung für ein Starten innerhalb eines Betriebssystem umgeht . ,obj?? ??
Für ein bootendes Programm brauchst Du technische Kenntnisse die Du Dir aus entsprechender technischer Literatur besorgen mußt .
Im Bootsektor werden Bios-Routinen aufgerufen , mit denen man andere Sektoren laden kann .
Für ein spezielles Echtzeitbetriebssystem wäre das ganz gut und immerhin steht auch das DOS unter Urheberrecht .
Ich fand aber auch „freie Dos-Systeme“ , da sind Gruppen , welche versuchen , soetwas aufzubauen . Im Internet mal googlen usw…
Im übrigen werden alle Geräte , die unter Windows oder Dos einen Treiber benötigen , nicht funktionieren .
Eine einfache Bilddarstellung und ein Laufwerkszugriff müßte aber gehen .
Damit hast Du dann ein 1- oder 2- Jahresprojekt , und deswegen ist es sinnvoll , was fertiges zu nehmen .
Aber ich glaube , Du brauchst jemanden , der Dir Deine Homepage erstellt …
Beim Öffnen fängt meine Festplatte an zu rappeln , nichts geht mehr und ich muß neu booten …
MfG

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Matthias

Man kann alles . Wie Du wissen solltest kann man relativ
leicht ein paar Makros in Assembler schreiben , welche dann
eine Art Basic erlauben . Damit könnte man schneller ein
Programm für Textverarbeitung schreiben.

Es gib keinen Grund eine ganze Programmiersprache neu zu schreiben und schon garnicht eine so komplexe wie Basic. Basic ist für die Entwicklung eines Kernels ähnlich gut geeignet wie HTML und es wäre deutlich einfacher das ganze OS in Assembler zu schreiben als einen, wenn auch einfachen, Basic-compiler zu erstellen.

Den bloßen Bootsektor kann man noch mit „debug“ erstellen .

Der Bootsector muss in asm geschrieben werdend da er auf 512Byte begrenzt ist, wie (und warum) man dazu „debug“ verwenden soll verstehe ich nicht ganz.

Ob nun das vielfach favorisierte C geeignet ist möchte ich
bezweifeln , denn bereits bei der Assemblerprogrammierung
müßte ich erst mal suchen , wie man die Ausrichtung für ein
Starten innerhalb eines Betriebssystem umgeht . ,obj?? ??

C(++) ist die einzige Sprache in der man ein Betriebssystem schreiben kann. Der große Vorteil von C besteht ja eben darin, dass es sich nicht wie z.B Basic zu sehr an das Betriebssystem bindet.
Man kann einen Kernel auch in Assembler schreiben hat allerdings dann den Nachteil, dass man die x86 Plattform gebunden ist und das Projekt auf Grund seiner Größe recht unübersichtlich werden wird.

Der Kernel wird vom Bootsector gestartet der wiederum vom BIOS ausgeführt wird.

BIOS -> Bootsector -> Bootloader (alternativ) -> Kernel

Es gibt bei C in der Tat das Problem dass man irgendwie die Funktion Main() aufrufen muss, man kann dies allerdings mein paar Zeilen asm lösen die zum C-Code springen:

extern _main

jmp _main
cli
hlt

Dieser Code wird dann zusammen mit den C-Objectdatein gelinkt. Der Kernel wird in der Regel als ganz normale Binärdatei erstellt (.com), mit den Bootloader GRUB kann man aber auch andere Formate starten (COFF = windows oder ELF = linux).

Für ein bootendes Programm brauchst Du technische Kenntnisse
die Du Dir aus entsprechender technischer Literatur besorgen
mußt .

Ich möchte nochmal auf dieses Buch hinweisen:
http://en2.wikipedia.org/wiki/Andrew_S._Tanenbaum
Es ist DAS Standardwerk zum Thema Betriebssystemprogrammierung.

Im Bootsektor werden Bios-Routinen aufgerufen , mit denen man
andere Sektoren laden kann .
Für ein spezielles Echtzeitbetriebssystem wäre das ganz gut
und immerhin steht auch das DOS unter Urheberrecht .
Ich fand aber auch „freie Dos-Systeme“ , da sind Gruppen ,
welche versuchen , soetwas aufzubauen . Im Internet mal
googlen usw…

Im übrigen werden alle Geräte , die unter Windows oder Dos
einen Treiber benötigen , nicht funktionieren .
Eine einfache Bilddarstellung und ein Laufwerkszugriff müßte
aber gehen .

Alle Geräte benötigen einen Treiber, auch Graphikkarte (!) und Festplatte. Die Programmierung der meisten Treiber ist nicht allzu schwer, da man leicht Information und Technische Spezifikationen findet.
Die Graphikkartenhersteller nVidea und ATI veröffentlichen jedoch kerinerlei Infos über ihre Karten, man kann sie daher nur mithilfe der VGA oder VESA-Standards ansprechen. Der VGA-Standard wird von allen Karten unterstützt, bietet aber nur sehr gering Auflösungen (max 640*480*4), VESA hingegen erlaubt es alle, auch unter Windows möglichen, Auflösungen einzustellen, wird allerdings nicht von allen Herstellen unterstützt.

Grüße,
Daniel Raffler

HalloDaniel

Wie Du wissen solltest kann man relativ
leicht ein paar Makros in Assembler schreiben , welche dann
eine Art Basic erlauben . Damit könnte man schneller ein
Programm für Textverarbeitung schreiben.

Es gib keinen Grund eine ganze Programmiersprache neu zu
schreiben und schon garnicht eine so komplexe wie Basic. Basic
ist für die Entwicklung eines Kernels ähnlich gut geeignet wie
HTML und es wäre deutlich einfacher das ganze OS in Assembler
zu schreiben als einen, wenn auch einfachen, Basic-compiler zu
erstellen.

Also da muß ich protestieren . HTML mit Basic zu vergleichen ist vielleicht bei manchen älteren Interpretern zulässig , nicht mehr aber bei modernen Compilern .
Zutreffend ist , das man Schwierigkeiten hätte , einen Compiler für eine bootfähige Sache zu finden .
Wie man Makros oder Unterprogramme schreibt und verwendet , ist aber eigentlich gleich , solange dieselbe Logik , derselbe Programmablauf geschieht . Ich bin aber der Meinung , das falls man sich mit Basic relativ gut auskennt und außerdem mit Assembler kann , dann kommen ein paar Routinen für Basic-Style in Frage . Damit könnte man dann auch leichter das Programm portieren , was aber wegen der unterschiedlichen Maschinen nicht unbedingt Sinn macht .
Du mußt bedenken , das Dir C anscheinend geläufig ist , und das es Dir deswegen möglicherweise selbstverständlich erscheint .

Den bloßen Bootsektor kann man noch mit „debug“ erstellen .

Der Bootsector muss in asm geschrieben werdend da er auf
512Byte begrenzt ist, wie (und warum) man dazu „debug“
verwenden soll verstehe ich nicht ganz.

Naja , er könnte mit Debug einen Bootsektor schreiben , der eine Meldung ausgibt . Damit hätte er ein erstes Hurra und bräuchte nichts für aufwendige Werkzeuge bezahlen . Debug nimmt Assemblerbefehle an , aber keine benannten Variablen usw… aber man kann es schaffen , damit auf 512 Byte zu kommen . Ich sagte nicht , das man Debug nehmen „muss“ , sondern , „man kann noch“ . Hierbei beziehe ich mich auf die Programmgröße des Bootsektors .

Im Bootsektor werden Bios-Routinen aufgerufen , mit denen man
andere Sektoren laden kann .
Für ein spezielles Echtzeitbetriebssystem wäre das ganz gut
und immerhin steht auch das DOS unter Urheberrecht .
Ich fand aber auch „freie Dos-Systeme“ , da sind Gruppen ,
welche versuchen , soetwas aufzubauen . Im Internet mal
googlen usw…

Im übrigen werden alle Geräte , die unter Windows oder Dos
einen Treiber benötigen , nicht funktionieren .
Eine einfache Bilddarstellung und ein Laufwerkszugriff müßte
aber gehen .

Alle Geräte benötigen einen Treiber, auch Graphikkarte (!) und
Festplatte. Die Programmierung der meisten Treiber ist nicht
allzu schwer, da man leicht Information und Technische
Spezifikationen findet.

Na da hast Du aber was schönes geträumt …
Höchstens für eine einzelne Grafikkarte gelingt vielleicht die Programmierung , und das dauert trotzdem lange genug .
Ein einfacher Zugriff auf die Festplatte mittels IDE Protokoll und auf das VGA mittels Bios wäre noch zu schaffen , meine ich .

Ich verstehe übrigens das C nicht besonders und wenn ich was schreibe , dann mit VB 5.0 ( zur Zeit ) und ich muss feststellen , Vb ist schnell genug für vieles auf Pentium100Mghz und VB läßt sich Klasse mit ein bischen Assemblercode gewaltig aufbessern .

MfG

Hallo Matthias

Also da muß ich protestieren . HTML mit Basic zu vergleichen
ist vielleicht bei manchen älteren Interpretern zulässig ,
nicht mehr aber bei modernen Compilern .
Zutreffend ist , das man Schwierigkeiten hätte , einen
Compiler für eine bootfähige Sache zu finden .
Wie man Makros oder Unterprogramme schreibt und verwendet ,
ist aber eigentlich gleich , solange dieselbe Logik , derselbe
Programmablauf geschieht . Ich bin aber der Meinung , das
falls man sich mit Basic relativ gut auskennt und außerdem mit
Assembler kann , dann kommen ein paar Routinen für Basic-Style
in Frage . Damit könnte man dann auch leichter das Programm
portieren , was aber wegen der unterschiedlichen Maschinen
nicht unbedingt Sinn macht .
Du mußt bedenken , das Dir C anscheinend geläufig ist , und
das es Dir deswegen möglicherweise selbstverständlich
erscheint .

Du hast recht, der Vergleich Basic HTML war vielleicht etwas übertrieben da sich seit den Interpreter-Basic doch einiges geändert hat.
Denoch ist Basic viel zu sehr in das Betriebssystem integriert alsdass man damit eine Kernel erstellen könnte. Man müsste also wirklich ein „paar Rutinen“ schreiben, ich fürchte aber dass das bei einer so komplexen Sprache wie Basic ziemlich ausarten würde.

Naja , er könnte mit Debug einen Bootsektor schreiben , der
eine Meldung ausgibt . Damit hätte er ein erstes Hurra und
bräuchte nichts für aufwendige Werkzeuge bezahlen . Debug
nimmt Assemblerbefehle an , aber keine benannten Variablen
usw… aber man kann es schaffen , damit auf 512 Byte zu
kommen . Ich sagte nicht , das man Debug nehmen „muss“ ,
sondern , „man kann noch“ . Hierbei beziehe ich mich auf die
Programmgröße des Bootsektors .

Ich kenne mich mit debug nicht aus, aber für einen einfachen „Hello World“-Kernel sollte es reichen. Vorraussetzung dafür ist natürlich dass debug binäre Dateien erstellen kann die sich unter Realmode ausführen lassen.

Ich würde übrigens davon abraten einen eigenen Boosector zu schreiben, da dies aufgrund der 16bit Realmode-Umgebung (DOS, nur BIOS-Interrupts) relativ kompilziert und frustrierend sein kann. Anstatt dessen kann man genausogut einen bereits bestehenden Bootsector wie GRUB verwenden.
Für Werkzeuge bezahlen musst du sowieso nie - es gibt ja immer noch Open-Source:

NASM - Assembler, gut zum Programmieren von Bootsectoren geeigenet
GCC - C(++) Compiler, bei der Kernel-Programmierung in weit verbreitet da systemunabhängig (Windows: MinGW, Cygwin)

Alle Geräte benötigen einen Treiber, auch Graphikkarte (!) und
Festplatte. Die Programmierung der meisten Treiber ist nicht
allzu schwer, da man leicht Information und Technische
Spezifikationen findet.

Na da hast Du aber was schönes geträumt …
Höchstens für eine einzelne Grafikkarte gelingt vielleicht die
Programmierung , und das dauert trotzdem lange genug .
Ein einfacher Zugriff auf die Festplatte mittels IDE Protokoll
und auf das VGA mittels Bios wäre noch zu schaffen , meine
ich .

Auf das Problem mit Graphikkarten habe ich ja kurz darauf hingewiesen:

Die Graphikkartenhersteller nVidea und ATI veröffentlichen jedoch keinerlei
Infos über ihre Karten, man kann sie daher nur mithilfe der VGA oder
VESA-Standards ansprechen. Der VGA-Standard wird von allen Karten unterstützt,
bietet aber nur sehr gering Auflösungen (max 640*480*4), VESA hingegen erlaubt
es alle, auch unter Windows möglichen, Auflösungen einzustellen, wird
allerdings nicht von allen Herstellen unterstützt.

Der VGA-Standard ist übrigenz recht gut dokumentiert so dass man einen VGA-Treiber wirklich relativ einfach selbst schreiben kann:
http://www.italios.it/oslib/mode13h_nobios.zip

Der wesentlich neuere VESA-Standard hingegen kann nur sehr aufwendig direkt angesprochen werden, es ist daher sinnvoller auf das Video-BIOS zurückzugreifen.
Der große Nachteil der BIOS-Interrupts ist zum einen ihre Langsamkeit und zum anderen die Tatsache, dass sie unter ProtectedMode nur mithilfe eines V86-Taskes aufgerufen werden können. Da ein solcher Task nicht ganz einfach zu Programmieren ist und zumindest einen Taskmanager (und damit einen Speichermanager) benötigt, würde ich deshalb Vorschlagen den gewünschten Videomodus bereits während des Bootens zu setzen und dann direkt in einen Linearen Framebuffer zu schreiben.

Ein IDE-Treiber ist, wie schon gesagt, nicht alzu schwer, das größere Problem ist dabei das Dateissystem.

Ich verstehe übrigens das C nicht besonders und wenn ich was
schreibe , dann mit VB 5.0 ( zur Zeit ) und ich muss
feststellen , Vb ist schnell genug für vieles auf
Pentium100 Mhz und VB läßt sich Klasse mit ein bischen
Assemblercode gewaltig aufbessern .

Ich bezweifle ja garnicht, dass VB ausreichen schnell ist aber darum geht es ja auch garnicht. Das Problem ist vielmehr dass VB zusehr auf Windows zugeschnitten ist und daher zur Kernel-Programmierung nur mit allergroßten Aufwand verwendet werden kann.
Abgesehen davon ähneln sich die Highlevel-Sprachen. Es sollte daher nicht allzu schwer sein als Basic-Programmierer C(++) zu lernen, da das Prinzip gleich bleibt.

Grüße,
Daniel Raffler

Hi,

bei http://www.menuetos.org/ gibt es ein in Assembler geschriebenes OS, das auf eine Diskette passt und von einer solchen auch bootet. Das ist vielleicht einen Blick wert.

cu