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


Yorumunuzu bırakın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar ile işaretlenmiştir *

*

*

  1. Verilerden sorumlu: Miguel Ángel Gatón
  2. Verilerin amacı: Kontrol SPAM, yorum yönetimi.
  3. Meşruiyet: Onayınız
  4. Verilerin iletilmesi: Veriler, yasal zorunluluk dışında üçüncü kişilere iletilmeyecektir.
  5. Veri depolama: Occentus Networks (AB) tarafından barındırılan veritabanı
  6. Haklar: Bilgilerinizi istediğiniz zaman sınırlayabilir, kurtarabilir ve silebilirsiniz.

  1.   Daryo dijo

    mükemmel öğretmen! teşekkürler 🙂

  2.   PopArch dijo

    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

  3.   Lopez'in kedisi dijo

    Aptal cehaletim için üzgünüm ... bu kodlar nereden yazılıyor? Terminalden mi?

    1.    AdrianArroyoSokak dijo

      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)

  4.   Kady dijo

    Taşma olmaması için iyileştirme nasıl olur?

    1.    Plock dijo

      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

  5.   Nico dijo

    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!

  6.   CevaplarVeganas.Org dijo

    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.