Emulando Linus Torvalds: crie seu próprio sistema operacional do zero (VIII)

Voltamos à série de tutoriais sobre como criar nosso próprio sistema operacional. Suponho que você goste muito deste capítulo porque podemos finalmente interagir com nosso sistema operacional. Hoje vamos ler a entrada do teclado. Para isso, o esquema é semelhante ao do cronômetro. Temos que usar IRQs de qualquer maneira, então começaremos da mesma forma que com o cronômetro.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Nosso manipulador de teclado, entretanto, é um pouco mais complexo, pois estamos lendo as teclas e as depositando em um buffer.

extern "C" void ND_Keyboard_Handler (struct regs * r) {scancode de char unsigned = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}

http://gist.github.com/634afddcb3e977ea202d

Podemos verificar como chamamos uma função chamada ND :: Keyboard :: GetChar. Lá obtemos o caractere e então se não for um caractere vazio (aqui usei 255, teríamos que usar um sistema melhor) colocamos o caractere na tela e armazenamos em um buffer simples de caracteres (isto também está sujeito a melhorias, o sistema atual pode transbordar).

nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode; scancode = (unsigned char) 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

Aqui podemos ver como a tecla que foi pressionada é obtida. Em 0x60, sempre haverá a última tecla pressionada. Na verdade, ele pode ser lido diretamente sem a necessidade de usar o IRQ, mas não saberemos como identificar quando uma alteração ocorreu. Aí verificamos com a operação AND se o código obtido corresponde a uma chave que foi libertada.

Nesse caso, retornamos 255 (porque o ignoraremos mais tarde) e, caso contrário, a tecla foi pressionada. Nesse caso, retornamos a posição de um array chamado en_US. Quais informações esta matriz contém? Esse array é o que chamaríamos de mapa de teclado ou mapa de caracteres. Como você sabe, idiomas diferentes têm teclados diferentes e não são suportados, pois sobrescrevem as teclas. Então en_US nos dará a chave correspondente a cada código e funcionará em um teclado americano.

unsigned char 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, / * Shift para a esquerda * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Deslocamento para a direita * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * Teclas F1-F10 * / 0, / * Num lock * / 0, / * Scroll lock * / 0, / * Tecla Home * / 0, / * Seta para cima * / 0, / * Page up * / '-', 0, / * Seta para a esquerda * / 0, 0, / * Seta para a direita * / '+', 0, / * Tecla End * / 0, / * Seta para baixo * / 0, / * Página para baixo * / 0, / * Tecla Insert * / 0, / * Tecla Delete * / 0,0,0, 0, 0, 11, / * Teclas F12-F0 * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Também havia uma função definida que obteve uma frase. O objetivo é simplesmente acessar mais facilmente as strings dos aplicativos que precisam, no momento apenas um. Estou falando sobre NextShellLite, uma versão reduzida do possível futuro shell que NextDivel teria. O objetivo do NextShellLite é apenas fornecer um shell reduzido para testar gradualmente novas funcionalidades. Não vou colocar o código do shell aqui, mas eu o incluí no código NextDivel.

No momento não funciona como um programa separado, mas como uma função chamada pelo kernel, principalmente porque ainda não adicionamos a opção de executar executáveis. E, claro, algumas fotos de como o shell funciona com as novas funções de entrada do teclado.

PróximoShellLite


Adicionar como fonte preferencial no Google