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.
mükemmel öğretmen! teşekkürler 🙂
Gerçek şu ki öğreticiyi hiç takip etmedim çünkü ilk bölümde derlemeye çalışırken bana bir hata verdi ama ne hata olduğunu hatırlamıyorum
Aptal cehaletim için üzgünüm ... bu kodlar nereden yazılıyor? Terminalden mi?
Kodlar, kaynak kodun bir parçasıdır. Tamamlamadım çünkü aksi halde yazının tamamı koddur ve açıklama yoktur. Takip etmek istiyorsanız öğreticileri baştan okumanızı tavsiye ederim. Tam kaynak kodunu buradan da kontrol edebilirsiniz (http://github.com/AdrianArroyoCalle/next-divel)
Taşma olmaması için iyileştirme nasıl olur?
Kady, depo kodunu kontrol ettin mi? Orada maksimum boyut ve onu kontrol etme işlevleri belirlenir, orada boyutta değişiklik yapabilir veya doygun hale geldiğinde arabelleği boşaltmak için makul bir yol uygulayabilirsiniz.
Bağlantıyı kontrol etmen için bırakıyorum https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
Merhaba çok ilginç, Linus Torvals'ı Taklit Etmenin bu «dizisi» ile devam edecek misiniz?
Bunun gibi bir çekirdek yapabilmek için herhangi bir kitap, bilgi tavsiye edebilir misiniz?
Selamlar!
Selam. Eğitim için teşekkürler. Lütfen bu konuyla ilgili olarak Tanenbaum'un "İşletim Sistemleri" olmayan bir kitabını tavsiye edebilir misiniz? Şimdiden çok teşekkür ederim.
Selamlar.