Émulation de Linus Torvalds: créez votre propre système d'exploitation à partir de zéro (VII)

Bienvenue dans un autre article sur comment créer notre propre système d'exploitation (Articles précédents de la série: 1, 2, 3, 4, 5 y 6). Cela fait longtemps depuis le dernier article, principalement à cause d'un bug que j'ai trouvé dans ce que nous avons aujourd'hui. Nous verrons comment gérer l'horloge sur les architectures x86.

Auparavant, nous avions activé les IRQ de manière générique, mais il y avait un petit problème car nous ne les activions pas correctement et nous avons transmis des données supplémentaires. Nous le réparons enfin carlosorta et moi et moi pouvons continuer à commenter comment continuer.

Eh bien, l'horloge est une IRQ, en particulier la première. Pour le configurer, nous utiliserons la fonction que nous avons définie précédemment pour installer génériquement les IRQ, le ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Phase (int hz) {int diviseur = 1193180 / hz; ND :: Ports :: OutputB (0x43,0x36); ND :: Ports :: OutputB (0x40, diviseur & 0xFF); ND :: Ports :: OutputB (0x40, diviseur >> 8); } void ND :: Timer :: Wait (int ticks) {eticks longs non signés; 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 ("\ nSetup timer ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: PutString ("done"); } 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 ("\ nUne seconde de plus"); NOUS DEVONS FAIRE UN ÉCRAN DE RAFRAÎCHISSEMENT}}

Le code s'exécute comme suit: le système d'initialisation appelle ND :: Timer :: Configuration, qui appelle ND_IRQ_InstallHandler d'insérer en première position, l'IRQ0, une fonction de rappel lorsque l'événement survient, c'est-à-dire ND_Timer_Handler qui augmente le tiques. Comme nous avons réglé la vitesse d'horloge à 18 Hz, comme nous le verrons plus tard, si nous la divisions par 18 et nous donnions un entier, une seconde se serait écoulée.

La fonction ND :: Minuterie :: Phase Cela nous aide à ajuster la vitesse du minuteur, ce nombre extravagant est 1.19 MHz qui est une valeur commune. Eh bien, cette fonction doit être appelée si nous voulons changer la vitesse du minuteur, par défaut, il passe à 18,22 Hz, une valeur particulière que quelqu'un doit avoir décidé à l'intérieur IBM et il est resté à ce jour.

La fonction ND :: Timer :: Wait c'est assez simple, attendez juste avec une boucle tout en jusqu'à ce que le tiques nécessaire pour continuer.

Dans l'image, nous pouvons voir que si nous décommentons le code à l'intérieur du ND_Timer_Handler, nous obtenons ceci:

Secondes dans NextDivel

