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

Nous revenons à la série de tutoriels sur la façon de créer notre propre système d'exploitation. Je suppose que vous aimerez beaucoup ce chapitre car nous pouvons enfin interagir avec notre système d'exploitation. Aujourd'hui, nous allons lire la saisie au clavier. Pour cela, le schéma est similaire à celui de la minuterie. Nous devons utiliser les IRQ de toute façon, nous allons donc commencer de la même manière qu'avec le minuteur.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Notre gestionnaire de clavier, cependant, est un peu plus complexe puisque nous lisons les touches et les déposons dans un tampon.

extern "C" void ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}

http://gist.github.com/634afddcb3e977ea202d

Nous pouvons vérifier comment nous appelons une fonction appelée ND :: Keyboard :: GetChar. Là on obtient le caractère et ensuite s'il ne s'agit pas d'un caractère vide (ici j'en ai utilisé 255, il faudrait utiliser un meilleur système) on met le caractère à l'écran et on le stocke dans un simple buffer de caractères (c'est aussi sous réserve d'amélioration, le système actuel pourrait déborder).

nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode; scancode = (caractère non signé) ND :: Ports :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } else {return en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; return stringBuffer; }

http://gist.github.com/2d4f13e0b1a281c66884

Ici, nous pouvons voir comment la touche qui a été enfoncée est obtenue. À 0x60, il y aura toujours la dernière touche enfoncée. En fait, il peut être lu directement sans avoir à utiliser l'IRQ, mais alors nous ne saurons pas comment identifier quand un changement s'est produit. Là, nous vérifions avec l'opération AND que le code que nous avons obtenu correspond à une clé qui a été relâchée.

Dans ce cas, nous renvoyons 255 (car nous l'ignorerons plus tard) et sinon la touche a été enfoncée. Dans ce cas, nous retournons la position d'un tableau appelé en_US. Quelles informations contient ce tableau? Ce tableau est ce que nous appellerions un keymap ou un character map. Comme vous le savez, différentes langues ont des claviers différents et elles ne sont pas prises en charge car elles écrasent les touches. Ainsi en_US nous donnera la touche correspondant à chaque code et cela fonctionnera sur un clavier américain.

caractère non signé en_US [128] = {0,27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0 ',' - ',' = ',' \ b ',' \ t ',' q ',' w ',' e ',' r ',' t ',' y ',' u ',' i ',' o ',' p ',' [','] ',' \ n ', 0, / * Ctrl * /' a ',' s ',' d ',' f ',' g ', 'h', 'j', 'k', 'l', ';', '\' ',' ``, 0, / * Maj gauche * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Décalage à droite * / '*', 0, / * Alt * / '', 0, / * Verrouillage des majuscules * / 0,0,0,0,0,0,0,0,0,0, / * Touches F1-F10 * / 0, / * Verrouillage numérique * / 0, / * Verrouillage du défilement * / 0, / * Touche Accueil * / 0, / * Flèche vers le haut * / 0, / * Page précédente * / '-', 0, / * Flèche gauche * / 0, 0, / * Flèche droite * / '+', 0, / * Touche de fin * / 0, / * Flèche vers le bas * / 0, / * Page suivante * / 0, / * Touche d'insertion * / 0, / * Touche d'effacement * / 0,0,0, 0, 0, 11, / * Touches F12-F0 * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Il y avait aussi une fonction définie qui avait une phrase. Le but est simplement d'accéder plus facilement aux chaînes des applications qui en ont besoin, une seule pour le moment. Je parle de NextShellLite, une version réduite de l'éventuel futur shell qu'aurait NextDivel. Le but de NextShellLite est uniquement de fournir un shell réduit pour tester progressivement de nouvelles fonctionnalités. Je ne vais pas mettre le code shell ici mais je l'ai inclus dans le code NextDivel.

Pour le moment, il ne fonctionne pas comme un programme séparé mais comme une fonction appelée par le noyau, principalement parce que nous n'avons pas encore ajouté l'option pour exécuter des exécutables. Et bien sûr, quelques images du fonctionnement du shell avec les nouvelles fonctions de saisie au clavier.

SuivantShellLite


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.   Daryo dit

    excellent tuteur! merci 🙂

  2.   PopArch dit

    La vérité est que je n'ai jamais suivi le tutoriel car dans la première partie cela m'a donné une erreur en essayant de compiler mais je ne me souviens pas de quelle erreur c'était

  3.   Le chat des Lopez dit

    Désolé pour mon ignorance grossière ... d'où sont écrits ces codes? Depuis le terminal ??

    1.    AdrianArroyoStreet dit

      Les codes font partie du code source. Je ne le mets pas complet car sinon le post est tout code et rien d'explication. Je vous recommande de lire les tutoriels depuis le début si vous souhaitez les suivre. Vous pouvez également consulter le code source complet ici (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady dit

    Comment serait l'amélioration pour éviter tout débordement?

    1.    Plock dit

      Kady, avez-vous déjà vérifié le code du référentiel? Là, la taille maximale est établie, ainsi que des fonctions pour la contrôler, vous pouvez y apporter le changement de taille ou mettre en œuvre un moyen raisonnable de libérer le tampon lorsqu'il devient saturé
      Je vous laisse le lien pour le vérifier https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico dit

    Bonjour très intéressant, allez-vous continuer avec cette «série» d'émulation de Linus Torvals?
    Pouvez-vous recommander un livre, des informations pour pouvoir créer un noyau comme celui-ci?

    Salutations !!

  6.   RéponsesVeganas.Org dit

    Salut. Merci pour le tutoriel. Pouvez-vous nous recommander un livre sur ce que vous avez fait qui ne soit pas "Operating Systems" par Tanenbaum? Merci beaucoup d'avance.
    Salutations.