Heim > Backend-Entwicklung > C++ > Betriebssystementwicklung (Die Wahrheit)

Betriebssystementwicklung (Die Wahrheit)

Mary-Kate Olsen
Freigeben: 2024-09-19 18:17:11
Original
514 Leute haben es durchsucht

OS Development (The truth)

Inhaltsverzeichnis

  • Einführung
  • 1. Der Bootloader: Der Startschuss
  • 2. Betreten des Kernels: Wo die Magie passiert
  • 3. Wählen Sie Ihre Sprache
  • 4. Sicherheit: Das Flugzeug nicht zum Absturz bringen
  • 5. Auf Geschwindigkeit optimieren
  • 6. Einrichten grundlegender Treiber
    • 6.1 Videotreiber
    • 6.2 Tastaturtreiber
    • 6.3 E/A-Treiber
  • 7. Eine Shell schreiben: Die Benutzeroberfläche
  • 8. Erstellen eines benutzerdefinierten Dateisystems
  • 9. Hinzufügen eines Maustreibers: Klicken und verschieben
  • 10. Erstellen einer einfachen GUI
  • 11. Umgang mit Fenstern und Ereignissen
  • 12. Erstellen einer Notepad-App: Vom Klicken zum Tippen
  • 13. Letzter Feinschliff: Damit es sich wie ein Betriebssystem anfühlt

Einführung

Ein Betriebssystem von Grund auf zu erstellen ist eine der herausforderndsten und lohnendsten Erfahrungen, die Sie als Entwickler machen können. Im Gegensatz zur High-Level-Anwendungsentwicklung, bei der für fast alles eine Bibliothek vorhanden ist, müssen Sie bei der Betriebssystementwicklung nah am Metall arbeiten, direkt mit der Hardware in Berührung kommen, den Speicher manuell verwalten und jeden Aspekt der Funktionsweise Ihrer Maschine steuern.

Nach meiner Erfahrung bedeutet das Erstellen eines Betriebssystems, sich tief in die Assemblersprache einzuarbeiten, sich mit der Hardware auseinanderzusetzen und sich mit Abstürzen, Neustarts (INSBESONDERE Neustarts) und langen Debugging-Sitzungen herumzuschlagen. Wenn Sie der Meinung sind, dass das Debuggen eines Bootloaders schwierig ist, versuchen Sie es ohne den Luxus moderner Tools. Durch die Betriebssystementwicklung stellen Sie Ihre Lebensentscheidungen öfter in Frage, als Sie zählen können.

Das heißt, lassen Sie uns alles aufschlüsseln, vom Bootloader bis hin zu einer voll funktionsfähigen Desktop-Umgebung, in der Sie eine Maus bewegen und einen Texteditor zum Tippen öffnen können.


1. Der Bootloader: Der Startschuss

Was ist ein Bootloader?

Der Bootloader ist der erste Schritt auf dem Weg zur Betriebssystementwicklung. Wenn sich Ihr Computer einschaltet, übernimmt das BIOS, überprüft Ihre Hardware und lädt dann Ihren Bootloader von der Festplatte in den Speicher. Die Aufgabe dieses kleinen Programms besteht darin, die CPU vorzubereiten und den Kernel Ihres Betriebssystems in den Speicher zu laden. Sie müssen den Bootloader in Assembly schreiben, da Sie es in dieser Phase direkt mit der Hardware zu tun haben.

Wenn der Bootloader startet, befindet sich die CPU im 16-Bit-Real-Modus, was bedeutet, dass sie nur 1 MB Speicher adressieren kann. Als Erstes müssen Sie den Kernel von der Festplatte laden und in den Speicher verschieben. Danach schaltet der Bootloader die CPU in den 32-Bit-geschützten Modus und schon beginnt der Spaß. Das Umschalten der Modi erfordert die Einrichtung der Global Descriptor Table (GDT) zur Verwaltung von Speichersegmenten und die Aktivierung des Protection Enable (PE)-Bits im Steuerregister der CPU. Wenn Sie das falsch verstehen, friert das System entweder ein oder stürzt in eine Boot-Schleife, was mir öfter passiert ist, als ich zugeben möchte.

