Linus Torvalds emulieren: Erstellen Sie Ihr eigenes Betriebssystem von Grund auf neu (VII)

Willkommen zu einem weiteren Beitrag über wie man ein eigenes Betriebssystem erstellt (Frühere Artikel in der Reihe: 1, 2, 3, 4, 5 y 6). Es ist lange her seit dem letzten Beitrag, hauptsächlich aufgrund eines Fehlers, den ich in dem gefunden habe, was wir heute haben. Wir werden sehen Umgang mit der Uhr auf x86-Architekturen.

Zuvor hatten wir die IRQs generisch aktiviert, aber es gab ein kleines Problem, da wir sie nicht richtig aktiviert und zusätzliche Daten übergeben haben. Wir haben es endlich behoben Carlosorta und ich und ich können weiterhin kommentieren, wie es weitergehen soll.

Nun, die Uhr ist ein IRQ, speziell die erste. Um es zu konfigurieren, verwenden wir die zuvor definierte Funktion, um die IRQs generisch zu installieren, den ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Phase (int hz) {int divisor = 1193180 / hz; ND :: Ports :: OutputB (0x43,0x36); ND :: Ports :: OutputB (0x40, Divisor & 0xFF); ND :: Ports :: OutputB (0x40, Divisor >> 8); } void ND :: Timer :: Wait (int ticks) {vorzeichenlose lange eticks; eticks = ND_TIMER_TICKS + Ticks; while (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Screen :: PutString ("\ nEinrichtungs-Timer ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: PutString ("erledigt"); } extern "C" void ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; if (ND_TIMER_TICKS% 18 == 0) {// ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ("\ nEine weitere Sekunde"); WIR SOLLTEN EINEN REFRESH-BILDSCHIRM MACHEN}}

Der Code läuft wie folgt ab: Das Initialisierungssystem ruft auf ND :: Timer :: Setup, die anruft ND_IRQ_InstallHandler an der ersten Position den IRQ0 einzufügen, eine Rückruffunktion, wenn das Ereignis eintritt, das heißt ND_Timer_Handler das erhöht die Zecken. Da wir die Taktrate auf 18 Hz eingestellt haben, wie wir später sehen werden, wäre eine Sekunde vergangen, wenn wir sie durch 18 geteilt und uns eine ganze Zahl gegeben hätten.

Die Funktion ND :: Timer :: Phase Es hilft uns, die Geschwindigkeit des anzupassen Timerist diese extravagante Zahl 1.19 MHz, was ein gemeinsamer Wert ist. Nun, wir sollten diese Funktion aufrufen, wenn wir die Geschwindigkeit der ändern wollen TimerStandardmäßig ist es 18,22 Hz, ein besonderer Wert, für den sich jemand entschieden haben muss IBM und es ist bis heute geblieben.

Die Funktion ND :: Timer :: Warte Es ist ziemlich einfach, warten Sie einfach mit einer Schleife während bis zum Zecken notwendig, um fortzufahren.

Auf dem Bild sehen wir, dass wir Folgendes erhalten, wenn wir den Code im ND_Timer_Handler auskommentieren:

Sekunden in NextDivel

Im nächsten Kapitel werden wir sehen, wie man Tastatureingaben liest und ein wenig macht Schale mit unserem System zu interagieren. Wie immer der Code Es ist in den GitHub unter der Lizenz GNU GPL v2.


Hinterlasse einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert mit *

*

*

  1. Verantwortlich für die Daten: Miguel Ángel Gatón
  2. Zweck der Daten: Kontrolle von SPAM, Kommentarverwaltung.
  3. Legitimation: Ihre Zustimmung
  4. Übermittlung der Daten: Die Daten werden nur durch gesetzliche Verpflichtung an Dritte weitergegeben.
  5. Datenspeicherung: Von Occentus Networks (EU) gehostete Datenbank
  6. Rechte: Sie können Ihre Informationen jederzeit einschränken, wiederherstellen und löschen.

  1.   Noah sagte

    Sehr interessante Reihe von Tutorials, ich persönlich hatte nicht viele über das Erstellen einer Linux-Distribution von Grund auf neu gesehen, und noch weniger auf Spanisch und so vollständig. Ich denke, Sie können viel daraus lernen und sobald ich Zeit habe, hoffe ich, diese Tutorials durchführen zu können.
    Ich bitte Sie nur, sich nicht entmutigen zu lassen und das Tutorial zu beenden, da ich viele gute Tutorials gefunden habe, die nie fertig sind.
    Grüße und danke :).

    1.    Roader sagte

      Es ist keine Linux-Distribution, es ist ein Kernel 😛.

    2.    Desikoder sagte

      Du liegst falsch. Das Erstellen einer Linux-Distribution bedeutet nicht, dass Sie etwas programmieren. In einem Linux, das Sie nicht von Grund auf neu programmieren, installieren Sie (basierend auf dem Kompilieren) grundlegende Pakete, aus denen eine Distribution besteht. Das ist ganz anders. Es erstellt Ihr eigenes Betriebssystem. Es hat nichts mit Linux zu tun. Dies ist, was Torvalds zu seiner Zeit tat, inspiriert von Minix, und mit dieser hitzigen und populären Diskussion zwischen Torvalds und Andrews. Tanenbaum auf monolithischem Kernel gegen Mikrokernel.

      Saludos!

  2.   illukki sagte

    Danke che. Bis jetzt habe ich Ihrem Beitrag nicht viel Aufmerksamkeit geschenkt, aber ich bin in einem Projekt, also werde ich sie mir ansehen.
    Grüße.

  3.   Roader sagte

    Erwähnenswert ist, dass andere Sprachen verwendet werden können, z. B. Objective-C (++), C ++, D oder Rust.

    1.    AdrianArroyoStreet sagte

      Dieser ist in C ++, nicht in C. Es ist jedoch schwierig, die Unterschiede zu erkennen, da viele C ++ - Operatoren eine Bibliotheksunterstützung erfordern, wie z. B. die Operatoren new und delete. Es wäre sehr interessant, ein Betriebssystem in Rust zu erstellen. Es gibt tatsächlich einen IRC-Kanal für Betriebssysteme auf Rust (# rust-osdev auf irc.mozilla.net). Jeder, der zu Maschinencode kompiliert, ist es wirklich wert, einschließlich Java, wenn wir GCJ verwenden.

      1.    Roader sagte

        Ja, in der Tat ist Rust eine sehr interessante Sprache für Betriebssysteme, da es nicht nur einfacher zu lernen ist als C oder C ++ (es wird immer noch ständig geändert, aber es ist einfacher), sondern auch viel sicherer.

  4.   Roader sagte

    In den 70er Jahren war es üblich, ohne Betriebssystem direkt auf der Hardware zu programmieren.

  5.   Friedrich sagte

    Ausgezeichnet ... jetzt muss ich nur noch verstehen: 3 ...

  6.   mmm sagte

    Hallo. Vielen Dank für diese Artikel. Aber wenn ich keine Programmierkenntnisse habe, denke ich nicht, dass ich es tun sollte, oder? Ich meine, wenn nicht, wäre es ein "gut, und was kopiere und füge ich jetzt ein?" ... wie schade, ich wollte immer wissen, wie man so viel programmiert und nichts, ich bin eher ein Esel!

    1.    Desikoder sagte

      Mach dir keine Vorwürfe, du bist kein Esel. Zunächst wissen nicht alle Programmierer, wie man einen Kernel schreibt, es ist eine sehr kleine einfache Aufgabe, und in der Praxis ist sie größer. Hier erstellt der Autor beispielsweise generische Treiber für die Tastatur und den Bildschirm und manipuliert das Bildschirmarray, eine Methode, die heute überhaupt nicht mehr verwendet wird. Die heutigen Linux-Versionen sind sehr, sehr komplex und hängen nicht von der x86-Architektur ab, die über ein Bildschirmarray verfügt. Darüber hinaus hängt ein Großteil des Codes in C von der Architektur ab, wenn der Architekturcode im Assembler ideal ist und der C-Code auf jedem Prozessor funktioniert. Ich lenke jedoch nicht vom Autor ab, da ein Kernel die Eigenschaften annimmt, die wir heute in einem Linux-Kernel für normal halten. Dies ist beispielsweise keine leichte Aufgabe, und Sie können sicher sein, dass eine einzelne Person dazu absolut nicht in der Lage ist. Für etwas werden die großen Projekte wie Linux, Gcc, Glibc usw. nicht von einer einzelnen Person gemacht, aber es gibt viele Mitarbeiter.

      Wenn Sie mit dem Programmieren beginnen möchten, haben Sie einige Anleitungen im Web, obwohl Sie vorsichtig sein und die guten Anleitungen auswählen müssen. Ich begann unter Linux zu programmieren und sprang mit meinem Kopf und ohne Wasser (dh mit der geliebten C-Sprache) in den Pool, obwohl ich jetzt einige Grundbegriffe von Python habe (was auch eine sehr gute Sprache ist). Es gibt einige C-Bücher, in denen Sie auf Seite 6 so viel Kopfschmerzen aufgeben, wie Sie bekommen, aber mehr als Bücher werden diese Dinge aus Erfahrung erworben. Dies geschieht wie beim OSI-Netzwerkmodell. Die Dokumentation zum Osi-Modell ist für den Neuling absolut unverständlich. Wenn Sie jedoch eine Site mit einer guten Erklärung der Netzwerkebenen finden, erhalten Sie schnell die Konzepte für den Umgang mit technischen Dokumenten wie RFCs.

      Kurz gesagt, es gibt gute Websites und Handbücher, es geht darum, sich darauf einzulassen und gutes Material zu finden.

      Grüße

  7.   Freiheit sagte

    Hallo, nach all den Versuchen, den "Fehler: Kein Multiboot-Header gefunden" zu lösen. und "Fehler, Sie müssen zuerst den Kernel laden", da ich nirgendwo die Lösung für das Problem des ersten Artikels finden konnte, das einige wie ich hatten ... hier ist die Lösung, wenn es für jemanden funktioniert ...

    Ich weiß nicht, ob meine Theorie der Fehlerursache richtig ist, aber die Frage ist, dass beim Kompilieren der Dateien in einem 32-Bit-Betriebssystem der Fehler nicht generiert wurde, aber da ich ein 64-Bit-Betriebssystem habe (Gnu / Linux Debian 7), und dass ich beim Kompilieren und Testen den Fehler "Kein Multiboot-Header gefunden" ausgegeben habe und es Zweifel gibt, dann ist der Fehler meiner Meinung nach auf die Umgebung oder Architektur des Betriebssystems zurückzuführen, in dem wir unser kompilieren Dateien ... und nun, ich habe meine Dateien kompiliert und die Umgebung oder Architektur von 32 Bit angegeben.
    * sudo als -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding
    Das Seltsame ist, dass ich einige Zweifel habe, hahaha, dann ist das Betriebssystem, das wir Schritt für Schritt erstellen, für eine x86-Architektur oder irre ich mich ajajaj….

    PS: Jemand, der mir im Zweifel hilft und einige Rechtschreibfehler oder meinen schlechten Ausdruck entschuldigt, und nun, ich bin nicht perfekt, also «Perfektion hat ihren Preis»… und vor allem ein heiliges 32-Bit-Betriebssystem emulieren … .Hahaha

    1.    Martin Villalba sagte

      Genie! Ich wollte dieses Tutorial unbedingt machen und bin am Anfang mit diesem Fehler runtergekommen, haha

  8.   Oscar sagte

    Herzlichen Glückwunsch, es ist ein ausgezeichneter Beitrag. Von nun an teile ich mit Ihnen, dass Ihre gute Arbeit durch mich und andere erweitert wird;

    Grüße