Wie kann ich ein kleines Betriebssystem auf einem alten Desktop-Computer erstellen? [geschlossen]


111

Dies kann vergebens sein, da ich weiß, dass das Schreiben eines Betriebssystems unerträglich kompliziert ist (insbesondere für sich selbst).

  • Ich erwarte nicht, das nächste Linux oder Windows zu bauen.

  • Ich weiß, dass es schrecklich und fehlerhaft sein wird und nicht funktionieren wird, aber das ist in Ordnung.

Ich möchte alles selbst schreiben, in Assembly , C und (einigen) C ++ .

Dies ist ein zukünftiges Projekt, da ich im Moment mit einigen anderen Dingen beschäftigt bin und nicht sofort die Zeit habe, aber ich dachte, ich würde es jetzt fragen, also könnte ich vielleicht viele Antworten darauf bekommen, und es könnte Aufbau und eine nützliche Ressource für diese Art von Ansatz sein (alles andere, was ich gesehen habe, bestand darin, aus Minix aufzubauen, einen vorhandenen Bootloader zu verwenden, ihn in ein virtuelles Bootprogramm zu integrieren usw.).

Ich möchte einen meiner älteren Desktops mit Monitor, Tastatur und Maus einrichten und mit der Arbeit an einer leeren Festplatte beginnen.

Ich möchte lernen, wie ich meinen eigenen Bootloader schreibe (ich habe viele Ressourcen dazu gefunden, aber der Vollständigkeit halber bitte noch einige gute hinzufügen), meinen eigenen USB-Treiber (falls erforderlich), einen CD-Treiber (falls erforderlich) ) usw. Alles von Grund auf.

  • Wie lege ich den Code auf den Computer? Ist es am besten, es mit einer Diskette zu machen? Können die meisten Computer dies von einem USB-Stick aus tun?

  • Welche Treiber brauche ich, und können Sie Hinweise zum Erstellen dieser Treiber vorschlagen?

  • Nach der Bootsequenz - was dann? Wie komme ich in den geschützten Modus usw.

  • Wie verwalte ich den Speicher ohne die Hilfe eines Betriebssystems? Benutze ich nur die gewünschten Adressen? Keine Initialisierung notwendig?

  • Was werde ich zweifellos antreffen, das mich verwirren wird?

  • Wie kann ich es entweder zu einem Befehlszeilen-Betriebssystem oder zu einem grafischen machen?

  • Worauf baut ein grafisches Betriebssystem auf? Wie würde ich so etwas wie eine Befehlszeile mit einer Schriftart und einem Bild oben machen?

  • Wo kann ich über das Einrichten einer Multitasking-Umgebung lesen? (dh zwei grafisch ähnliche Befehlszeilen, die nebeneinander ausgeführt werden).

  • Wie würde ich eine Art Fenstersystem einrichten? Wie zeige ich Grafiken auf dem Bildschirm an, wenn einfaches Multitasking eingerichtet ist?

Glauben Sie mir, ich verstehe, dass dies ein sehr kompliziertes Projekt ist, und ich werde wahrscheinlich nie dazu kommen, es abzuschließen oder irgendetwas von Nutzen zu schreiben.

Es gibt viele andere Stücke, die ich nicht erwähnt habe. Wenn Sie an eines denken, können Sie diese auch hinzufügen.

Bitte geben Sie ein "Thema" pro Antwort an - zum Beispiel USB-Treiber und dann möglicherweise eine Liste mit Ressourcen, Dingen, auf die Sie achten müssen usw.

Bitte schlagen Sie auch nicht vor, aus einem anderen Betriebssystem oder bereits vorhandenem Code aufzubauen. Ich weiß, dass ich viel bereits vorhandenen Code lesen werde (wie den Linux-Kernel oder Beispielressourcen, vorhandene Treiber usw.), aber letztendlich möchte ich das ganze Schreiben selbst machen. Ich weiß, ich sollte aus etwas anderem aufbauen, und es gibt viele andere Fragen dazu, die ich lesen kann, wenn ich es mir anders überlege und diesen Weg gehe. Aber hier geht es darum, das Ganze von Grund auf neu zu machen.

Irgendwelche Vorschläge, wie man es grafisch macht? Verschiedene Videomodi und wie man damit arbeitet usw.?