Real-Modus vs. geschützter Modus

Im Real-Modus ist alles extrem begrenzt – 16-Bit-Register, 1 MB Speicherzugriff, kein Speicherschutz. Aus diesem Grund ist der Wechsel in den geschützten Modus so wichtig. Im geschützten Modus hat Ihre CPU Zugriff auf 32-Bit-Register, größere Speicheradressierung und erweiterte Funktionen wie Multitasking und Paging (virtueller Speicher). Beim Bootloader geht es darum, diesen Übergang nahtlos zu gestalten.


2. Betreten des Kernels: Wo die Magie passiert

Sobald die CPU in den geschützten Modus wechselt, übergibt der Bootloader die Steuerung an den Kernel. Der Kernel ist der Kern des Betriebssystems und für die Verwaltung von allem verantwortlich: Hardware, Speicher, Prozesse und Systemressourcen.

Wenn der Kernel startet, muss er mehrere kritische Systeme einrichten:

  1. Paging: Dies ist ein Speicherverwaltungsschema, das es dem Betriebssystem ermöglicht, jedem Prozess seinen eigenen virtuellen Speicherplatz zuzuweisen. Ohne sie würden alle Prozesse denselben Speicher teilen, was ein Rezept für eine Katastrophe ist.
  2. Interrupt-Handhabung: Der Kernel muss Interrupts verarbeiten, bei denen es sich um Signale von Hardware (wie Tastaturen oder Festplattenlaufwerken) handelt, dass etwas sofortige Aufmerksamkeit erfordert. Dazu müssen Sie eine Interrupt-Deskriptortabelle (IDT) definieren, die Interrupts bestimmten Handlerfunktionen im Kernel zuordnet.
  3. Aufgabenplanung: In jedem Betriebssystem, das mehrere Prozesse ausführt, benötigt der Kernel eine Möglichkeit, die CPU-Zeit zu verwalten. Ein Planer entscheidet, welcher Prozess wann CPU-Zeit erhält, und stellt so sicher, dass das System reaktionsschnell und effizient ist.

Das Erstellen des Kernels ist eine lange und komplexe Aufgabe, aber auch eine der lohnendsten. Hier können Sie das Innenleben eines Betriebssystems sehen und jedes kleine Detail des Verhaltens Ihrer Maschine steuern.


3. Wählen Sie Ihre Sprache

Beim Erstellen eines Betriebssystems müssen Sie für jede Aufgabe die richtige Programmiersprache auswählen. Der Bootloader ist normalerweise in Assembly geschrieben, da Sie die Hardware direkt steuern müssen. Sobald Sie sich jedoch im geschützten Modus befinden und am Kernel arbeiten, wechseln die meisten Entwickler zu C, da Sie damit eine Steuerung auf niedriger Ebene erhalten, ohne den Aufwand, alles in Assembler schreiben zu müssen.

Einige Entwickler verwenden C für die Kernel-Entwicklung, da es objektorientierte Funktionen bietet, die die Verwaltung komplexer Systeme erleichtern können. C bringt jedoch zusätzlichen Overhead mit sich und die Speicherverwaltung in C kann in einer Betriebssystemumgebung schwieriger sein. C bietet Ihnen die rohe Leistung und Einfachheit, die Sie für die Systemprogrammierung benötigen.


4. Sicherheit: Lassen Sie das Flugzeug nicht abstürzen

Bei der Betriebssystementwicklung ist Sicherheit von entscheidender Bedeutung. Im Gegensatz zur High-Level-Programmierung, bei der ein Absturz möglicherweise nur eine Fehlermeldung oder das Herunterfahren der App bedeutet, bedeutet ein Absturz in der Betriebssystementwicklung normalerweise einen vollständigen Neustart des Systems. Sie arbeiten direkt mit dem Speicher. Das heißt, wenn Sie die Speicherverwaltung durcheinander bringen, können Sie Systemdaten beschädigen, wichtige Strukturen überschreiben oder eine Kernel-Panik verursachen.

