Linus Torvalds'ı taklit etme: kendi işletim sisteminizi sıfırdan oluşturun (VIII)

Kendi işletim sistemimizi nasıl yaratacağımızı anlatan eğitim serisine geri dönüyoruz. Sanırım bu bölümü çok beğeneceksiniz çünkü sonunda işletim sistemimizle etkileşim kurabiliriz. Bugün klavye girişini okuyacağız. Bunun için şema zamanlayıcıya benzer. Yine de IRQ'ları kullanmalıyız, böylece zamanlayıcıyla aynı şekilde başlayacağız.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Bununla birlikte, klavye işleyicimiz, tuşları okuduğumuz ve bir arabelleğe yerleştirdiğimiz için biraz daha karmaşıktır.

extern "C" void ND_Keyboard_Handler (struct regs * r) {işaretsiz karakter scancode = ND :: Keyboard :: GetChar (); eğer (scancode! = 255) {ND :: Screen :: PutChar (tarama kodu); stringBuffer [stringPos] = tarama kodu; stringPos ++; }}

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

ND :: Keyboard :: GetChar adlı bir işlevi nasıl çağırdığımızı kontrol edebiliriz. Orada karakteri elde ederiz ve sonra boş bir karakter değilse (burada 255 kullandım, daha iyi bir sistem kullanmalıyız) karakteri ekrana koyar ve basit bir karakter arabelleğinde saklarız (bu da konu iyileştirme için mevcut sistem taşabilir).

nsigned char ND :: Keyboard :: GetChar () {işaretsiz karakter tarama kodu; scancode = (işaretsiz karakter) ND :: Ports :: InputB (0x60); eğer (kod ve ND_KEYBOARD_KEY_RELEASE) {dönüş 255; } değilse {dönüş en_US [tarama kodu]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; stringBuffer döndür; }

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

Burada basılan tuşun nasıl elde edildiğini görebiliriz. 0x60'ta her zaman basılan son tuş olacaktır. Aslında, IRQ kullanmak zorunda kalmadan doğrudan okunabilir, ancak o zaman bir değişikliğin ne zaman gerçekleştiğini nasıl belirleyeceğimizi bilemeyeceğiz. Burada elde ettiğimiz kodun bırakılmış bir anahtara karşılık gelip gelmediğini VE işlemi ile kontrol ediyoruz.

Bu durumda 255 döndürürüz (çünkü daha sonra görmezden geleceğiz) ve aksi takdirde tuşa basılmıştır. Bu durumda en_US adlı bir dizinin konumunu döndürürüz. Bu dizi hangi bilgileri içeriyor? Bu dizi, tuş eşlemesi veya karakter eşlemesi dediğimiz şeydir. Bildiğiniz gibi, farklı dillerin farklı klavyeleri vardır ve tuşların üzerine yazıldıkları için desteklenmezler. Böylece en_US bize her bir koda karşılık gelen anahtarı verecek ve bu bir Amerikan klavyesinde çalışacaktır.

işaretsiz karakter 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, / * Sola Kaydırma * /' \\ ',' z ',' x ', 'c', 'v', 'b', 'n', 'm', ',', ',' / ', 0, / * Sağa kaydırma * /' * ', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 tuşları * / 0, / * Num lock * / 0, / * Kaydırma kilidi * / 0, / * Giriş tuşu * / 0, / * Yukarı ok * / 0, / * Sayfa yukarı * / '-', 0, / * Sol ok * / 0, 0, / * Sağ ok * / '+', 0, / * Sonlandırma tuşu * / 0, / * Aşağı ok * / 0, / * Sayfa aşağı * / 0, / * Ekle tuşu * / 0, / * Sil tuşu * / 0,0,0, 0, 0, 11, / * F12-F0 Tuşları * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Bir cümle alan tanımlanmış bir işlev de vardı. Amaç, şu anda yalnızca bir tane olmak üzere, ihtiyaç duyan uygulamalardan dizelere daha kolay erişmektir. NextDivel'in sahip olacağı gelecekteki olası kabuğun küçültülmüş bir versiyonu olan NextShellLite'den bahsediyorum. NextShellLite'ın amacı, yeni özellikleri kademeli olarak test etmek için yalnızca küçültülmüş bir kabuk sağlamaktır. Buraya kabuk kodunu koymayacağım ama onu NextDivel koduna ekledim.

Şu anda ayrı bir program olarak değil, çekirdek tarafından çağrılan bir işlev olarak çalışıyor, çünkü esas olarak yürütülebilir dosyaları çalıştırma seçeneğini henüz eklememiştik. Ve elbette, kabuğun yeni klavye giriş işlevleriyle nasıl çalıştığına dair bazı resimler.

SonrakiShellLite


Google'da tercih edilen kaynak olarak ekleyin.