É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


Ajouter comme source préférée dans Google