Der Kernel muss einen Speicherschutz implementieren, um zu verhindern, dass ein Prozess den Speicher eines anderen überschreibt. Dies geschieht mittels Paging, das jeden Prozess seinem eigenen virtuellen Speicherbereich zuordnet. Wenn Sie dies falsch verstehen, wird das gesamte System instabil und Sie müssen tagelang nach Speicherfehlern suchen. Vertrauen Sie mir, ich war dort.


5. Optimierung auf Geschwindigkeit

Geschwindigkeit ist ein Schlüsselfaktor dafür, dass sich Ihr Betriebssystem reaktionsschnell anfühlt. Ein langsamer Kernel bedeutet ein langsames System, daher ist die Optimierung der Leistung von entscheidender Bedeutung. Hier sind einige Schlüsselbereiche, in denen Geschwindigkeit wichtig ist:

  • Interrupt-Behandlung: Anstatt ständig nach Eingaben zu fragen (was CPU-Zyklen verschwendet), sollten Sie Hardware-Interrupts einrichten. Auf diese Weise reagiert die CPU nur, wenn tatsächlich eine Eingabe erfolgt, beispielsweise ein Tastendruck oder ein Netzwerkpaket.
  • Aufgabenplanung: Ein guter Planer verteilt die CPU-Zeit effizient zwischen den Prozessen und stellt sicher, dass kein Prozess die gesamte CPU-Zeit beansprucht, während andere verhungern. Es stehen viele verschiedene Planungsalgorithmen zur Auswahl, z. B. Round-Robin oder prioritätsbasierte Planung.
  • Lazy Loading: Laden Sie nicht alles auf einmal in den Speicher. Implementieren Sie Demand Paging, bei dem nur die Teile eines Programms, die tatsächlich verwendet werden, in den Speicher geladen werden. Dies hilft, Speicher zu sparen und die Systemleistung zu beschleunigen.

6. Einrichten grundlegender Treiber

Da Sie nun den Kernel zum Laufen gebracht haben, ist es an der Zeit, Treiber für die Interaktion mit der Hardware zu erstellen. Treiber sind die Brücke zwischen Ihrem Betriebssystem und der Hardware und ermöglichen dem Betriebssystem die Kommunikation mit Dingen wie der Tastatur, dem Display und den Festplatten.

6.1 Videotreiber

Zuerst startet Ihr Betriebssystem wahrscheinlich im Textmodus, in dem Sie Zeichen direkt in den Videospeicher drucken (normalerweise an der Adresse 0xB8000). Für das Debugging und die einfache Ausgabe ist das in Ordnung, aber irgendwann möchten Sie zu einer grafischen Benutzeroberfläche (GUI) wechseln. Dies erfordert einen Grafiktreiber, der die Steuerung auf Pixelebene, die Bildschirmauflösung und die Farbtiefe verwalten kann.

Das Einrichten eines Grafiktreibers ist ein großer Schritt in Richtung der Erstellung eines grafischen Betriebssystems, aber es ist auch eine der komplexeren Aufgaben, da es darum geht, zu verstehen, wie Ihre Anzeigehardware funktioniert, und große Datenmengen für jeden Frame zu verwalten.

6.2 Tastaturtreiber

Der Tastaturtreiber ist einer der wichtigsten Teile eines interaktiven Betriebssystems. Wenn Sie eine Taste drücken, sendet die Tastatur einen Scancode an die CPU. Die Aufgabe des Tastaturtreibers besteht darin, diesen Scancode in ein Zeichen oder eine Aktion zu übersetzen, die das Betriebssystem verstehen kann. Dazu gehört das Einrichten eines Interrupt-Handlers für IRQ1, den Hardware-Interrupt, den die Tastatur generiert.

Sobald Sie den Tastaturtreiber zum Laufen gebracht haben, können Sie damit beginnen, komplexere Benutzeroberflächen zu erstellen, Eingaben vom Benutzer entgegenzunehmen und Befehle zu verarbeiten.