14
Dies ist mein größtes Ziel. Ich möchte ein Betriebssystem so schlecht schreiben, nur um Spaß zu haben und es zu lernen ... Ich konnte in den letzten Jahren einfach nicht die Zeit sparen. Wenn Sie jemals jemanden suchen, der Ihnen hilft oder einfach nur mit Ihnen über Dinge spricht, können Sie mir eine E-Mail an schmeling88 unter gmail.com senden
Max Schmeling

2
@Max und @Tom, ich habe auch den Fehler. Ich
bereite

2
Denken Sie jetzt nur nicht an Grafiken. Unix hat Grafiken nie direkt unterstützt und es ist nicht so schlimm. :-) Aber im Grunde gibt es keinen einfachen und tragbaren Weg, um über 800x600 IIRC hinauszukommen.
Bastien Léonard


1
Warum? Diese Frage ist uralt und erzeugt keine Aktivität mehr. Wen interessiert das?
Carson Myers

Antworten:


51

Das wichtigste zuerst. Lesen, lesen, lesen, lesen, lesen. Sie müssen genau wissen, wie das Betriebssystem funktioniert, bevor Sie hoffen können, Ihr eigenes zu implementieren.

Holen Sie sich eines von Andrew Tanenbaums Büchern über Betriebssysteme. Dies ist die, die wir in meiner OS-Klasse im College verwendet haben:

Moderne Betriebssysteme PDF

Moderne Betriebssysteme bei Amazon

Trotz des lächerlichen Covers ist es eine fantastische Lektüre, besonders für ein Lehrbuch. Tanenbaum ist wirklich ein Experte auf diesem Gebiet und seine Erklärungen zur Funktionsweise des Betriebssystems unter der Haube sind klar und leicht zu verstehen. Dieses Buch ist größtenteils Theorie, aber ich glaube, er hat auch ein Buch, in dem mehr über die Implementierung gesprochen wird. Ich habe es jedoch nie gelesen, daher kann ich es nicht kommentieren.

Dies sollte Ihnen dabei helfen, Prozessmanagement, Speicherverwaltung, Dateisysteme und alles andere, was Ihr Betriebssystemkernel tun muss, um einen bootfähigen Zustand zu erreichen, auf den neuesten Stand zu bringen. Ab diesem Zeitpunkt geht es im Wesentlichen darum, Gerätetreiber für die zu unterstützende Hardware zu schreiben und Implementierungen der C-Bibliotheksfunktionen anzubieten, um Kernelaufrufe zum Öffnen von Dateien und Geräten, Lesen und Schreiben, Weiterleiten von Nachrichten zwischen Prozessen usw. .

Informieren Sie sich über die x86-Assembly (vorausgesetzt, Sie entwerfen diese für einen x86-Computer). Das sollte viele Ihrer Fragen bezüglich des Wechsels zwischen Prozessorbetriebsarten beantworten.

Wenn Sie über Elektronikkenntnisse verfügen, ist es möglicherweise einfacher, mit dem Schreiben eines Betriebssystems für ein eingebettetes Gerät zu beginnen, das über eine umfassende Dokumentation verfügt, da es im Allgemeinen einfacher als ein x86-PC ist. Ich wollte schon immer auch mein eigenes Betriebssystem schreiben und beginne mit dem Schreiben eines eingebetteten Mikrokernel-Betriebssystems für This Development Board von Digilent. Es kann den Softcore-MicroBlaze-Prozessor von Xilinx ausführen, der über eine sehr gründliche Dokumentation verfügt. Es hat auch RAM, Flash-Datenspeicher, LEDs, Schalter, Tasten, VGA-Ausgang usw. Es gibt viel zu tun, um einfache Treiber zu schreiben.

Einer der Vorteile eines eingebetteten Geräts besteht auch darin, dass Sie möglicherweise das Schreiben eines VGA-Treibers für lange Zeit vermeiden können. In meinem Fall verfügt das Digilent-Entwicklungsboard über einen integrierten UART, sodass ich den seriellen Ausgang effektiv als Konsole verwenden kann, um das Ganze mit minimalem Aufwand auf eine Befehlszeile zu bringen.

Stellen Sie einfach sicher, dass für alles, was Sie als Ziel auswählen, ein sofort verfügbarer und gut getesteter Compiler vorhanden ist. Sie möchten nicht gleichzeitig ein Betriebssystem und einen Compiler schreiben.


