Emulant Linus Torvalds: feu-vos vostre sistema operatiu des de 0 (VIII)

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.

NextShellLite


Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   donaro va dir

    excel · lent tuto ! gràcies 🙂

  2.   PopArch va dir

    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

  3.   El Gat López va dir

    Perdó per la meva ignorància crasa… des d'on s'escriuen aquests codis? des de la terminal??

    1.    AdrianArroyoCarrer va dir

      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)

  4.   Kady va dir

    Com seria la millora perquè no passés desbordament?

    1.    Plock va dir

      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

  5.   Nico va dir

    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!

  6.   RespostesVeganes.Org va dir

    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.