6.3 I/O-Treiber

Der E/A-Treiber ermöglicht Ihrem Betriebssystem das Lesen und Schreiben auf die Festplatte. Dies ist wichtig für Dinge wie das Laden von Programmen, das Speichern von Dateien und das Speichern von Daten. Zuerst werden Sie wahrscheinlich über BIOS-Interrupts mit der Festplatte interagieren, aber wenn Ihr Betriebssystem reifer wird, möchten Sie auf mehr umsteigen

Erweiterte E/A-Methoden, die nicht auf das BIOS angewiesen sind, wie z. B. die direkte Kommunikation mit dem Festplattencontroller.


7. Eine Shell schreiben: Die Benutzeroberfläche

Sobald Sie Ihre Basistreiber zum Laufen gebracht haben, ist es an der Zeit, eine Shell zu erstellen – die Befehlszeilenschnittstelle (CLI), die Benutzern die Interaktion mit dem Betriebssystem ermöglicht. In der Shell können Benutzer Befehle eingeben, Programme ausführen und mit dem Dateisystem interagieren.

Die Implementierung einer Shell ist ein aufregender Schritt, da dies einer der ersten Orte ist, an denen sich Ihr Betriebssystem wirklich interaktiv anfühlt. Sie müssen Benutzereingaben (über die Tastatur) verarbeiten, Befehle verarbeiten und Programme ausführen. Hier beginnen Sie auch zu erkennen, wie wichtig die Fähigkeit Ihres Kernels zum Multitasking und zur effizienten Verwaltung von Prozessen ist.


8. Erstellen eines benutzerdefinierten Dateisystems

Das Dateisystem ermöglicht es Ihrem Betriebssystem, Daten auf der Festplatte zu speichern und abzurufen. Während Sie ein vorhandenes Dateisystem (wie FAT oder ext4) verwenden könnten, gibt Ihnen der Aufbau eines eigenen benutzerdefinierten Dateisystems mehr Kontrolle und kann eine unterhaltsame Herausforderung sein.

Ein einfaches Dateisystem sollte:

  • Reservieren Sie Speicherplatz auf der Festplatte für neue Dateien.
  • Behalten Sie den Überblick über Dateinamen, Dateigrößen und Metadaten.
  • Ermöglichen Sie das effiziente Lesen und Schreiben von Dateien.

Wenn Ihr Betriebssystem wächst, müssen Sie auch mit erweiterten Funktionen umgehen wie:

  • Verzeichnisse: Dateien in einer Hierarchie organisieren.
  • Berechtigungen: Steuern, wer Dateien lesen, schreiben oder ausführen kann.
  • Fragmentierung: Umgang mit Dateien, die auf mehrere Bereiche der Festplatte aufgeteilt werden.

Das Entwerfen eines Dateisystems ist schwierig, da es darum geht, Leistung, Zuverlässigkeit und Benutzerfreundlichkeit in Einklang zu bringen. Ein schlecht gestaltetes Dateisystem kann zu Datenbeschädigung, langsamer Leistung oder verschwendetem Speicherplatz auf der Festplatte führen.


9. Hinzufügen eines Maustreibers: Klicken und verschieben

Da Ihr Betriebssystem nun über eine CLI verfügt und Tastatureingaben verarbeiten kann, ist es an der Zeit, Mausunterstützung hinzuzufügen. Der Maustreiber ist dafür verantwortlich, die Bewegung der Maus zu verfolgen und diese in Bildschirmaktionen wie das Bewegen eines Cursors oder das Klicken auf Schaltflächen umzusetzen.

Das Erstellen eines Maustreibers umfasst die Handhabung von IRQ12, dem von der Maus generierten Hardware-Interrupt, und die Verarbeitung der Bewegungsdaten. Sobald Sie den Maustreiber installiert haben, können Sie über den Aufbau einer grafischen Benutzeroberfläche (GUI) nachdenken.


10. Erstellen einer einfachen GUI