Dans le chapitre suivant, nous verrons comment lire les entrées du clavier et faire un peu coquille pour interagir avec notre système. Comme toujours, le code est disponible dans GitHub sous la licence GNU GPL v2.


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.

  1.   Noé dit

    Série très intéressante de tutoriels, personnellement je n'en avais pas vu beaucoup sur la création d'une distribution Linux à partir de zéro, et encore moins en espagnol et si complet. Je pense que vous pouvez en apprendre beaucoup et dès que j'aurai le temps, j'espère pouvoir faire ces tutoriels.
    La seule chose que je vous demande est de ne pas vous décourager et de terminer le tutoriel, car j'ai trouvé de nombreux bons tutoriels qui ne sont jamais terminés.
    Salutations et merci :).

    1.    routier dit

      Ce n'est pas une distribution Linux, c'est un noyau 😛.

    2.    désikoder dit

      Tu te trompes. Créer une distribution Linux n'implique rien de programmer, par exemple, dans un Linux à partir de zéro, vous ne programmez pas, ce que vous faites est d'installer (basé sur la compilation), des packages de base qui composent une distribution. C'est très différent. Il crée votre propre système d'exploitation. Cela n'a rien à voir avec linux. C'est ce que torvalds a fait à son époque en s'inspirant de minix, et avec cette discussion animée et populaire entre torvalds et andrew s. tanenbaum sur noyau monolithique vs micro-noyau.

      Saludos!

  2.   illukki dit

    Merci che. Jusqu'à présent, je n'ai pas prêté beaucoup d'attention à votre message mais je suis dans un projet donc je vais jeter un œil.
    Salutations.

  3.   routier dit

    Il convient de mentionner que d'autres langages peuvent être utilisés, tels que Objective-C (++), C ++, D ou Rust.

    1.    AdrianArroyoStreet dit

      Celui-ci est en C ++, et non en C. Cependant, il est difficile de voir les différences puisque de nombreux opérateurs C ++ nécessitent un support de bibliothèque, comme les opérateurs new et delete. Il serait très intéressant de faire un système d'exploitation en Rust. Il existe en fait un canal IRC dédié aux systèmes d'exploitation sur Rust (# rust-osdev sur irc.mozilla.net). Quiconque compile en code machine en vaut vraiment la peine, y compris Java si nous utilisons GCJ.

      1.    routier dit

        Oui, en effet, Rust est un langage très intéressant pour les systèmes d'exploitation, car non seulement il est plus facile à apprendre que C ou C ++ (il continue toujours avec des changements continus, mais c'est plus facile), mais il est beaucoup plus sûr.

  4.   routier dit

    Dans les années 70, il était assez courant de programmer directement sur le matériel, sans OS.

  5.   Christopher dit

    Excellent ... maintenant j'ai juste besoin de comprendre: 3 ...

  6.   mmm dit

    Salut. Merci beaucoup pour ces articles. Mais, si je n'ai pas de connaissances en programmation, je ne pense pas que je devrais le faire, non? Je veux dire, sinon ce serait un "bien, et maintenant qu'est-ce que je copier et coller?" ... quel dommage, j'ai toujours voulu savoir programmer tellement et rien, je suis plus un âne!

    1.    désikoder dit

      Ne vous blâmez pas, vous n'êtes pas un âne. Pour commencer, tous les programmeurs ne savent pas écrire un noyau, c'est une tâche très peu simple, et en pratique c'est plus gros. Par exemple ici l'auteur crée des pilotes génériques pour le clavier et l'écran, en manipulant le tableau d'écran, qui est une méthode qui n'est pas du tout utilisée aujourd'hui. Les tty sous Linux sont aujourd'hui très, très complexes et ne dépendent pas de l'architecture x86 ayant un tableau d'écran à sa disposition. De plus, une grande partie du code C dépend de l'architecture, lorsque l'idéal est de faire du code d'architecture en assembleur et que le code C fonctionne sur n'importe quel processeur. Cependant, je n'enlève rien à l'auteur, parce qu'un noyau acquiert les caractéristiques que nous considérons aujourd'hui comme normales dans un noyau Linux, par exemple, ce n'est pas une tâche facile, et vous pouvez être sûr qu'une seule personne est absolument incapable de le faire. Pour quelque chose, les grands projets comme linux, gcc, glibc, etc., ne sont pas réalisés par une seule personne mais il y a beaucoup de collaborateurs.

      De plus, si vous voulez commencer la programmation, vous avez pas mal de guides sur le Web, même s'il faut faire attention et sélectionner les bons guides. J'ai commencé à programmer sous Linux en sautant dans la piscine avec ma tête et pas d'eau (c'est-à-dire avec le langage C bien-aimé), bien que maintenant j'ai quelques notions de base de python (qui est aussi un très bon langage). Il y a des livres C dans lesquels vous abandonnez à la page 6 autant de maux de tête que vous ressentez, mais plus que des livres, ces choses sont acquises par expérience. Cela se produit comme avec le modèle de réseau OSI. La documentation sur le modèle osi est absolument impossible à comprendre pour le nouveau venu, mais si vous trouvez un site avec une bonne explication des couches réseau, vous obtenez rapidement les concepts pour traiter des documents techniques tels que les RFC.

      En bref, qu'il existe de bons sites Web et des manuels, il s'agit de s'y rendre et de trouver du bon matériel.

      salutations

  7.   Liberté dit

    Bonjour, après toutes les tentatives pour résoudre le "erreur: aucun en-tête multiboot trouvé." et «erreur il faut d'abord charger le noyau», puisque je n'ai trouvé nulle part la solution au problème du premier article, que certains comme moi avaient ... voici la solution, si ça marche pour quelqu'un ...

    Je ne sais pas si ma théorie de la cause de l'erreur est correcte mais de toute façon, la question est que lors de la compilation des fichiers dans un système d'exploitation 32 bits, cela n'a pas généré l'erreur, mais comme j'ai un fonctionnement 64 bits système (Gnu / Linux Debian 7), et que lors de la compilation et des tests, j'ai eu l'erreur "aucun en-tête multiboot trouvé", et il y a un doute, alors à mon avis l'erreur est due à l'environnement ou à l'architecture du système d'exploitation dans lequel nous compilons nos fichiers ... et bien ce que j'ai fait, c'est compiler mes fichiers, en spécifiant l'environnement ou l'architecture 32 bits.
    * sudo comme -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
    La chose étrange est que j'ai des doutes hahaha, alors le système d'exploitation que nous créons étape par étape est pour une architecture x86 ou je me trompe ajajaj….

    PS: Quelqu'un pour m'aider avec le doute, et excuser quelques fautes d'orthographe ou ma mauvaise expression, et bon je ne suis pas parfait donc "La perfection a son prix" ... Et surtout, émuler un système d'exploitation 32 bits, solution sacrée … .Hahaha

    1.    martin villalba dit

      Génie! Je voulais vraiment faire ce tutoriel et je suis tombé au début avec cette erreur haha

  8.   oscar dit

    Félicitations, c'est une excellente contribution. Désormais, je partage avec vous que votre bon travail à travers moi et les autres sera prolongé;

    salutations