Wie schreibt man ein Betriebssystem?



  • indaclub schrieb:

    Ich möchte ein ungefähre Vorstellung davon bekommen, wie man ein Betriebssystem programmiert, bzw. genauer, ein Treiber oder noch konkreter eine Hardwarekomponente ansprechen kann.

    Bei x86 gibt es zwei Methoden Hardware anzusprechen: Über IO Ports und über MMIO. Die Methode über Ports ist eher unüblich und wird eher für PC Standardkomponenten wie Tastaturcontroller, PIC, PIT etc. verwendet. Bei MMIO gibt es ein paar standard Adressen, wie die 0xb8000 für den CGA Bereich, aber die meiste Hardware wird über den PCI Bus angebunden sein. Bei der Hardware die über den PCI Bus angebunden ist bekommt man die entsprechenden Adressen aus dem pci config space und kann diese auch bei Bedarf ändern. Das Schreiben an die für MMIO verwendete Adressen geht dann halt nicht in den Speicher, sondern an das jeweilige Gerät.

    Wie dann die Kommunikation über diese Adressen genau abläuft ist Gerätespezifisch. Für einige Gerätearten gibt es da Spezifikationen, die mehr oder weniger eingehalten werden, so dass man allgemeine Treiber schreiben kann. Bei anderen muss man für jedes Gerät einen separaten Treiber schreiben, und ist auf Dokumentation angewiesen.

    indaclub schrieb:

    Interrupts? Und was ist mit mehrkernigen Prozessoren bzw. Nebenläufigkeit? Polling oder Unterbrechung?

    Wenn ein Gerät es unterstützt, wird man sicherlich Interrupts nutzen statt zu pollen.

    Nebenläufigkeit ist ein weites Thema, wozu man jetzt allgemein nicht kurz was schreiben kann. Allerdings ist das ein beliebtes Thema, das recht ausführlich in den Betriebsystem Büchern von Tanenbaum und Silberschatz behandelt wird.



  • Wenn du Erfolg haben willst schreibst du kein eigenes OS, sondern kaufst eins ein und änderst es ab und erweiterst es mit anderen zugekauften Technologien. Es sollte dann aber alles so aussehen als wäre es aus einem Guss 😃 😃 😃



  • freizeit_programmierer schrieb:

    Wenn du Erfolg haben willst schreibst du kein eigenes OS, sondern kaufst eins ein und änderst es ab und erweiterst es mit anderen zugekauften Technologien. Es sollte dann aber alles so aussehen als wäre es aus einem Guss 😃 😃 😃

    schon klar was ein os kostet dass man als sein eigen ausgeben will 🤡



  • indaclub schrieb:

    unsigned int k_printf(char* message, unsigned int line, char attribute)
    

    Hey, gutes Beispiel für schlechtes API. Wenn eine Funktion printf im Namen trägt, sollte sie auch printf leisten. Die hier macht ja nur print ohne f .



  • Danke für die Antwort. Dadurch habe ich erst mal Anhaltspunkte, die man vertiefen kann.



  • Nukularfüsiker schrieb:

    indaclub schrieb:

    unsigned int k_printf(char* message, unsigned int line, char attribute)
    

    Hey, gutes Beispiel für schlechtes API. Wenn eine Funktion printf im Namen trägt, sollte sie auch printf leisten. Die hier macht ja nur print ohne f .

    Man kann zumindest das newline-Zeichen '\n' verwenden. Und es ist außerdem ein Tutorial...



  • indaclub schrieb:

    Nukularfüsiker schrieb:

    indaclub schrieb:

    unsigned int k_printf(char* message, unsigned int line, char attribute)
    

    Hey, gutes Beispiel für schlechtes API. Wenn eine Funktion printf im Namen trägt, sollte sie auch printf leisten. Die hier macht ja nur print ohne f .

    Man kann zumindest das newline-Zeichen '\n' verwenden. Und es ist außerdem ein Tutorial...

    Trotzdem darf diese Funktion die Zeichen in message überschreiben... ach egal.

    Wäre für dich vielleicht ein GNU/Linux System von Interesse? Man hat dort unendlich viele Möglichkeiten sowohl in die Kernel-, Treiber- und und und einzusteigen - ich erwähne es periodisch hier im Forum, weil viele, die aus der Windows Welt kommen können nicht im geringsten erahnen, welche Möglichkeiten man unter Linux hat 🤡



  • Nukularfüsiker schrieb:

    Hey, gutes Beispiel für schlechtes API. Wenn eine Funktion printf im Namen trägt, sollte sie auch printf leisten. Die hier macht ja nur print ohne f .

    Da bist du nicht der erste der sich wegen sowas beschwert. Inzwischen steht ja am Anfang des Tutorials auch eine Warnung, das vieles so nach und nach entstanden ist, und nicht unbedingt ideal gelöst ist. Das kprintf arbeitet inzwischen auch wie ein printf, nur das es zusätzlich noch Zeilennummer und Farbe annimmt. Aber es gibt immer noch einige Stellen wo es noch nicht berichtigt wurde. Es steht bei Erhard allerdings nicht sehr weit oben in der Prioritätsliste.



  • Auf des sher interessante Tutorial wurde ja schon hingewiesen. Der Lehrbuch-Klassiker schlechthin ist natürlich das Minix-Buch von Andrew Tanenbaum. Linus Torvalds hat auch erstmal mit Minix (1.x) angefangen, und dieses System anfangs als Entwicklungssystem für seinen eigenen Kernel benutzt.

    Das Ur-Minix war noch ein 16Bit-Realmode-System für den IBM PC-XT (gab aber auch Portierungen auf Amiga, Atari ST, 68k-Mac und AFAIR auf Sun/Sparc).

    Minix3 aus der 3. Auflage des Buches ist ein 32Bit-Protected Mode System.

    Für historisch interessierte wäre noch das original Unix von Bell-Labs interessant. V6 und V7 sind von Caldera unter eine OpenSource License gestellt und laufen auf dem PDP11/xx Simulator von SIMH (simulation of computing history).

    Es gibt auch noch das berühmte Lions Book, dass den gesammten Quellcode von Unix V6 kommentiert und erläutert. Es wurde von AT&T lange wegen Copyright-Verletzung 'verfolgt' und lange Jahre nur illegal weiterkopiert; heute kann man es wieder legal gedruckt kaufen.

    Zu 4.xBSD-Unix gibt es auch ein Buch von den Hauptautoren. Zu Interna des Linux-Kernels gibt es natürlich Bücher wie Sand am Meer.

    Wenn Du mehr über das Innenleben von MS Windows NT ff. erfahren willst (also nicht nur die User-Space API) gibt es MS Press Windows Internals 4 odr 5 und ein Buch über das WDK.



  • Frag doch einfach Bill Gates. Er war für PCs nicht der erste und nicht der beste in Sachen Betriebssysteme. Dennoch hat er die weltweite Marktführung erst mit DOS und dann mit Windows geschafft und beibehalten.

    Jetzt im Ernst: Dazu brauchst du sehr viel Ahnung. Ganz allein wirst du wohl nur Erweiterungen auf etwas bestehedem hinbekommen. Nimm ANSI-C (früher nahm man Assembler) und versuche dich. Wenn es gut ist, wird vielleicht jemand auf deine Arbeit aufmerksam. :p


Anmelden zum Antworten