Eine grafische Benutzeroberfläche (GUI) verwandelt Ihr Betriebssystem von einer Befehlszeilenschnittstelle in etwas, das eher wie eine moderne Desktop-Umgebung aussieht und sich anfühlt. In dieser Phase möchten Sie Fenster, Schaltflächen, Menüs und andere interaktive Elemente erstellen, auf die der Benutzer mit der Maus klicken kann.

Das Erstellen einer GUI umfasst die Verwaltung der Grafikwiedergabe (Zeichnen von Fenstern und Symbolen), die Verarbeitung von Eingabeereignissen (Klicks, Tastendrücke usw.) und die Implementierung eines Systems zur Verwaltung mehrerer Fenster und Anwendungen.

Zunächst könnte Ihre GUI sehr einfach sein – nur ein einziges Fenster, mit dem der Benutzer interagieren kann. Wenn Ihr Betriebssystem jedoch ausgereifter wird, möchten Sie möglicherweise erweiterte Funktionen wie die Größenänderung von Fenstern, Drag-and-Drop-Funktionen und Animationen hinzufügen.


11. Umgang mit Fenstern und Ereignissen

Sobald Sie die Grundlagen einer GUI eingerichtet haben, besteht der nächste Schritt darin, ein System zur Verwaltung von Fenstern und Ereignissen aufzubauen. Dazu gehört die gleichzeitige Handhabung mehrerer Fenster, in denen möglicherweise jeweils eine andere Anwendung ausgeführt wird, und die Sicherstellung, dass jedes Fenster die richtigen Eingabeereignisse empfängt (z. B. Mausklicks oder Tastaturdrücke).

Sie müssen außerdem die Fenster-Z-Reihenfolge (welches Fenster sich oben befindet), Minimieren/Maximieren und Ziehen implementieren. Ab hier fühlen sich die Dinge eher wie eine traditionelle Desktop-Umgebung an.


12. Erstellen einer Notepad-App: Vom Klicken zum Tippen

Um Ihre GUI funktionaler zu gestalten, möchten Sie grundlegende Anwendungen erstellen, wie z. B. eine Notepad-App. Die Notepad-App ist ein einfacher Texteditor, mit dem Benutzer Dateien eingeben, bearbeiten und speichern können. Zum Erstellen einer solchen App gehört Folgendes:

  • Handhabung der Texteingabeüber die Tastatur.
  • Text rendern auf dem Bildschirm.
  • Ermöglicht grundlegende Dateivorgänge wie Öffnen, Speichern und Schließen.

Dies ist eine großartige Übung, um alles zusammenzustellen: Ihre GUI, Ihr Dateisystem und Ihre Eingabeverarbeitung kommen hier alle ins Spiel. Sobald Sie eine Notepad-App zum Laufen gebracht haben, verfügen Sie über die Grundlagen eines voll funktionsfähigen Betriebssystems.


13. Letzte Handgriffe: Damit es sich wie ein Betriebssystem anfühlt

Zu diesem Zeitpunkt ist Ihr Betriebssystem funktionsfähig, aber es gibt immer kleine Details, die dafür sorgen, dass es sich ausgefeilter anfühlt. Dinge wie:

  • Benutzerkonten und Berechtigungen: Erlaubt mehreren Benutzern, ihre eigenen Einstellungen und Dateien zu haben.
  • Netzwerk: Unterstützung für TCP/IP hinzugefügt, damit Ihr Betriebssystem eine Verbindung zum Internet herstellen kann.
  • Systemaufrufe: Erstellen einer Schnittstelle, die Anwendungen zur Interaktion mit dem Kernel verwenden können.

Jedes kleine Detail, das Sie hinzufügen, bringt Ihr Betriebssystem dem Gefühl eines vollständigen Systems näher. Es ist ein langer und herausfordernder Prozess, aber am Ende haben Sie etwas wirklich Einzigartiges geschaffen – ein Betriebssystem, das von Grund auf neu erstellt wurde.

Das obige ist der detaillierte Inhalt vonBetriebssystementwicklung (Die Wahrheit). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage