محاكاة 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.

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

التالي


اترك تعليقك

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها ب *

*

*

  1. المسؤول عن البيانات: ميغيل أنخيل جاتون
  2. الغرض من البيانات: التحكم في الرسائل الاقتحامية ، وإدارة التعليقات.
  3. الشرعية: موافقتك
  4. توصيل البيانات: لن يتم إرسال البيانات إلى أطراف ثالثة إلا بموجب التزام قانوني.
  5. تخزين البيانات: قاعدة البيانات التي تستضيفها شركة Occentus Networks (الاتحاد الأوروبي)
  6. الحقوق: يمكنك في أي وقت تقييد معلوماتك واستعادتها وحذفها.

  1.   داريو قال

    مدرس ممتاز! شكرا 🙂

  2.   PopArch قال

    الحقيقة هي أنني لم أتبع البرنامج التعليمي مطلقًا لأنه أخطأ في الجزء الأول عند محاولة التجميع ولكني لا أتذكر الخطأ الذي حدث

  3.   قطة لوبيز قال

    آسف لجهلي الفادح ... من أين كتبت هذه الرموز؟ من المحطة ؟؟

    1.    شارع أدريان أرويو قال

      الرموز جزء من شفرة المصدر. لا أكمله لأنه بخلاف ذلك يكون المنشور كله رمزًا ولا يوجد تفسير. أوصي بقراءة البرامج التعليمية من البداية إذا كنت ترغب في متابعتها. يمكنك أيضًا التحقق من كود المصدر الكامل هنا (http://github.com/AdrianArroyoCalle/next-divel)

  4.   قاضي قال

    كيف يكون التحسين بحيث لا يحدث الفائض؟

    1.    بلوك قال

      قاضي هل راجعت كود المستودع بعد هناك يتم تحديد الحجم الأقصى ، بالإضافة إلى وظائف التحكم فيه ، حيث يمكنك إجراء التغيير في الحجم أو تنفيذ طريقة معقولة لتحرير المخزن المؤقت عندما يصبح مشبعًا
      أترك الرابط لك للتحقق منه https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   نيكو قال

    مرحبًا ، هل ستستمر في هذه «السلسلة» من محاكاة Linus Torvals؟
    هل يمكنك أن تنصحني بأي كتاب أو معلومات لتكون قادرًا على تكوين نواة كهذه؟

    تحياتي!

  6.   أجوبة Veganas.Org قال

    مرحبا. شكرا على البرنامج التعليمي. من فضلك ، هل يمكنك أن تنصحني بكتاب عن هذا كتبته ليس "أنظمة تشغيل" من تأليف تانينباوم؟ شكرا جزيلا لك مقدما.
    تحية.