Tornem a la sèrie de tutorials sobre com crear el nostre propi sistema operatiu. Suposo que aquest capítol us agradarà molt perquè per fi podrem interactuar amb el nostre sistema operatiu. Avui llegirem l´entrada del teclat. Per fer-ho, l'esquema és similar al del timer. Hem de fer servir els IRQ igualment així que començarem igual que amb el timer.
ND_IRQ_InstallHandler(1,&ND_Keyboard_Handler);
El nostre handler de teclat, però, és una mica més complex ja que anem llegint les tecles i les anem dipositant en 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
Podem comprovar com anomenem una funció anomenada ND::Keyboard::GetChar. Allí obtenim el caràcter i després si no és un caràcter buit (aquí he fet servir 255, caldria fer servir un sistema millor) posem el caràcter en pantalla i l'emmagatzemem en un buffer simple de chars (això també és susceptible de millora, el sistema actual es pot desbordar).
nsigned char ND::Keyboard::GetChar() { unsigned char scancode; scancode=(unsigned char)ND::Ports::InputB(0x60); if(scancode & ND_KEYBOARD_KEY_RELEASE) { return 255; }els{ return a_US[scancode]; } } char* ND::Keyboard::GetString() { while(stringBuffer[stringPos-1]!='\n') { } stringPos=0; return stringBuffer; }
http://gist.github.com/2d4f13e0b1a281c66884
Aquí podem veure com s'obté la tecla que ha estat premuda. A 0x60 sempre estarà l'última tecla premuda. De fet es pot llegir directament sense haver de fer servir l'IRQ, però llavors no sabrem identificar quan s'ha produït un canvi. Allí comprovem amb l'operació AND que el codi d'obtinguem correspon a una tecla que s'ha deixat de prémer.
En aquest cas tornem 255 (perquè després ho ignorarem) i en cas contrari la tecla ha estat premuda. En aquest cas tornem la posició d'un array anomenat a_US. Quina informació conté aquest array? Aquest array és el que anomenaríem un keymap o un mapa de caràcters. Com que sabran diferents idiomes tenen diferents teclats i no són compatibles ja que sobreescriuen les tecles. Així a_US ens donarà la tecla corresponent a cada codi i funcionarà en un teclat americà.
unsigned char a_US[128]= { 0,27,'1','2','3','4','5','6','7','8','9','0 ','-','=', '\b', '\t','q','w','e','r','t','i','u','i ','o','p','[',']','\n', 0, /* Ctrl */ 'a','s','d','f','g', 'h','j','k','l',';', '\'','`',0, /* Left Shift */ '\\','z','x', 'c','v','b','n','m',',','.','/', 0,/* Right shift */ '*', 0, /* Alt * / ' ', 0, /* Caps lock*/ 0,0,0,0,0,0,0,0,0,0, /* F1-F10 keys */ 0, /* Num lock */ 0, /* Scroll lock */ 0, /* Home key */ 0, /* Up arrow */ 0, /* Page up */ '-', 0, /* Left arrow */ 0, 0, /* Right arrow */ '+', 0, /* End key */ 0, /* Down arrow */ 0, /* Page down */ 0, /* Insert key */ 0, /* Delete key */ 0,0,0, 0, 0, 11, /* F12-F0 Keys */ XNUMX };
http://gist.github.com/bf52085aec05f3070b65
També hi havia una funció definida que obtenia una frase. El propòsit és simplement obtenir accés més fàcilment als strings des de les aplicacions que ho necessitin, de moment només una. Parlo de NextShellLite, una versió reduïda del possible futur intèrpret d'ordres que tindria NextDivel. El propòsit de NextShellLite és únicament el de proveir d'un shell reduït per anar provant de mica en mica noves funcionalitats. No posaré el codi de l'intèrpret d'ordres aquí però l'he inclòs dins del codi de NextDivel.
De moment no funciona com un programa a part sinó com una funció que anomena el nucli, principalment perquè encara no hi afegim l'opció d'executar executables. I és clar, unes imatges de com funciona l'intèrpret d'ordres amb les noves funcions d'entrada de teclat.
excel · lent tuto ! gràcies 🙂
La veritat mai seguia el tutor perquè a la primera part em donava un error en tractar de compilar però no recordo que error era
Perdó per la meva ignorància crasa… des d'on s'escriuen aquests codis? des de la terminal??
Els codis són part del codi font. No ho poso complet perquè sinó el post és tot codi i res d'explicació. Et recomano que et llegeixis els tutorials des del principi si vols seguir-lo. També pots consultar el codi font complet aquí (http://github.com/AdrianArroyoCalle/next-divel)
Com seria la millora perquè no passés desbordament?
Kady ja vas revisar el codi del repositori? aquí s'estableix la mida màxima, així com funcions per controlar-la, aquí pots fer el canvi en mida o bé implementar una forma raonable d'alliberar el buffer quan s'arribi a saturar
et deixo el link perquè el xecs https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
Hola molt interessant, continuaran amb aquesta «sèrie» d'Emulant Linus Torvals?
Em poden recomanar algun llibre, informació per poder fer un nucli com aquest?
Salutacions!
Hola. Gràcies pel tutorial. Si us plau, ens pots recomanar un llibre sobre això que has fet que no sigui «Sistemes Operatius» de Tanenbaum? Moltes gràcies per avançat.
Salutacions.