Getting Started
On Oktober 2, 2021 by adminZunächst einmal ist die Entwicklung eines Betriebssystems wahrscheinlich eine der größten Herausforderungen, die man auf einem Computer bewältigen kann (neben dem Töten des Endgegners in Doom auf dem Schwierigkeitsgrad Nightmare). Die Entwicklung eines Betriebssystems erfordert eine Menge Wissen über verschiedene komplexe Bereiche der Informatik. Sie müssen verstehen, wie die Hardware funktioniert, und die komplexe Assemblersprache sowie eine höhere Programmiersprache (wie C, C++ oder Pascal) lesen und schreiben können. Ihr Verstand muss in der Lage sein, abstrakte Theorien zu verstehen und eine Vielzahl von Gedanken zu verarbeiten. Fühlen Sie sich schon entmutigt? Kein Grund zur Sorge! Denn all diese Dinge sind es auch, die das Programmieren von Betriebssystemen zu einem unterhaltsamen Vergnügen machen.
Es gibt nichts Schöneres als das Gefühl der Erfüllung, wenn man nach stundenlangem Ringen endlich ein Problem gelöst hat. Und nach einiger Zeit kann man zurückblicken und all die Dinge sehen, die man von Grund auf neu geschaffen hat. Ihr handgeschriebenes System ist in der Lage zu booten, funktioniert wie von Zauberhand mit der Hardware und bietet dem Benutzer eine Benutzeroberfläche und Programme, mit denen er spielen kann.
Es gibt keinen festen Weg, den Sie bei der Entwicklung eines Betriebssystems einschlagen müssen. Sobald Sie Ihr erstes System zum Laufen gebracht haben (und das tun Sie, indem Sie geeignete Anleitungen finden), wählen Sie den Weg, den Sie als nächstes gehen wollen. Ihr Betriebssystem ist genau das – Ihr eigenes. Sie haben die ultimative Kontrolle, und der Himmel ist die Grenze!
Inhalt
- 1 Die harte Wahrheit
- 2 Verantwortung
- 3 Erforderliches Wissen
- 4 Organisieren Sie Ihre Pläne
- 5 Auswahl Ihrer Entwicklungsumgebung
- 5.1 GNU/Linux
- 5.2 Windows
- 5.3 MacOS
- 6 Testen des Betriebssystems
- 7 Schützen des Codes
- 8 Gemeinsame Ausgangspunkte
- 9 Erwerben weiterer Kenntnisse
- 10 Siehe auch
- 10.1 Artikel
- 10.2 Themen
- 10.3 Externe Links
Die harte Wahrheit
Hoffentlich entmutigt Sie die grundlegende Tatsache nicht, dass die Entwicklung von Betriebssystemen ein komplizierter und fortlaufender Prozess ist. Die Wahrheit ist, dass die Entwicklung von Betriebssystemen wirklich unvergleichlich ist, da sie ein Höchstmaß an Geduld und sorgfältigem Code-Design erfordert und sehr wenig bis gar keine „sofortige Befriedigung“ bietet, wie man sie bei der Entwicklung von Dingen wie Spielen und webbasierten Skripten erhält.
Sie wurden vor der harten Arbeit, die vor Ihnen liegt, gewarnt, aber wenn Sie immer noch daran interessiert sind, dann machen Sie sich auf den Weg in das Reich des Betriebssystemprogrammierers. Bereiten Sie sich auf gelegentliche Anfälle von Verwirrung, Entmutigung und für einige von uns… vorübergehenden Wahnsinn vor. Mit der Zeit und mit genügend Hingabe werden Sie zu den wenigen gehören, die zu einem funktionierenden Betriebssystem beigetragen haben. Wenn Sie auf dem Weg dorthin entmutigt werden, können Sie sich mit dem Inhalt dieses Buches auffrischen. Es wird Sie hoffentlich daran erinnern, warum Sie diese verrückte Reise überhaupt angetreten haben.
In diesem Stadium lohnt es sich auch, die Seite Anfängerfehler zu lesen. Benutzer im Forum haben festgestellt, dass sich viele dieser Fehler im Laufe der Zeit wiederholen, und sie zu vermeiden ist ein guter Weg, um sich nicht zum Narren zu machen.
Verantwortung
Die Leute neigen dazu, zu behaupten, dass es in Ordnung ist, ineffiziente Software zu schreiben, mit der Begründung, dass Computersysteme heutzutage so schnell sind, dass man die Auswirkungen nicht sehen wird. Diese Art von Mentalität ist bei der Entwicklung von Betriebssystemen gefährlich. Es mag in Ordnung sein, schlampigen Code zu schreiben, wenn man eine einfache Anwendung erstellt, aber wenn es um kritischen Code geht, der möglicherweise Tausende von Malen pro Sekunde aufgerufen wird, muss man so viel Overhead wie möglich entfernen. Das Betriebssystem sollte den Computer als grundlegende Ressource für die laufenden Anwendungen bereitstellen, und zwar mit so wenig Komplikationen, Abstraktion und Overhead wie möglich.
Die Leute, die heutzutage Betriebssysteme entwerfen, neigen zu einer „Alles-außer-der-Spüle“-Mentalität. Sie nehmen es auf sich, alles zu berücksichtigen, was natürlich gut ist, aber es sollte nicht auf Kosten von schlecht geschriebenen Programmen geschehen, um zu gedeihen. Es gibt viele Dinge, die „unter der Haube“ vor sich gehen, wenn Programmfehler auftreten. Schlecht geschriebene Programme kosten wertvolle Ausführungszeit und beinhalten Aufgabenwechsel, die sowohl Speicher als auch Frequenz kosten. Wir ermutigen Sie, von schlecht geschriebener Software abzuraten.
Erforderliche Kenntnisse
Hauptartikel: Erforderliches Wissen
Wenn Sie glauben, dass Sie dies überspringen können, ist dies genau das Richtige für Sie.
Dieser Abschnitt wurde auf eine separate Seite verschoben, weil er in Forumsdiskussionen so oft erwähnt wird.
Organisieren Sie Ihre Pläne
Bevor Sie fortfahren, überlegen Sie, was Sie mit dem Schreiben eines Betriebssystems erreichen wollen. Was sind Ihre Beweggründe, dieses Projekt in Angriff zu nehmen? Es gibt viele mögliche Gründe, ein Hobby-Betriebssystemprojekt in Angriff zu nehmen, und die meisten OS-Entwickler haben mehr als einen. Es kann schon genügen, zu sagen: „Ich will es einfach“, aber je mehr Sie Ihre Ziele und Motive bedenken und klären, desto mehr können Sie sich auf das konzentrieren, was Sie wirklich wollen.
Seien Sie auch ehrlich zu sich selbst. Es ist keine Schande, größere Ziele für Ihr Projekt zu haben, auch (oder gerade) wenn sie nicht das Hauptziel sind. Versuchen Sie, sich alle Ihre Ziele einzugestehen, nicht nur das, von dem Sie glauben, dass es Ihr Hauptziel ist.
Versuchen Sie, sich darauf zu einigen, welche Aspekte der Betriebssystementwicklung Sie am meisten interessieren oder an denen Sie arbeiten wollen. Das meiste, was bei der Entwicklung von Betriebssystemen anfällt, vor allem in der Anfangszeit, ist Kernel-Design und -Entwicklung, aber der Kernel selbst ist nur ein kleiner Teil der meisten Betriebssysteme; wenn Ihr Hauptinteresse in der Benutzeroberfläche, im Netzwerk oder in der Treiberprogrammierung liegt, sollten Sie darüber nachdenken, ob Sie wirklich (jetzt oder in der Zukunft) Ihr eigenes Betriebssystem schreiben müssen, oder ob Sie genauso zufrieden wären, diese Dinge auf einem bestehenden Kernel zu entwickeln. Nicht wenige Leute sind in die OS-Entwicklung eingestiegen, obwohl sie eigentlich eine Desktop-Umgebung entwerfen wollten, daher ist dies eine sehr wichtige Frage, die Sie sich stellen sollten.
Versuchen Sie, an irgendwelche Nicht-OS-Projekte zu denken, die Sie vielleicht zuerst oder gleichzeitig in Angriff nehmen wollen, insbesondere solche, die als Übung oder Vorbereitung für das OS-Projekt dienen könnten. Normalerweise gibt es keinen Grund, sofort an dem Betriebssystem-Projekt zu arbeiten, und je mehr Sie sich im Voraus vorbereitet haben, desto besser sind Sie dran (zumindest bis zu einem gewissen Punkt – Vorbereitung ist eine Sache, Prokrastination eine andere).
So wie Sie ein bestehendes Design abspalten wollen, um damit zu experimentieren oder es für einen bestimmten Zweck zu modifizieren, konzentrieren Sie sich eher darauf als auf allgemeine Entwicklungsfragen. Überlegen Sie, welche Teile der bestehenden Code-Basis Sie benötigen und welche Sie ändern wollen.
Versuchen Sie, einige Ihrer spezifischen Projektziele auszuarbeiten, und seien Sie darauf vorbereitet, separate Projekte zu planen, wenn es hilfreich ist, dies zu tun. Wenn Sie einfach nur herumprobieren und sehen wollen, wohin es Sie führt, ist das in Ordnung; wenn Sie Microsoft stürzen wollen, ist das auch in Ordnung (wenn auch wahrscheinlich unrealistisch). Sobald Sie wissen, was Sie tun wollen, können Sie die Details in konkrete Ziele aufschlüsseln und herausfinden, was nötig wäre, um diese zu erreichen. Versuchen Sie nicht, zu viele unterschiedliche Ziele in ein Projekt zu zwingen – wenn Sie verschiedene Dinge mit widersprüchlichen Zielen ausprobieren wollen, teilen Sie sie in verschiedene Projekte auf.
Es kann hilfreich sein, wenn Sie einen Überblick über Ihr geplantes Betriebssystem-Design schreiben, mit allen spezifischen Anforderungen oder Details, die Sie für bemerkenswert halten oder die verdeutlichen könnten, wozu Sie Hilfe brauchen, und fügen Sie es, wenn Sie können, Ihrem öffentlichen Repository hinzu. Das macht es nicht nur für andere einfacher, Ihnen zu helfen, sondern hilft auch, Ihre Pläne zu organisieren und zu stabilisieren, ähnlich wie beim Schreiben einer Gliederung für eine Geschichte oder einen Aufsatz. Stellen Sie sich darauf ein, das Dokument zu pflegen, wenn sich Ihre Ziele und Pläne ändern, aber bewahren Sie eine Kopie älterer Versionen auf (oder noch besser, stellen Sie das Dokument unter Versionskontrolle), damit Sie sehen können, wie sich Ihre Arbeit im Laufe der Zeit entwickelt.
Schließlich sollten Sie den Zeit- und Ressourcenaufwand für das Projekt prüfen und entscheiden, ob er machbar ist. Wenn Sie wissen, dass Sie nur eine bestimmte Zeit für das Projekt zur Verfügung haben, sollten Sie das berücksichtigen und sich auf keinen Fall auf einen äußeren Termin festlegen, auch wenn Sie sicher sind, dass Sie ihn einhalten können. Die Entwicklung eines Betriebssystems braucht Zeit – viel Zeit – und der Versuch, ein komplettes Betriebssystemprojekt in einem Semester fertig zu stellen, ist nicht realistisch.
Wählen Sie Ihre Entwicklungsumgebung
Sie brauchen eine Plattform, auf der Sie Ihr neues System entwickeln. Dem Trend der allgemeinen Computertechnik folgend, ist GNU/Linux die beliebteste, aber viele benutzen auch Windows. Entwickler, die ein GNU/Linux-System verwenden, haben einen leichten Vorteil bei der Verfügbarkeit von Werkzeugen, aber dies kann unter Windows mit einem System wie Cygwin oder MinGW gelöst werden.
- Binutils: Grundlegende Werkzeuge zur Manipulation von Objektdateien.
- GCC: Die GNU Compiler Collection. GCC enthält u.a. Compiler für C, C++, Fortran und Ada.
- Make: Zur Automatisierung des Build-Prozesses, was sehr hilfreich ist, wenn man mehr als eine Handvoll Dateien hat.
- Grep und sed: Für leistungsfähigere Suchen und Suchen-und-Ersetzen (hilfreich beim Ausfüllen von Tabellen mit Daten).
- Diffutils: Unglaublich nützlich, um die Unterschiede zwischen zwei Dateien anzuzeigen.
- Perl oder Python: Eine dieser beiden Skriptsprachen sollte installiert sein. Nützlich u.a. für Stringmanipulation. Früher war Perl die Empfehlung, aber Python ist inzwischen recht ausgereift und möglicherweise leichter zu erlernen. Für beide gibt es Hunderte von Paketen/Modulen für verschiedene Aufgaben.
- Ein Assembler: Zum Beispiel NASM oder GAS. Dies hängt von der Architektur Ihrer Ziel-CPU ab.
- Ein Editor: Zum Schreiben Ihrer Assembler-, C- und anderer (Code-)Dateien.
Sie werden vielleicht nicht alle diese Werkzeuge benutzen, aber es ist am besten, sie „für den Fall der Fälle“ zur Hand zu haben und zu wissen, wie man sie benutzt, selbst auf grundlegendem Niveau. Wenn Sie sich jedoch für eine andere Sprache entschieden haben, liegt die Wahl der Werkzeuge größtenteils bei Ihnen, und vielleicht hilft Ihnen die obige Liste gar nicht weiter. Die folgenden Informationen beziehen sich hauptsächlich auf C/C++- oder Assembler-Entwickler.
GNU/Linux
Das am meisten empfohlene System für die Betriebssystementwicklung ist GNU/Linux. Wenn Sie GNU/Linux verwenden, sind die meisten GNU-Entwicklungswerkzeuge wahrscheinlich bereits vorhanden. Falls nicht, verwenden Sie die Paketverwaltungswerkzeuge Ihrer Distribution (APT, RPM, Portage, Pacman, Apk, etc.), um sie nach Bedarf zu installieren. Auch hier ist es erforderlich, einen Cross-Compiler zu erstellen, um die Laufzeitdateien des Entwicklungssystems nicht einzubinden.
Gängige Editoren sind Vim, Emacs, KDevelop, Komodo Edit usw. Manche bevorzugen statt einer IDE leichtgewichtige Editoren wie gedit, Geany und SciTE. Viele mögen Midnight Commander, der eine Text-UI und einen eingebauten Editor (mcedit) hat und daher extrem leichtgewichtig und blitzschnell ist.
Die Liste der Linux-Distributionen zeigt, welche Distributionen Sie verwenden sollten. Es gibt sie in allen Formen und Größen, und nicht alle sind für die Kernelentwicklung geeignet. Verwenden Sie keine Distribution, die ein bestimmtes Ziel verfolgt, wie z.B. Sicherheit (Kali, Qubes, BackTrack, Parrot usw.), wissenschaftliche Anwendungen (z.B. Scientific), Firewalls und Routing (z.B. DD-WRT), Systemwiederherstellung oder eingebettete Umgebungen (Knoppix, Rescatux, TinyCore) oder speziell auf Anfänger ausgerichtet ist (wie Linux Mint, Nitrux usw.) Obwohl ein einsteigerfreundliches Linux ausreichen könnte, wählen Sie eine universelle Distribution. Verwenden Sie auch eine Distribution, die aktuelle Pakete hat, am besten eine, die Rolling-Release verwendet. Debian ist einfach zu benutzen, liefert aber oft uralte und gepatchte Versionen aus (die Tools verhalten sich vielleicht nicht wie beschrieben). Viele Anfänger mögen Ubuntu, was in Ordnung ist, aber es soll Probleme mit einigen Toolchains und Kompilierumgebungen haben (wenn Sie Ihren eigenen Cross-Compiler kompilieren, anstatt einen installierten zu verwenden, ist das kein Problem).
Die besten Distros für die Kernelentwicklung sind (aber denken Sie daran, dass dies auch eine Frage des persönlichen Geschmacks ist, so dass diese Distros nicht erforderlich sind, sondern eher empfohlen werden, und sie erfordern in der Regel einige Erfahrung): Arch, Gentoo, Solus, Slackware, void etc. sogar Puppy.
Wenn Sie unsicher sind, versuchen Sie es mit Ubuntu oder Manjaro.
Windows
Um die nötigen Tools zu bekommen, sollten Sie die Cygwin-Umgebung installieren. MinGW oder DJGPP sind Alternativen, aber MSYS2 wird dringend empfohlen, da es die vollständigste und kompatibelste Umgebung ist und auch einen Paketmanager enthält, um Bibliotheken und Tools zu installieren.
Microsoft hat kürzlich (zum Zeitpunkt des Schreibens) das Windows Subsystem für Linux als optionales Feature für Windows 10 veröffentlicht. Dabei handelt es sich im Grunde um eine echte Ubuntu-Kommandozeilendistribution, die OHNE die Verwendung einer VM auf Windows läuft. Die neuesten GCC und Binutils (6.1.0 und 2.27 zum Zeitpunkt der Erstellung dieses Artikels) kompilieren und arbeiten korrekt in dieser Umgebung. Mit der Bash-Shell können Sie auf Ihre Windows-Festplatten über /mnt/<Laufwerksbuchstabe> zugreifen. Der Vorteil dieser Lösung ist, dass Sie mit allen Windows- oder Linux-Tools arbeiten können, die Sie benötigen, ohne herausfinden zu müssen, ob sie in Cygwin funktionieren. Viele der benötigten Werkzeuge können mit „apt-get“ installiert werden.
Für alle oben genannten Anwendungen wird dringend empfohlen, einen Cross-Compiler zu erstellen, nicht nur, weil die Standard-Compiler auf verschiedene ausführbare Formate abzielen, sondern weil es generell eine gute Idee ist. Auf der GCC Cross-Compiler Seite finden Sie Details und Anleitungen.
Sie benötigen auch einen Editor. Mit Notepad wird es funktionieren, aber es ist einfacher, wenn Sie einen umfassenderen Editor haben. Zum Beispiel werden Notepad++ oder Notepad2 von vielen Leuten benutzt. Wenn Sie mit Unix-Editoren vertraut sind, können Sie einen aus der von Cygwin bereitgestellten Auswahl wählen (dazu gehören z.B. Vim und Emacs, die etwas gewöhnungsbedürftig, aber sehr leistungsfähig sind).
Es ist auch möglich, Visual Studio oder die frei herunterladbare Visual C++ Express Edition zu verwenden, um Ihr Betriebssystem zu schreiben und zu kompilieren. Sie benötigen eine spezielle Konfigurationsdatei und sind sicherlich in der Minderheit, aber es funktioniert ganz gut. Sie können sogar das Windows-SDK zusätzlich installieren und so 64-Bit-Entwicklung ermöglichen. Der einzige Nachteil ist, dass Inline Assembly nicht unterstützt wird.
Auch andere Tools wie Watcom oder Borland können verwendet werden, aber sie haben jeweils ihre eigenen spezifischen Anforderungen und sind für diese Art von Arbeit nicht weit verbreitet.
MacOS
Da es unter der Haube das Userland von FreeBSD verwendet, ist es vollständig POSIX-kompatibel. Alle üblichen Werkzeuge sind vorhanden (vi, bash, dd, cat, sed, tar, cpio, etc.) Fast jedes Tutorial funktioniert sofort. Die fehlenden Werkzeuge beziehen sich hauptsächlich auf das Dateisystem: kein loopback device, kein fdisk, kein mkfs.vfat und keine mtools. Aber man kann diskutil für diese Zwecke verwenden, oder brew oder macports benutzen, um die fehlenden Tools zu installieren.
Um gcc zu bekommen, brauchte man ein mpkg auf der zweiten Installations-DVD für die älteren Versionen. Neuere MacOS-Versionen (ab 10.13) können XCode (nicht die IDE, nur die Toolchain) über die Kommandozeile installieren, indem sie „xcode-select –install“ aus einem Terminal heraus ausführen. Dies wird gcc, binutils und make installieren. Dieser gcc ist eigentlich ein masquaraded CLang, aber funktionsreich genug, um ohne Probleme einen eigenen Cross-Compiler zu bauen. Es ist vorzuziehen, den offiziellen Compiler für das Bootstrapping von gcc zu verwenden, als einen von brew oder macports zu installieren.
Testen des Betriebssystems
Hauptartikel: Testen
Der obige Artikel geht ausführlich darauf ein, wie man sein Betriebssystem testet und wie man das in seinen Entwicklungsprozess integriert. Es werden sowohl physische als auch emulierte Testumgebungen besprochen.
Schützen Sie Ihren Code
Während der Entwicklung Ihres Codes werden Sie hunderte, sogar tausende von Codezeilen schreiben. Sie werden eine unvorstellbare Anzahl von Stunden damit verbringen und bis spät in die Nacht hinein programmieren, obwohl Sie eigentlich ins Bett gehen sollten. Das Letzte, was Sie brauchen, ist ein Festplattenabsturz oder ein schlecht geschriebener ‚rm‘- oder ‚format‘-Befehl, der Ihre ganze Arbeit zunichte macht.
Was Sie brauchen, ist ein Versionskontrollsystem. CVS wird schon seit einigen Jahren verwendet, hat aber in letzter Zeit viel Konkurrenz von Subversion, Bazaar, Mercurial und Git bekommen. Wenn Sie die Möglichkeit haben, sollten Sie einen entfernten Computer oder Server als Versionskontrollserver einrichten, aber wenn Sie einen solchen Rechner nicht zur Verfügung haben, können Sie das Versionskontrollsystem auch auf Ihrem lokalen Entwicklungscomputer hosten. Denken Sie nur daran, Ihren Code hin und wieder auf CD oder FTP zu sichern.
Wir können diesen Punkt nicht stark genug betonen: Wenn Sie die Versionskontrolle noch nicht benutzen, sollten Sie sofort damit anfangen. Sie brauchen nur einmal einen schwerwiegenden Fehler in Ihrem Code zu machen, um zu erkennen, wie wichtig es ist, dass Ihr Code sicher versioniert und leicht wieder auffindbar ist. Auch wenn es für ein kleines, privates Hobbyprojekt übertrieben erscheinen mag, werden Sie sich fragen, wie Sie jemals ohne Revisionskontrolle ausgekommen sind, sobald Sie sich daran gewöhnt haben.
Für Git können Sie Ihr Projekt auf GitHub erstellen. Bitbucket ist ebenfalls eine gute Alternative, da es sowohl Git als auch Mercurial unterstützt. Beide bieten kostenlose, private Repositorys.
Ein weiterer Vorteil der Versionskontrolle in einem über das Netzwerk zugänglichen Repository ist, dass es viel einfacher ist, mit anderen zusammenzuarbeiten und Hilfe von anderen zu erhalten. Das kann sehr nützlich sein, besonders in den Foren, da es die Notwendigkeit vermeidet, ständig aktualisierte Versionen Ihres Codes in einem Nachrichten-Thread zu posten – Sie verweisen die Konversation einfach auf Ihr Repository, und die anderen in dem Thread haben direkten Zugriff auf Ihre aktuellsten Änderungen. Es ist auch von entscheidender Bedeutung, wenn Sie, während das Projekt wächst, anfangen, mit anderen Entwicklern an dem Projekt zu arbeiten (erwarten Sie nur nicht, dass das über Nacht passiert).
Gemeinsame Ausgangspunkte
Der einfachste Weg, einen „Hallo Welt“ Kernel in Gang zu bringen, ist das Bare Bones Tutorial. Eine andere Herangehensweise wäre zu lernen, wie der Computer selbst startet, auf der Seite Boot Sequence.
Es gibt auch viele andere Tutorials.
Weiteres Wissen erhalten
Es gibt heute eine erstaunliche Menge an Wissen über die Entwicklung von Betriebssystemen im Internet. Es geht nur darum, es zu finden. Zunächst einmal ist da dieses Wiki selbst. Unter anderem haben wir viele Tutorials. Da Sie hier sind, haben Sie sie wahrscheinlich schon gefunden. Außerdem gibt es auf dieser Seite das Forum, in dem sich viele Entwickler aufhalten und Ihnen helfen können (lesen Sie aber vorher unbedingt den Abschnitt Wie man Fragen stellt). Es gibt eine ganze Reihe von Büchern über die Entwicklung von Betriebssystemen. Einige davon sind auf unserer Bücher-Seite zu finden, und weitere auf osdever.net.
Schreibe einen Kommentar