محاكاة Linus Torvalds: قم بإنشاء نظام التشغيل الخاص بك من البداية (VIII)

نعود إلى سلسلة البرامج التعليمية حول كيفية إنشاء نظام التشغيل الخاص بنا. أفترض أنك ستحب هذا الفصل كثيرًا لأنه يمكننا أخيرًا التفاعل مع نظام التشغيل الخاص بنا. اليوم سنقرأ إدخال لوحة المفاتيح. لهذا ، فإن المخطط مشابه لنظام الموقت. يتعين علينا استخدام IRQs على أي حال ، لذا سنبدأ بنفس الطريقة مع المؤقت.

ND_IRQ_InstallHandler (1 ، & ND_Keyboard_Handler) ؛

ومع ذلك ، فإن معالج لوحة المفاتيح الخاص بنا أكثر تعقيدًا إلى حد ما لأننا نقرأ المفاتيح ونودعها في مخزن مؤقت.

خارجي "C" void ND_Keyboard_Handler (Struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar ()؛ إذا (scancode! = 255) {ND :: Screen :: PutChar (scancode) ؛ stringBuffer [stringPos] = رمز scancode ؛ سلسلة بوس ++ ؛ }}

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

يمكننا التحقق من كيفية استدعاء دالة تسمى ND :: Keyboard :: GetChar. هناك نحصل على الحرف وبعد ذلك إذا لم يكن حرفًا فارغًا (هنا استخدمت 255 ، فسيتعين علينا استخدام نظام أفضل) نضع الحرف على الشاشة ونخزنه في مخزن مؤقت بسيط من الأحرف (وهذا أيضًا عرضة للتحسين ، النظام الحالي قد تفيض).

nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode؛ scancode = (حرف غير موقعة) ND :: Ports :: InputB (0x60) ؛ إذا (scancode & ND_KEYBOARD_KEY_RELEASE) {إرجاع 255 ؛ } else {return en_US [scancode] ؛ }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0؛ عودة stringBuffer }

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

هنا يمكننا أن نرى كيف يتم الحصول على المفتاح الذي تم الضغط عليه. عند 0x60 ، سيكون هناك دائمًا آخر مفتاح تم الضغط عليه. في الواقع ، يمكن قراءته مباشرة دون الحاجة إلى استخدام IRQ ، ولكن بعد ذلك لن نعرف كيفية تحديد وقت حدوث التغيير. هناك نتحقق من عملية AND من أن الكود الذي حصلنا عليه يتوافق مع مفتاح تم إصداره.

في هذه الحالة نعيد 255 (لأننا سنتجاهلها لاحقًا) وإلا تم الضغط على المفتاح. في هذه الحالة نعيد موضع مصفوفة تسمى en_US. ما هي المعلومات التي تحتويها هذه المجموعة؟ هذه المجموعة هي ما نسميه خريطة المفاتيح أو خريطة الأحرف. كما تعلم ، تحتوي اللغات المختلفة على لوحات مفاتيح مختلفة ولا يتم دعمها لأنها تقوم بالكتابة فوق المفاتيح. لذا فإن en_US ستعطينا المفتاح المقابل لكل رمز وسيعمل على لوحة مفاتيح أمريكية.

غير موقعة char en_US [128] = {0,27،1، '2'، '3'، '4'، '5'، '6'، '7'، '8'، '9'، '0'، '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، / * Shift الأيسر * / '\\'، 'z'، 'x'، 'c'، 'v'، 'b'، 'n'، 'm'، '،'، '.'، '/'، 0، / * Right shift * / '*'، 0، / * Alt * / "، 0,0,0,0,0,0,0,0,0,0 ، / * Caps lock * / 1،10،0،0،0،0،0،0،0،0 ، / * مفاتيح F0-F0 * / 0 ، / * Num lock * / 0 ، / * قفل التمرير * / 0 ، / * مفتاح الصفحة الرئيسية * / 0,0,0 ، / * سهم لأعلى * / 0 ، / * صفحة لأعلى * / '-' ، 0 ، / * سهم لليسار * / 11 ، 12 ، / * سهم لليمين * / '+' ، 0 ، / * مفتاح الإنهاء * / XNUMX ، / * سهم لأسفل * / XNUMX ، / * صفحة لأسفل * / XNUMX ، / * مفتاح إدراج * / XNUMX ، / * مفتاح الحذف * / XNUMX،XNUMX ، XNUMX ، XNUMX ، XNUMX ، / * FXNUMX-FXNUMX مفاتيح * / XNUMX} ؛

http://gist.github.com/bf52085aec05f3070b65

كانت هناك أيضًا وظيفة محددة حصلت على عبارة. الغرض ببساطة هو الوصول بسهولة أكبر إلى سلاسل التطبيقات التي تحتاجها ، في الوقت الحالي فقط. أنا أتحدث عن NextShellLite ، نسخة مصغرة من الغلاف المستقبلي المحتمل الذي سيكون لدى NextDivel. الغرض من NextShellLite هو فقط توفير غلاف مصغر لاختبار وظائف جديدة شيئًا فشيئًا. لن أضع كود القشرة هنا ولكني قمت بتضمينه في كود NextDivel.

في الوقت الحالي ، لا يعمل كبرنامج منفصل ولكن كوظيفة تستدعيها النواة ، ويرجع ذلك أساسًا إلى أننا لم نقم بعد بإضافة خيار تشغيل الملفات التنفيذية. وبالطبع ، بعض الصور لكيفية عمل الغلاف مع وظائف إدخال لوحة المفاتيح الجديدة.

التالي


أضف كمصدر مفضل في جوجل