Ich bin ein sehr ehrgeiziger Universitätsstudent, der so ziemlich alles lernen möchte, was man über Computer wissen muss. Kürzlich dachte ich, es wäre ein lustiges Projekt (wenn auch ein langwieriges), meinen eigenen Kernel zu entwerfen und zu bauen.
Ich habe einige grundlegende Informationen und ich habe festgestellt, dass ich Assembly und C / C ++ beherrschen muss, damit dies wirklich funktioniert. Während ich daran arbeite, möchte ich lernen, wie ein Kernel aus der Perspektive der Programmierung funktioniert. Ich habe Stunden damit verbracht, den Code des Linux-Kernels zu durchsuchen, aber das kann dich nur so weit bringen.
Was sind die grundlegenden Schritte beim Erstellen eines Kernels? Dinge, die Sie ansprechen müssen? Bestellen oder Dinge tun? Ich weiß, dass ich viel abbeiße, aber ich bin entschlossen genug, damit umzugehen.
Antworten:
Sie müssen lediglich das Betriebssystem entwerfen. Auch wenn Sie zum Beispiel entscheiden, dass es sich um ein UNIX-ähnliches System handeln soll, sind noch viele Entscheidungen zu treffen. Wie sehr soll es UNIX ähneln? Welche Teile von UNIX gefallen Ihnen und welche sind Ihrer Meinung nach verbesserungswürdig?
Wenn Sie nicht darauf festgelegt sind, UNIX-artig zu sein, müssen Sie am Ende noch weitere Fragen beantworten: Sollten Prozesse einen Baum bilden oder sind sie "flach"? Welche Art von prozessübergreifender Kommunikation möchten Sie unterstützen? Möchten Sie, dass es sich um ein Mehrbenutzer- oder nur ein Multitasking-Verfahren (oder möglicherweise ein Single-Tasking-Verfahren) handelt? Möchten Sie, dass es sich um ein Echtzeitsystem handelt? Welchen Grad an Isolation möchten Sie zwischen den Aufgaben erreichen? Wo soll es im monolithischen Vergleich zum Mikrokern liegen? Inwieweit (falls vorhanden) soll der verteilte Betrieb unterstützt werden?
Ich würde generell raten gegen den Linux - Kernel für Ihre Inspiration zu studieren. Das ist nichts gegen den Linux-Kernel selbst, aber eine einfache Tatsache, dass Linux in erster Linie für die Produktion gedacht ist, nicht für die Ausbildung. Es hat viele Optimierungen, Abwärtskompatibilitäts-Hacks usw., die für die Produktion äußerst nützlich sind, aber eher ablenken als erziehen.
Wenn Sie es finden, ist ein Exemplar von Lion's Book ( Lions-Kommentar zur 6. UNIX-Edition mit Quellcode von John Lions) ein viel einfacherer Ausgangspunkt. Die 6. Edition von UNIX war noch klein und einfach genug, um relativ schnell gelesen und verstanden zu werden, ohne dass es sich dabei um ein stark vereinfachtes Spielzeugsystem handelte.
Wenn Sie vorhaben, auf x86 (zumindest in erster Linie) zuzugreifen, sollten Sie sich auch MMURTL V 1.0 von Richard Burgess ansehen . Dies stellt ein System für x86 dar, das die x86-Hardware viel stärker als ursprünglich von den CPU-Designern beabsichtigt nutzt - etwas, das die meisten realen Systeme zugunsten der Portabilität auf andere CPUs meiden. Wie Sie sich vorstellen können, ist dies in der Regel viel stärker auf das Hardware-Ende der Dinge ausgerichtet. Gedruckte Exemplare scheinen teuer und schwer zu finden zu sein, aber Sie können den Text und den Code kostenlos herunterladen .
Zum Glück gibt es noch einige weitere Möglichkeiten - das Design und die Implementierung von Betriebssystemen , zum Beispiel von Andrew Tanenbaum und Albert Woodhull.
quelle
Ich würde vorschlagen, mit einer winzigen, sehr konzentrierten Aufgabe zu beginnen: Schreiben Sie mithilfe von Assembly ein Spielzeug-Bootstrap-Programm. Es muss nicht viel tun. Sie möchten lediglich, dass der Computer das Programm beim Start automatisch lädt, eine Meldung druckt, in der bestätigt wird, dass es ausgeführt wird, Eingaben von der Tastatur liest, eine weitere Meldung druckt und dann den Computer herunterfährt.
Dies hätte mehrere Vorteile:
Sobald Sie dies tun können, haben Sie eine viel bessere Vorstellung davon, worauf Sie sich einlassen.
quelle
Das Erlernen des Programmierens in Assembler ist ein guter erster Start, und dies kann auch unter MSDOS 6.0 hilfreich sein, da es an integrierten Funktionen mangelt.
Ein gutes Buch wie Operating System Concepts zu lesen, wäre ein guter Anfang, um einen eigenen Kernel zu entwerfen. Sie müssen das Booten, die Verwaltung von Gerätetreibern, die Schnittstelle zum BIOS, die Erstellung und Verwaltung von Dateisystemen, die Programmplanung, das Laden und Entladen von Programmen und die Implementierung von mindestens einer Art Shell übernehmen (viel einfacher als das Erstellen eines Fenstersystems).
C / C ++ funktioniert nur, wenn Ihr Kernel mit den Standardbibliotheken für diese Sprachen kompatibel ist. Andernfalls müssen Sie auch eine Kopie dieser Bibliotheken schreiben.
An Multithreading, Systemsicherheit und Vernetzung wird noch gar nicht gedacht.
quelle
Minix ist ein netter Unix-Klon (der Linux inspiriert hat), der für den Unterricht geschrieben wurde.
Andrew S. Tannenbaum ist ein ausgezeichneter Autor und Lehrer und hat ein ganzes Buch über Betriebssysteme am Beispiel von Minix geschrieben (und den folgenden Quellcode beigefügt): http://en.wikipedia.org/wiki/Operating_Systems:_Design_and_Implementation
Persönlich finde ich, dass er ein etwas besserer Schriftsteller ist als ein Programmierer, daher sind einige Dinge nicht so klar, wie ich persönlich möchte, aber - hey - es funktioniert!
Ich kann nur empfehlen, dies als Lernressource zu betrachten. Außerdem erhalten Sie eine Vorstellung davon, wie viel Arbeit erforderlich ist, um tatsächlich etwas zu produzieren, das tatsächlich nützlich sein kann.
quelle
Ich habe es auch gelernt. Sie können diese Ressourcen überprüfen. Sie sind sehr gut!
http://www.osdever.net/tutorials/index
http://kernelnewbies.org/
Viel Spaß auf dem Weg!
quelle