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


Aggiungi come fonte preferita in Google