2
+1, aber ich bevorzuge das Tanenbaum Minix-Buch (das eher auf die Implementierung ausgerichtet ist), und es besteht wirklich keine Notwendigkeit, sich zuerst nur auf die Theorie zu konzentrieren. Er wird sowieso beim ersten Versuch kein Betriebssystem schreiben. Er schreibt zuerst einen Bootloader, wechselt dann in den geschützten Modus, verarbeitet dann E / A und so weiter.
Bastien Léonard

2
+1 zum Schreiben eines Betriebssystems für einen eingebetteten Chip. Am Ende des Tages werden Sie das Gefühl haben, etwas Einzigartiges geschaffen zu haben, und es ist einfach einfacher als eines für (sagen wir) x86 zu schreiben, während die gleichen Kernkonzepte beibehalten werden. Schauen Sie sich zum Beispiel TinyOS an (obwohl es technisch gesehen kein Betriebssystem ist, gibt es Dinge wie Scheduler und Task-Module dafür.)
Kristopher Micinski

29

http://www.osdev.org/ und http://www.osdever.net/

Willkommen in der Welt der Betriebssystementwicklung.

Siehe auch andere Links zur x86-Dokumentation in SOs Tag-Wiki : Intel- und AMD-Handbücher, Compiler- / Assembler-Dokumente und verschiedene Anleitungen.

Es wird auch empfohlen, BOCHS oder eine andere virtuelle Umgebung zum Debuggen zu verwenden, da Sie Ihren Bootloader in einem Schritt ausführen und Register untersuchen können.


1
Und vor allem wiki.osdev.org !
Matthew Iselin

Vergessen Sie nicht forums.osdever.net :)
Brenden

6
Ich bin mir bewusst, dass dies nützliche Ressourcen sind, aber ich denke, es könnte für zukünftige Leser hilfreicher sein, wenn Sie einen Kontext anstelle einer Reihe von Links ohne Erklärung angegeben haben.
icktoofay

@icktoofay Die Frage ist zu weit gefasst, um richtig beantwortet zu werden, denke ich.
user253751

15

Ich würde vorschlagen, zumindest zunächst an Bochs oder einer anderen virtuellen Maschine zu arbeiten. Der Grund dafür ist, dass Sie sie überall hin mitnehmen können, das Debuggen einfacher ist (Sie können den genauen Status der Hardware sehen) und wenn ja Benötigen Sie Hilfe beim Debuggen von außen? Sie können genau die gleiche "Hardware" wie Sie verwenden.

Der nützlichste Rat, den ich habe, ist, sich in einen Zustand zu versetzen, in dem Sie C-Code so schnell wie möglich ausführen können - dh hochfahren, Ihre Deskriptortabellen einrichten und sich an einen Punkt bringen, an dem es sicher ist, kompiliertes C auszuführen Wenn nicht, sollte sich der gesamte Kernel in C befinden, wenn Sie gesund bleiben und weiter daran arbeiten möchten. Die Montage ist zwar an einigen Stellen erforderlich, jedoch langwierig und in der Regel schwer zu debuggen.


Ich werde in Bochs nachsehen, um vorerst herumzuspielen, aber ich möchte dies schließlich nur auf einem PC aufbauen
Carson Myers

Wenn es in BOCHS funktioniert, funktioniert es normalerweise auf einem echten PC, Modulo Unterschiede in ihrem BIOS. Die meisten Ihrer Fehler sind wahrscheinlich Dinge, die sich auf BOCHS und echte Hardware auswirken. Der Unterschied besteht jedoch darin, dass Sie den integrierten Debugger von BOCHS verwenden können, um herauszufinden, wo und in einem einzigen Schritt, um herauszufinden, wo Ihr Code in einer Endlosschleife in BOCHS steckt heraus wie / warum. Auf echter Hardware können Sie nur Debug-Prints hinzufügen. Die Verwendung eines Debuggers erspart Stunden und Tage des Kopfkratzens.
Peter Cordes

14

Auf der untersten Ebene muss ein Betriebssystem mindestens die Hardware eines Systems auf irgendeine Weise steuern und irgendwie eine Art "Benutzercode" laden und ausführen. Wenn Sie mit einem PC beginnen möchten, müssen Sie Code schreiben, den dieser von einem Gerät oder einem anderen laden kann. Ältere PCs verfügen über ein BIOS in der Firmware, das bestimmt, wie die Hardware eine Initialisierung durchführt (zumindest Video, Tastatur und irgendeine Form von Speicher oder Bootloader). (Update Oktober 2017: Neuere PCs verfügen über EFI- oder UEFI-Firmware ... was größtenteils ein pedantischer Unterschied ist; diese dienen denselben Zwecken für diese Diskussion).

Beginnen Sie also damit, die einfachen Details zur Verwendung des BIOS oder anderer Firmware auf Ihrem Zielsystem zu lernen. Lernen Sie also, wie Sie ein Programm schreiben, das das BIOS laden und ausführen kann. Das wird sich irgendwann in Ihren Bootloader verwandeln. Fangen Sie klein an. Holen Sie sich einfach ein Programm, das Folgendes druckt: "Hallo, Linus" direkt vom Firmware-Startvorgang (auf einer Diskette oder einem USB-Stick wäre dies ein guter Anfang ... oder auf einer Festplatte, wenn Sie möchten).

Von dort aus würde ich empfehlen, einen sehr einfachen seriellen Treiber zu schreiben ... Aktualisieren Sie Ihren Bootloader, um eine serielle Schnittstelle zu initialisieren, und starten Sie dort einen Download. Dann kann es den Code ausführen, über den es zieht. Von dort aus schreiben Sie ein bisschen Bootstrap, das in einen anderen Satz von Blöcken schreiben kann (wir haben noch kein Dateisystem implementiert ... nicht einmal das Parsen von Partitionstabellen; wir würden uns also zunächst nur mit rohen Blockbereichen auf der Festplatte befassen ).

Zu diesem Zeitpunkt sollte Ihr Bootloader in der Lage sein, neuen Code über die serielle Leitung zu ziehen und in eine Partition zu kopieren (ja, eine Partitionstabellenbehandlung zu implementieren ... ob sie den Standard-PC-Konventionen entspricht, liegt an diesem Punkt bei Ihnen ) und führen Sie es aus.

Von dort aus sollten Sie in der Lage sein, an weitaus komplexeren Funktionen zu arbeiten. Von dieser Basis aus können Sie einen neuen "Kernel" schreiben und kompilieren ... starten Sie Ihr Testbed neu und lassen Sie den neuen Kernel darauf implementieren.

(Ihr Bootloader sollte ein Signal empfangen, z. B. einen BREAK über die seriellen Handshake-Zeilen, um den Download zu überspringen und nur das vorhandene Image zu starten. Auf diese Weise sollte auch eine Zeitüberschreitung auftreten.)

Von dort eine sehr einfache Terminalschicht und Befehlsshell schreiben? Ein Dateisystem? Implementieren Sie Befehle, um neue ausführbare Inhalte außer dem Kernel (Dateien oder Objekte) herunterzuladen. Und so weiter.

Natürlich hätten Sie mit einem Konsolentreiber beginnen können, der die PC-Tastatur und das Video verwendet (das BIOS INT 0x16h bzw. INT 0x10H, wenn ich mich richtig erinnere). Ich würde jedoch empfehlen, mit einem seriellen Treiber zu beginnen, da Sie dann Ihren Erstellungs- / Bereitstellungs- / Testzyklus von jedem anderen vorhandenen (funktionalen) System aus automatisieren können. Da Ihr neues Betriebssystem als übergreifendes Projekt gestartet wird, ist es für Sie von entscheidender Bedeutung, dass Sie eine optimierte Vorgehensweise haben.

Ich weiß nicht, wie weit Sie mit Ihrem Projekt gehen wollen. Ein einigermaßen beeindruckendes Ziel wäre es, "Selbsthosting" zu erreichen. Wenn Sie einen einfachen Assembler / Compiler erstellen können, mit dem Sie mit Ihrem neuen Betriebssystem eine funktionierende Version Ihres neuen Betriebssystems (neu) erstellen, verknüpfen und starten können ... dann haben Sie dieses Ziel erreicht. (Beachten Sie, dass dies keine Voraussetzung ist. Viele eingebettete Systeme werden sich niemals selbst hosten, und daran ist nichts auszusetzen.)


Auf moderner Hardware ist es möglicherweise schwieriger, einen seriellen Treiber zum Laufen zu bringen, als Konsolentreiber (Video / Tastatur) zu schreiben. In den Jahren, in denen ich dies geschrieben habe, gibt es auf modernen Desktops und Laptops praktisch keine alten seriellen Anschlüsse mehr. Einige eingebettete und "Hobby" -Hardware verfügt immer noch über altmodische RS-232C-Schnittstellen, ohne dass eine USB-Emulation erforderlich ist. Zum Beispiel: mpl.ch/t2600.html scheint es zu haben.
Jim Dennis

12

Wenn es Ihnen nichts ausmacht, Hardware-Virtualisierung zu verwenden, gibt es einen Kurs (Buch + Vorlesungen + Software), der Sie von Nand nach Tetris führt. Sie erstellen ein vollständiges Computersystem ganz selbst vom (für diese Zwecke atomaren und gegebenen) elektrischen NAND-Gatter bis hin zum Erstellen des Betriebssystems, einer Sprache und schließlich zum Codieren eines einfachen Spiels auf Ihrem persönlichen Computer.

Ich denke, es ist eine großartige Idee und etwas, auf das ich mich bald einlassen möchte. Das Buch ist überraschend billig und ich glaube, der Kurs wird am MIT unterrichtet. Ich kann mir kein besseres Gefühl vorstellen, als das vollständige Wissen über ein ganzes System zu haben, das Sie selbst von Grund auf aufgebaut haben.

Link: http://www1.idc.ac.il/tecs/


Ich denke, dieser Link ist tot. Kennt jemand einen anderen Weg, um darauf zuzugreifen?
Koray Tugay

1
@ KorayTugay nand2tetris.org
user253751

10

Ich würde klein anfangen und ein 8086 Embedded Development Kit kaufen und darauf ein Multitasking-Betriebssystem entwickeln. Sobald Sie einen Kernel haben und mit der Arbeit auf Hardware-Ebene vertraut sind, sind Sie bereit, etwas Herausfordernderes zu tun.

Sogar einen VGA-Display-DOS-Klon zu erstellen, ist eine ziemlich herausfordernde Sache. Die Details sind enorm. :-)

spezifische Themen.

Wie lege ich den Code auf den Computer? Ist es am besten, es mit einer Diskette zu machen? Können die meisten Computer dies von einem USB-Stick aus tun?

Das BIOS führt ein elementares Bootstrapping durch.


Welche Treiber brauche ich, und können Sie Hinweise zum Erstellen dieser Treiber vorschlagen?

alles, was keine direkten CPU- / Speicheroperationen sind. Alles, was nicht direkt im CPU-Referenzhandbuch enthalten ist.


Nach der Bootsequenz - was dann? Wie komme ich in den geschützten Modus usw.

Der geschützte Modus ist Teil der Startsequenz.

Dann beginnen Sie mit Multitasking und finden heraus, wie Prozesse gestartet werden.


Wie verwalte ich den Speicher ohne die Hilfe eines Betriebssystems? Benutze ich nur die gewünschten Adressen? Keine Initialisierung notwendig?

Richtig. Möglicherweise möchten Sie irgendwann ein virtuelles Speichersystem aussortieren.


Was werde ich zweifellos antreffen, das mich verwirren wird?

Keine Debugging-Tools, keine E / A.


Wie kann ich es entweder zu einem Befehlszeilen-Betriebssystem oder zu einem grafischen machen?

Mit Trauer. Suchen Sie nach Windows 3.1 und Linux, insbesondere nach X-Fenstern.


Worauf baut ein grafisches Betriebssystem auf? Wie würde ich so etwas wie eine Befehlszeile mit einer Schriftart und einem Bild oben machen?

X Fenster nachschlagen.


Abschließender Rat: Studieren Sie Linux / X Windows. Es ist nicht perfekt, aber es bietet ein Verständnis für einen Ansatz. Studieren Sie auch eingebettete Systeme.


Tolle Antwort, ich habe bereits den Linux-Kernel zur Hand und werde mir Windows 3.1 sicher ansehen.
Carson Myers

8

Ich sehe viele gute Verweise auf Betriebssystementwicklungsseiten, daher werde ich einen anderen Ansatz beschreiben:

Wenn Sie die Erfahrung machen möchten, ein Betriebssystem aus Bare-Metal zu implementieren, gibt es weitaus bessere Hardwaremöglichkeiten als bei einem alten PC. Mit der PC-Architektur verbringen Sie übermäßig viel Zeit damit, uninteressante Artefakte aus der 30-jährigen Designgeschichte zu codieren. Zum Beispiel hat wahrscheinlich nur der Bootloader-Teil des Projekts so manchen mutigen Programmierer ausgebrannt.

Beispielsweise benötigen Sie einen Satz Treiber, um Ihren Kernel von der Festplatte und / oder vom Netzwerk zu lesen. Dann benötigen Sie Code, um in den geschützten Modus zu gelangen. Zu diesem Zeitpunkt benötigen Sie einen weiteren Satz Treiber! Nach diesem Zeitpunkt ist nur noch sehr wenig Arbeit möglich, um den Chip in den geschützten Modus zu versetzen. Sie möchten es auf einem anderen PC + - 4 Jahre ausführen und benötigen noch einen weiteren Satz Treiber.

Sehen Sie sich an, wie Sie einen ARM oder einen anderen 32-Bit- "eingebetteten" Chip booten. Preiswerte Entwicklungsplatinen sind erhältlich, oder Sie können Ihre eigenen löten! Einige haben eingebautes Ethernet und USB. Ich denke, Sie werden mehr Spaß daran haben, an einer vernünftigen, nicht verkrusteten Architektur zu arbeiten, und vielleicht einige wiederverwendbare Fähigkeiten haben.


Nicht genau das, wonach ich gefragt habe, aber +1, weil ich eine Lesungstangente erhalten habe
Carson Myers

Marsh gibt Ihnen gute Ratschläge. Die Details der x86 / BIOS-Architektur auf niedriger Ebene sind komplex. Sie werden wahrscheinlich in diesen Details stecken bleiben und sich nicht mehr auf die größeren Probleme wie Speicherverwaltung und Prozessplanung konzentrieren können. Entscheiden Sie sich für eine "sauberere" Architektur mit serieller Schnittstelle. Sie werden auf lange Sicht glücklicher sein.
Barry Brown

8

