نعود إلى سلسلة البرامج التعليمية حول كيفية إنشاء نظام التشغيل الخاص بنا. أفترض أنك ستحب هذا الفصل كثيرًا لأنه يمكننا أخيرًا التفاعل مع نظام التشغيل الخاص بنا. اليوم سنقرأ إدخال لوحة المفاتيح. لهذا ، فإن المخطط مشابه لنظام الموقت. يتعين علينا استخدام 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.
في الوقت الحالي ، لا يعمل كبرنامج منفصل ولكن كوظيفة تستدعيها النواة ، ويرجع ذلك أساسًا إلى أننا لم نقم بعد بإضافة خيار تشغيل الملفات التنفيذية. وبالطبع ، بعض الصور لكيفية عمل الغلاف مع وظائف إدخال لوحة المفاتيح الجديدة.
مدرس ممتاز! شكرا 🙂
الحقيقة هي أنني لم أتبع البرنامج التعليمي مطلقًا لأنه أخطأ في الجزء الأول عند محاولة التجميع ولكني لا أتذكر الخطأ الذي حدث
آسف لجهلي الفادح ... من أين كتبت هذه الرموز؟ من المحطة ؟؟
الرموز جزء من شفرة المصدر. لا أكمله لأنه بخلاف ذلك يكون المنشور كله رمزًا ولا يوجد تفسير. أوصي بقراءة البرامج التعليمية من البداية إذا كنت ترغب في متابعتها. يمكنك أيضًا التحقق من كود المصدر الكامل هنا (http://github.com/AdrianArroyoCalle/next-divel)
كيف يكون التحسين بحيث لا يحدث الفائض؟
قاضي هل راجعت كود المستودع بعد هناك يتم تحديد الحجم الأقصى ، بالإضافة إلى وظائف التحكم فيه ، حيث يمكنك إجراء التغيير في الحجم أو تنفيذ طريقة معقولة لتحرير المخزن المؤقت عندما يصبح مشبعًا
أترك الرابط لك للتحقق منه https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
مرحبًا ، هل ستستمر في هذه «السلسلة» من محاكاة Linus Torvals؟
هل يمكنك أن تنصحني بأي كتاب أو معلومات لتكون قادرًا على تكوين نواة كهذه؟
تحياتي!
مرحبا. شكرا على البرنامج التعليمي. من فضلك ، هل يمكنك أن تنصحني بكتاب عن هذا كتبته ليس "أنظمة تشغيل" من تأليف تانينباوم؟ شكرا جزيلا لك مقدما.
تحية.