Emulazione di Linus Torvalds: crea il tuo sistema operativo da zero (VIII)

Torniamo alla serie di tutorial su come creare il nostro sistema operativo. Suppongo che questo capitolo ti piacerà molto perché finalmente possiamo interagire con il nostro sistema operativo. Oggi leggeremo l'input da tastiera. Per questo, lo schema è simile a quello del timer. Dobbiamo comunque usare gli IRQ, quindi inizieremo come con il timer.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Il nostro gestore della tastiera, tuttavia, è un po 'più complesso poiché stiamo leggendo i tasti e li depositiamo in un buffer.

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

Possiamo controllare come chiamiamo una funzione chiamata ND :: Keyboard :: GetChar. Lì otteniamo il carattere e poi se non è un carattere vuoto (qui ho usato 255, dovremmo usare un sistema migliore) mettiamo il carattere sullo schermo e lo memorizziamo in un semplice buffer di caratteri (anche questo è soggetto a miglioramento, il sistema attuale potrebbe traboccare).

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

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

Qui possiamo vedere come si ottiene il tasto che è stato premuto. A 0x60 ci sarà sempre l'ultimo tasto premuto. Infatti può essere letto direttamente senza dover usare l'IRQ, ma poi non sapremo come identificare quando si è verificato un cambiamento. Lì controlliamo con l'operazione AND che il codice che abbiamo ottenuto corrisponda ad una chiave che è stata rilasciata.

In tal caso restituiamo 255 (perché lo ignoreremo in seguito) e altrimenti il ​​tasto è stato premuto. In questo caso restituiamo la posizione di un array chiamato en_US. Quali informazioni contiene questo array? Questo array è ciò che chiameremmo mappa dei tasti o mappa dei caratteri. Come saprai, lingue diverse hanno tastiere diverse e non sono supportate poiché sovrascrivono i tasti. Quindi en_US ci darà la chiave corrispondente a ciascun codice e funzionerà su una tastiera americana.

carattere non firmato 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, / * Maiusc sinistro * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Shift destro * / '*', 0, / * Alt * / '', 0, / * BLOC MAIUSC * / 0,0,0,0,0,0,0,0,0,0, / * Tasti F1-F10 * / 0, / * BLOC NUM * / 0, / * Blocco scorrimento * / 0, / * Tasto Home * / 0, / * Freccia su * / 0, / * Pagina su * / '-', 0, / * Freccia sinistra * / 0, 0, / * Freccia destra * / '+', 0, / * Tasto Fine * / 0, / * Freccia giù * / 0, / * Pagina giù * / 0, / * Tasto di inserimento * / 0, / * Tasto di cancellazione * / 0,0,0, 0, 0, 11, / * Tasti F12-F0 * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

C'era anche una funzione definita che riceveva una frase. Lo scopo è semplicemente quello di accedere più facilmente alle stringhe dalle applicazioni che ne hanno bisogno, al momento solo una. Sto parlando di NextShellLite, una versione ridotta della possibile futura shell che NextDivel avrebbe. Lo scopo di NextShellLite è solo quello di fornire una shell ridotta per testare gradualmente le nuove funzionalità. Non ho intenzione di inserire il codice della shell qui, ma l'ho incluso nel codice NextDivel.

Al momento non funziona come un programma separato ma come una funzione chiamata dal kernel, principalmente perché non abbiamo ancora aggiunto l'opzione per eseguire gli eseguibili. E, naturalmente, alcune immagini di come funziona la shell con le nuove funzioni di input da tastiera.

SuccessivoShellLite


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   dario suddetto

    ottimo tutor! grazie 🙂

  2.   PopArch suddetto

    La verità è che non ho mai seguito il tutorial perché nella prima parte mi ha dato un errore durante il tentativo di compilazione ma non ricordo quale errore fosse

  3.   Il gatto di Lopez suddetto

    Scusa per la mia grossolana ignoranza ... da dove vengono scritti questi codici? Dal terminale ??

    1.    AdrianArroyoStreet suddetto

      I codici fanno parte del codice sorgente. Non lo metto completo perché altrimenti il ​​post è tutto codice e niente spiegazione. Ti consiglio di leggere i tutorial dall'inizio se vuoi seguirlo. Puoi anche controllare il codice sorgente completo qui (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady suddetto

    Come sarebbe il miglioramento in modo che non si verifichi un trabocco?

    1.    Plock suddetto

      Kady, hai già controllato il codice del repository? Lì viene stabilita la dimensione massima, oltre alle funzioni per controllarla, lì puoi apportare la modifica delle dimensioni o implementare un modo ragionevole per liberare il buffer quando diventa saturo
      Lascio il link per controllarlo https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   nico suddetto

    Ciao molto interessante, continuerai con questa «serie» di Emulating Linus Torvals?
    Puoi consigliare qualche libro, informazione per poter realizzare un kernel come questo?

    Auguri !!

  6.   RisposteVeganas.Org suddetto

    Ciao. Grazie per il tutorial. Per favore, puoi consigliarmi un libro su questo che hai fatto che non sia "Operating Systems" di Tanenbaum? Grazie mille in anticipo.
    Saluti.