Wenn Sie möchten, dass dies auf echter Hardware ausgeführt wird, benötigen Sie vor allem eine Kopie des Handbuchs Ihres Prozessors. Die Intel-Handbücher ( http://www.intel.com/products/processor/manuals/ ) sind von unschätzbarem Wert. Sie reichen von Schaltmodi (real / geschützt) über die Verwaltung des virtuellen Speichers (wenn Sie sich dafür entscheiden, so weit zu gehen) bis hin zu Systemaufrufen (falls Sie jemals in den Benutzermodus wechseln). Am wichtigsten sie eine Reihe von Dingen, die eingerichtet werden müssen, damit sie funktionieren, wie das TSS und die Segmentregister, die in den meisten Betriebssystemtexten nicht behandelt werden, ausführlich erläutern, da sie sich mehr mit übergeordneten Konzepten als mit Prozessoren befassen. spezifische Details.


Über Intel erhalten Sie kostenlos Papierkopien.
Matthew Iselin


8

Versuchen Sie, den Code eines kleinen, einfachen Open-Source-Betriebssystems wie MikeOS zu lesen.

Alternativ schlage ich folgende Schritte vor (sollte Spaß machen!):

  1. Schreiben Sie eine virtuelle Maschine. Definieren Sie alle Prozessoranweisungen so, dass Sie Ihr System in- und auswendig kennen. Schnittstelle mit SDL für Tastatur, Maus, Bildschirm, Audiozugriff. Halten Sie es einfach, damit Sie alles auf einmal in Ihren Kopf passen. Es muss keine hochmoderne virtuelle Maschine sein, sondern nur eine, die die Funktion eines "echten" Computers emulieren kann.
  2. Schreiben Sie einen Assembler für den Prozessor Ihrer virtuellen Maschine. Denken Sie daran, dass dieser Assembler kein Programm sein muss, das in der Sprache der virtuellen Maschine geschrieben ist, sondern alles, was Ihre Assemblersprache in Maschinencode konvertieren kann.
  3. Definieren Sie ein ausführbares Format und schreiben Sie einen einfachen Linker.
  4. Sie haben jetzt alle Teile, um Ihr Betriebssystem zu schreiben! Schreiben Sie es in der Assemblersprache, bauen Sie es zusammen ... usw. Sie benötigen keinen so komplizierten Bootloading-Prozess, sondern lassen Ihren Computer zuerst Ihr Betriebssystem ausführen.

Die obigen Schritte mögen für das Schreiben eines einfachen Betriebssystems etwas dumm erscheinen, aber hey, es macht verdammt viel Spaß.


6

Schauen Sie sich MikeOS an . Es ist ein ziemlich einfaches Betriebssystem, das geschrieben ist (wie in der kommentierten) Baugruppe. Obwohl es ziemlich einfach ist, hat es eine grafische Benutzeroberfläche und unterstützt einige Netzwerke und Multimedia.

bearbeiten : MenuetOS ist grafisch. Es ist auch gerade geschrieben, aber es ist raffinierter als MikeOS


6

Sie haben ein ehrgeiziges Ziel. Aber die Ausführung ist der Schlüssel.

Die meisten strukturierten Ansätze (Lehrbuch oder College-Klasse) führen Sie durch den Prozess, liefern jedoch einen Großteil des Code, der die arkanen Details der von Ihnen gewählten Plattform beschönigt und Sie sich auf die Gesamtideen konzentrieren lässt: Prozessplanung, Speicherverwaltung, Deadlock-Verhinderung, E / A usw.

Mein Rat lautet: Reduzieren Sie Ihre Erwartungen und beginnen Sie mit einer grundlegenden Frage.

Was ist ein Betriebssystem?

Ein Informatiker wird (hoffentlich) niemals sagen, dass ein Betriebssystem eine grafische Benutzeroberfläche oder ein Webbrowser ist oder eine Möglichkeit, USB-Geräte anzuschließen, oder alles, was ein Benutzer tatsächlich sehen oder berühren kann. Stattdessen sind ein Betriebssystem auf seiner grundlegendsten Ebene die Dinge, die ich oben erwähnt habe. Sie alle fallen unter einen großen Dach: Ressourcenmanagement.

Ein Betriebssystem ist nichts anderes als ein Programm, das die Hardwareressourcen des Computers verwaltet: Speicher, CPU und Peripheriegeräte.

Hier ist ein einfaches Betriebssystem: Mit einem Programm kann der Benutzer ein Programm (hexadezimal oder binär) über eine serielle Verbindung eingeben. Sobald das Programm eingegeben wurde, wird es ausgeführt. Wenn das Programm beendet ist, wird die Steuerung an den Benutzer zurückgegeben, wo er das Programm entweder erneut ausführen oder ein neues eingeben kann.

Tun Sie dies auf einer "sauberen" Architektur wie einem eingebetteten ARM-Prozessor mit 64 KB Speicher oder so. Sie können dies in der Assembly codieren, nachdem Sie einige Tage lang die Vor- und Nachteile des ARM kennengelernt haben. Und voila!Sie haben ein Betriebssystem.

Es macht alles, was ein Betriebssystem tun soll:

  • Es verwaltet den Speicher, indem der Benutzer das Betriebssystem selbst nicht überschreiben darf.
  • Es wird die Ausführung eines einzelnen Prozesses geplant.
  • Es verwaltet die E / A für das einzelne serielle Peripheriegerät.

Dies gibt Ihnen einen Baustein, von dem aus Sie beginnen können. Sie haben jetzt viele Möglichkeiten. Vielleicht besteht eine davon darin, zwei Programme in den Speicher laden zu lassen und den Benutzer entscheiden zu lassen, welches als nächstes ausgeführt werden soll.

Sie können den Benutzer auch die Ausführung eines Programms anhalten lassen, zum anderen wechseln, die Ausführung anhalten und zurückschalten. Dies ist rudimentäres Multitasking, obwohl es vollständig manuell ist.

Ihre Auswahlmöglichkeiten sind unbegrenzt, aber jede ist ein kleiner Schritt von dem, was Sie zuvor hatten.

Es macht Spaß, wenn Sie Ihre Ziele nicht zu hoch setzen!



4

Viele Schulen haben OS-Klassen, die viel von dem tun, was Sie beschreiben. Meine Schule (CMU) unterrichtete Betriebssystem in C, und wir schrieben einen Kernel, ein Dateisystem und eine Shell und erhielten Code für einen Bootloader.

Leider konnte ich im Web keine endgültige Ressource für diesen Kurs (15-412) finden, die sich im Laufe der Zeit weiterentwickelt hat. Aber vielleicht könnten Leute Links zu Quellen und Aufgaben für Schulen posten, die über gute Ressourcen im Internet verfügen.


3

Sie könnten genießen diese Tutorial mit dem Titel "Roll your own toy UNIX-clone OS". Es ist sehr aufschlussreich und sollte Ihnen auf Ihrem Weg helfen.

Viel Glück.


1
Obwohl es brillant ist, ein so ausführliches Tutorial zu haben, gibt es viele Fehler, auf die Anfänger ständig stoßen. Das Tutorial ist genau dann großartig, wenn Sie bereit sind, auch Dinge wie die Intel-Handbücher zu öffnen und darüber nachzudenken, was Sie tun (dh nicht kopieren und einfügen!).
Matthew Iselin

3

Studieren Sie das A2-System (früher Oberon-System genannt ) auf Ideen, die Sie stehlen können. Es ist ein grafisches Betriebssystem, das nur von zwei Personen erstellt wurde, obwohl Niklaus Wirth zugegebenermaßen eines ist. Erstmals veröffentlicht um 1990 und die Geschwindigkeit ist erstaunlich gut. Es gibt ein Buch von Gutknecht.


3

Über die Low-Level-Grafikprogrammierung erhalten Sie viele Informationen: http://www.osdever.net/FreeVGA/home.htm . (Es ist auch für den Textmodus sehr interessant.)

Was werde ich zweifellos antreffen, das mich verwirren wird?

Sie werden feststellen, dass auf dem PC eine Menge Dinge unklar sind: Der x86-Befehlssatz selbst ist kompliziert, und wenn Sie direkten Zugriff auf Hardware erhalten, kann es eine Weile dauern, bis Sie verstehen, wie ein einzelnes Zeichen auf dem Bildschirm geschrieben wird .

Machen Sie sich keine Sorgen über Disketten und dergleichen. Meistens verwenden Sie einen Emulator wie Bochs oder QEmu.


3

Vielleicht möchten Sie einen Blick auf Betriebssystemkonzepte werfen , von Abraham Silberschatz - Das Verständnis von Systemprogrammierungskonzepten ist eine Grundvoraussetzung. Werfen Sie einen Blick in die F / OSS-Kernel-Interna von Linux * BSD und GNU / Linux , insbesondere in früheren Versionen sind wahrscheinlich etwas dokumentierter.Alt-Text Alt-Text


1
Silbershatz ist wirklich ziemlich gut, aber sehr hoch.
Paul Nathan

Einverstanden; Ich würde jedoch sagen, dass es von grundlegender Bedeutung ist. Dokumentation mit modernen Betriebssystemen von Tanenbaum (bereits erwähnt)
amaterasu

2

Schauen Sie sich Minix an . Studieren Sie den Quellcode zusammen mit " Design und Implementierung von Betriebssystemen ". Erwägen Sie, Beiträge zum Projekt zu leisten. Ich denke, Minix ist ein wirklich gutes und vielversprechendes Betriebssystem. Es ist auch ein gut finanziertes Projekt. Das heißt, Sie könnten sogar für Ihre Beiträge bezahlt werden!


1

Es ist sehr einfach, da im BIOS bereits viele Eingabe- / Ausgabefunktionen zum Ändern des Bildschirmmodus, Ändern der Pixelfarbe, Schreiben von Text auf den Bildschirm und viele andere Dinge integriert sind. Es enthält jedoch keine Unterstützung für Dateisysteme. Dies ist eines der wenigen Dinge, die Sie in Ihr Betriebssystem integrieren müssen.

Das BIOS lädt den ersten Sektor auf die Festplatte und beginnt von dort aus mit der Ausführung des Codes. Daher muss Ihr Betriebssystem mit der ersten Anweisung im ersten Sektor auf der Festplatte platziert werden.

In diesem Wikipedia-Artikel sollten Sie mit BIOS-Interrupts zum Schreiben von Text auf den Bildschirm, zum Empfangen von Tasten über die Tastatur und anderen Dingen beginnen. https://en.wikipedia.org/wiki/BIOS_interrupt_call

Selbst wenn Sie C ++ verwenden möchten, würde ich dringend empfehlen, sich über die Assembly-Programmierung zu informieren, da dies für das Verständnis der Funktionsweise der Hardware von entscheidender Bedeutung ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.