Emulowanie Linusa Torvaldsa: stwórz swój własny system operacyjny od podstaw (VIII)

Powracamy do serii tutoriali jak stworzyć własny system operacyjny. Przypuszczam, że ten rozdział bardzo Ci się spodoba, ponieważ w końcu będziemy mogli wchodzić w interakcje z naszym systemem operacyjnym. Dzisiaj będziemy czytać dane wprowadzane z klawiatury. W tym celu schemat jest podobny do schematu timera. I tak musimy użyć IRQ, więc zaczniemy tak samo jak z timerem.

ND_IRQ_InstallHandler(1,&ND_Keyboard_Handler);

Nasz program obsługi klawiatury jest jednak nieco bardziej złożony, ponieważ odczytujemy klawisze i umieszczamy je w buforze.

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; stringPoz++; } }

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

Możemy sprawdzić, jak wywołujemy funkcję o nazwie ND::Keyboard::GetChar. Tam dostajemy znak i jeśli nie jest to pusty znak (tutaj użyłem 255, należy zastosować lepszy system) umieszczamy znak na ekranie i przechowujemy go w prostym buforze znaków (to też podlega poprawie , obecny system może się przepełnić).

nsigned char ND::Keyboard::GetChar() { unsigned char scancode; scancode=(znak bez znaku)ND::Porty::InputB(0x60); if(scancode & ND_KEYBOARD_KEY_RELEASE) {zwróć 255; }else{ return en_US[kod skanu]; } } char* ND::Keyboard::GetString() { while(stringBuffer[stringPos-1]!='\n') { }stringPos=0; zwracaj stringBuffer; }

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

Tutaj możemy zobaczyć, w jaki sposób uzyskuje się naciśnięty klawisz. Ostatni naciśnięty klawisz zawsze będzie miał wartość 0x60. W rzeczywistości można go odczytać bezpośrednio, bez konieczności używania IRQ, ale wtedy nie będziemy w stanie zidentyfikować, kiedy nastąpiła zmiana. Tam sprawdzamy za pomocą operacji AND, czy otrzymany kod odpowiada zwolnionemu kluczowi.

W takim przypadku zwracamy 255 (ponieważ będziemy to później ignorować), aw przeciwnym razie klawisz został wciśnięty. W takim przypadku zwracamy pozycję tablicy o nazwie en_US. Jakie informacje zawiera ta tablica? Ta tablica jest tym, co nazwalibyśmy mapą klawiszy lub mapą znaków. Jak być może wiesz, różne języki mają różne klawiatury i nie są one kompatybilne, ponieważ zastępują klawisze. Więc en_US da nam klucz odpowiadający każdemu kodowi i będzie działać na amerykańskiej klawiaturze.

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, /* Przesunięcie w lewo */ '\\','z','x', 'c','v','b','n','m',',','.','/', 0,/* Przesunięcie w prawo */ '*', 0, /* Alt * / ' ', 0, /* Caps lock*/ 0,0,0,0,0,0,0,0,0,0, /* Klawisze F1-F10 */ 0, /* Num lock */ 0, /* Scroll lock */ 0, /* Klawisz strony domowej */ 0, /* Strzałka w górę */ 0, /* Strona w górę */ '-', 0, /* Strzałka w lewo */ 0, 0, /* Strzałka w prawo */ '+', 0, /* Klawisz zakończenia */ 0, /* Strzałka w dół */ 0, /* Strona w dół */ 0, /* Klawisz wstawiania */ 0, /* Klawisz usuwania */ 0,0,0, 0, 0, 11, /* Klawisze F12-F0 */ XNUMX };

http://gist.github.com/bf52085aec05f3070b65

Zdefiniowano również funkcję, która otrzymała frazę. Celem jest po prostu uzyskanie łatwiejszego dostępu do ciągów z aplikacji, które tego potrzebują, tylko jednej w tej chwili. Mówię o NextShellLite, zmniejszonej wersji możliwej przyszłej powłoki, którą miałby mieć NextDivel. Celem NextShellLite jest wyłącznie zapewnienie zredukowanej powłoki do stopniowego testowania nowych funkcji. Nie zamierzam tutaj umieszczać kodu powłoki, ale umieściłem go w kodzie NextDivel.

W tej chwili nie działa jako osobny program, ale jako funkcja wywoływana przez jądro, głównie dlatego, że nie dodaliśmy jeszcze opcji uruchamiania plików wykonywalnych. I oczywiście kilka obrazów pokazujących, jak powłoka działa z nowymi funkcjami klawiatury.

NastępnyShellLite


Dodaj jako preferowane źródło w Google