Meniru Linus Torvalds: buat sistem operasi anda sendiri dari awal (VIII)

Kami kembali ke siri tutorial bagaimana membuat sistem operasi kami sendiri. Saya rasa anda akan menyukai bab ini kerana akhirnya kita dapat berinteraksi dengan sistem operasi kita. Hari ini kita akan membaca input papan kekunci. Untuk ini, skema serupa dengan pemasa. Kita mesti menggunakan IRQ jadi kita akan mula sama seperti dengan pemasa.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Walau bagaimanapun, pengendali papan kekunci kami agak lebih kompleks kerana kami membaca kunci dan menyimpannya dalam penyangga.

extern "C" batal ND_Keyboard_Handler (struct regs * r) {char scancode = ND :: papan kekunci :: GetChar (); if (scancode! = 255) {ND :: Skrin :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}

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

Kita dapat memeriksa bagaimana kita memanggil fungsi yang dipanggil ND :: Keyboard :: GetChar. Di sana kita memperoleh watak dan kemudian jika itu bukan watak kosong (di sini saya telah menggunakan 255, kita harus menggunakan sistem yang lebih baik) kita meletakkan watak tersebut di skrin dan menyimpannya dalam penyangga ringkas watak (ini juga mudah diperbaiki, sistem semasa mungkin melimpah).

nsigned char ND :: Papan Kekunci :: GetChar () {char scancode yang tidak ditandatangani; scancode = (char tidak bertanda tangan) ND :: Port :: InputB (0x60); jika (scancode & ND_KEYBOARD_KEY_RELEASE) {pulangkan 255; } lain {return en_US [scancode]; }} char * ND :: Papan Kekunci :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; kembalikan stringBuffer; }

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

Di sini kita dapat melihat bagaimana kunci yang telah ditekan diperolehi. Pada 0x60 akan selalu ada kekunci terakhir yang ditekan. Sebenarnya, ia dapat dibaca secara langsung tanpa harus menggunakan IRQ, tetapi kemudian kita tidak akan tahu bagaimana mengenal pasti kapan perubahan telah berlaku. Di sana kami memeriksa dengan operasi AND bahawa kod yang kami perolehi sepadan dengan kunci yang telah dilepaskan.

Dalam kes ini, kami mengembalikan 255 (kerana kami akan mengabaikannya kemudian) dan jika tidak, kuncinya telah ditekan. Dalam kes ini, kita mengembalikan kedudukan array yang disebut en_US. Apakah maklumat yang terdapat dalam larik ini? Susunan ini adalah apa yang kita panggil peta kunci atau peta watak. Seperti yang anda ketahui, bahasa yang berlainan mempunyai papan kekunci yang berbeza dan tidak disokong kerana mereka menimpa kekunci. Oleh itu en_US akan memberikan kunci yang sesuai dengan setiap kod dan ia akan berfungsi pada papan kekunci Amerika.

char yang tidak ditandatangani 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, / * Left Shift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Pergeseran kanan * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * Kunci F1-F10 * / 0, / * Num lock * / 0, / * Kunci tatal * / 0, / * Kekunci utama * / 0, / * Anak panah atas * / 0, / * Halaman atas * / '-', 0, / * Anak panah kiri * / 0, 0, / * Anak panah kanan * / '+', 0, / * Kekunci akhir * / 0, / * Anak panah bawah * / 0, / * Halaman ke bawah * / 0, / * Masukkan kekunci * / 0, / * Padam kekunci * / 0,0,0, 0, 0, 11, / * Kekunci F12-F0 * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Terdapat juga fungsi yang ditentukan yang mendapat frasa. Tujuannya hanyalah untuk mengakses rentetan dari aplikasi yang memerlukannya dengan lebih mudah, pada masa ini hanya satu. Saya bercakap mengenai NextShellLite, versi pengurangan shell masa depan yang mungkin dimiliki oleh NextDivel. Tujuan NextShellLite hanya untuk menyediakan shell yang dikurangkan untuk menguji fungsi baru secara beransur-ansur. Saya tidak akan meletakkan kod shell di sini tetapi saya memasukkannya ke dalam kod NextDivel.

Pada masa ini ia tidak berfungsi sebagai program terpisah tetapi sebagai fungsi yang disebut oleh kernel, terutama kerana kami belum menambahkan pilihan untuk menjalankan eksekusi. Dan tentu saja, beberapa gambar bagaimana shell berfungsi dengan fungsi input keyboard baru.

SeterusnyaShellLite


Tambahkan sebagai sumber pilihan dalam Google