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

مرحبا بكم في وظيفة أخرى حول كيفية إنشاء نظام التشغيل الخاص بنا (المقالات السابقة في السلسلة: 1, 2, 3, 4, 5 y 6). لقد مر وقت طويل منذ آخر مشاركة ، ويرجع ذلك أساسًا إلى خطأ وجدته في ما لدينا اليوم. سنرى كيفية التعامل مع الساعة على معماريات x86.

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

حسنًا ، الساعة عبارة عن IRQ ، وتحديداً الأولى. لتكوينه ، سنستخدم الوظيفة التي حددناها مسبقًا لتثبيت IRQ بشكل عام ، وهي ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0 ، void ND :: Timer :: Phase (int hz) {int divisor = 1193180 / hz؛ ND :: Ports :: OutputB (0x43,0،36x0) ؛ ND :: Ports :: OutputB (40x0، divisor & 0xFF) ؛ ND :: Ports :: OutputB (40x8، divisor >> 0) ؛ } void ND :: Timer :: Wait (int ticks) {غير موقعة طويلة eticks؛ eticks = ND_TIMER_TICKS + علامات التجزئة ؛ while (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND، ND_COLOR_BLACK) ؛ ND :: Screen :: PutString ("\ n مؤقت الإعداد ...")؛ ND_IRQ_InstallHandler (18 ، & ND_Timer_Handler) ؛ ND :: Screen :: SetColor (ND_SIDE_FOREGROUND ، ND_COLOR_GREEN) ؛ ND :: Screen :: PutString ("done") ؛ } خارجي "C" باطل ND_Timer_Handler (هيكل regs * r) {ND_TIMER_TICKS ++ ؛ إذا (ND_TIMER_TICKS٪ 0 == XNUMX) {// ND :: Screen :: SetColor (ND_SIDE_FOREGROUND ، ND_COLOR_BROWN) ؛ // ND :: Screen :: PutString ("\ n ثانية واحدة أخرى")؛ يجب أن نجري شاشة تحديث}}

يعمل الكود على النحو التالي: يستدعي نظام التهيئة ND :: Timer :: Setupالذي يدعو ND_IRQ_InstallHandler لإدراج IRQ0 في الموضع الأول ، وظيفة رد الاتصال عند وقوع الحدث ، أي ND_Timer_Handler هذا يزيد من القراد. نظرًا لأننا ضبطنا سرعة الساعة على 18 هرتز ، كما سنرى لاحقًا ، إذا قسمناها على 18 وأعطينا عددًا صحيحًا ، فستكون الثانية قد مرت.

الوظيفة ND :: مؤقت :: المرحلة يساعدنا على ضبط سرعة مؤقت، هذا الرقم الباهظ هو 1.19 ميجاهرتز وهي قيمة مشتركة. حسنًا ، يجب أن نسمي هذه الدالة إذا أردنا تغيير سرعة مؤقت، بشكل افتراضي تذهب إلى 18,22 هرتز ، وهي قيمة غريبة يجب أن يقررها شخص ما IBM وبقي إلى يومنا هذا.

الوظيفة ND :: Timer :: Wait الأمر بسيط جدًا ، فقط انتظر مع تكرار حلقي في حين حتى ال القراد ضروري للمتابعة.

في الصورة ، يمكننا أن نرى أنه إذا قمنا بإلغاء التعليق على الكود داخل ND_Timer_Handler ، فسنحصل على هذا:

ثواني في NextDivel

في الفصل التالي سنرى كيف نقرأ مدخلات لوحة المفاتيح ونعمل قليلاً قذيفة للتفاعل مع نظامنا. كالعادة ، الكود متاح في GitHub جيثب: بموجب الترخيص GNU GPL الإصدار 2.


اترك تعليقك

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

*

*

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

  1.   نوح قال

    سلسلة من البرامج التعليمية مثيرة جدًا للاهتمام ، شخصياً لم أر الكثير حول إنشاء توزيعة Linux من البداية ، وحتى أقل باللغة الإسبانية وكاملة جدًا. أعتقد أنه يمكنك تعلم الكثير من هذا وبمجرد أن يتوفر لدي الوقت أتمنى أن أتمكن من القيام بهذه الدروس.
    كل ما أطلبه هو ألا تشعر بالإحباط وإنهاء البرنامج التعليمي ، لأنني وجدت العديد من البرامج التعليمية الجيدة التي لم تنتهِ أبدًا.
    تحية وشكر :).

    1.    رودر قال

      إنه ليس توزيع لينكس ، إنه نواة 😛.

    2.    com.desikoder قال

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

      Saludos!

  2.   illukki قال

    شكرا تشي. حتى الآن لم أعير اهتمامًا كبيرًا لمشاركتك ولكني في مشروع لذا سألقي نظرة عليها.
    تحية.

  3.   رودر قال

    تجدر الإشارة إلى أنه يمكن استخدام لغات أخرى ، مثل Objective-C (++) أو C ++ أو D أو Rust.

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

      هذا في C ++ ، وليس C. ومع ذلك ، من الصعب رؤية الاختلافات لأن العديد من مشغلي C ++ يتطلبون دعمًا للمكتبة ، مثل المشغلين الجدد والحذف. سيكون من الممتع جدًا إنشاء نظام تشغيل في Rust. توجد بالفعل قناة IRC مخصصة لأنظمة التشغيل على Rust (# rust-osdev على irc.mozilla.net). أي شخص يقوم بالترجمة إلى كود الآلة يستحق ذلك حقًا ، بما في ذلك Java إذا استخدمنا GCJ.

      1.    رودر قال

        نعم ، في الواقع ، Rust هي لغة مثيرة جدًا لأنظمة التشغيل ، لأنها ليست أسهل في التعلم من C أو C ++ (فهي لا تزال مستمرة مع التغييرات المستمرة ، ولكنها أسهل) ، لكنها أكثر أمانًا.

  4.   رودر قال

    في السبعينيات ، كان من الشائع جدًا البرمجة مباشرة على الأجهزة ، بدون نظام تشغيل.

  5.   كريستوفر قال

    ممتاز ... الآن أريد فقط أن أفهم: 3 ...

  6.   MMM قال

    مرحبا. شكرا جزيلا لك على هذه المقالات. ولكن ، إذا لم يكن لدي معرفة بالبرمجة ، فلا أعتقد أنني يجب أن أفعل ذلك ، أليس كذلك؟ أعني ، إذا لم يكن الأمر كذلك ، فسيكون "جيدًا ، والآن ما الذي يمكنني نسخه ولصقه؟" ... يا للأسف ، كنت أرغب دائمًا كثيرًا في معرفة كيفية البرمجة ولا شيء ، فأنا أكثر من حمار!

    1.    com.desikoder قال

      لا تلوم نفسك أنت لست حمارًا. بادئ ذي بدء ، لا يعرف جميع المبرمجين كيفية كتابة النواة ، فهي مهمة بسيطة جدًا ، وهي أكبر عمليا. على سبيل المثال ، ينشئ المؤلف هنا برامج تشغيل عامة للوحة المفاتيح والشاشة ، ويتلاعب بمصفوفة الشاشة ، وهي طريقة لا تُستخدم على الإطلاق اليوم. إن tty في لينكس اليوم معقد جدًا جدًا ولا يعتمد على بنية x86 التي تحتوي على مجموعة شاشة تحت تصرفها. بالإضافة إلى ذلك ، يعتمد الكثير من الكود في لغة C على البنية ، عندما يكون الحل المثالي هو عمل كود معماري في المجمع وأن كود C يعمل على أي معالج. ومع ذلك ، أنا لا أنقص من المؤلف ، لأن النواة تكتسب الخصائص التي نعتبرها اليوم طبيعية في نواة لينكس ، على سبيل المثال ، إنها ليست مهمة سهلة ، وكن مطمئنًا أن شخصًا واحدًا غير قادر تمامًا على القيام بذلك. بالنسبة لشيء ما ، فإن المشاريع الكبيرة مثل Linux و gcc و glibc وما إلى ذلك ، لا يقوم بها شخص واحد ولكن هناك العديد من المتعاونين.

      أيضًا ، إذا كنت ترغب في بدء البرمجة ، فلديك عدد غير قليل من الأدلة على الويب ، على الرغم من أنه عليك توخي الحذر واختيار الأدلة الجيدة. بدأت البرمجة بلغة لينكس قفزت إلى المسبح برأسي وبدون ماء (أي بلغة سي المحبوبة) ، على الرغم من أن لدي الآن بعض المفاهيم الأساسية للبيثون (وهي أيضًا لغة جيدة جدًا). هناك بعض كتب C التي تتخلى فيها في الصفحة 6 عن قدر الصداع الذي تحصل عليه ، ولكن أكثر من الكتب يتم اكتساب هذه الأشياء من التجربة. يحدث كما هو الحال مع نموذج شبكة OSI. من المستحيل تمامًا فهم التوثيق الخاص بنموذج osi للوافد الجديد ، ولكن إذا وجدت موقعًا يحتوي على شرح جيد لطبقات الشبكة ، فستحصل بسرعة على مفاهيم التعامل مع المستندات الفنية مثل RFCs.

      باختصار ، هناك مواقع وأدلة جيدة ، إنها مسألة الوصول إليها وإيجاد مواد جيدة.

      تحياتي

  7.   حرية قال

    مرحبًا ، بعد كل محاولات حل "الخطأ: لم يتم العثور على رأس متعدد التمهيد". و «خطأ تحتاج إلى تحميل النواة أولاً» ، حيث لم أجد في أي مكان الحل لمشكلة المقالة الأولى التي كان لدى البعض مثلي ... ها هو الحل ، إذا كان يعمل مع شخص ما ...

    لا أعرف ما إذا كانت نظريتي حول سبب الخطأ صحيحة ولكن على أي حال ، فإن السؤال هو أنه عند تجميع الملفات في نظام تشغيل 32 بت ، لم ينتج عنه الخطأ ، ولكن لأن لديّ 64 بت التشغيل نظام (Gnu / Linux Debian 7) ، وأنه عند التجميع والاختبار حصلت على الخطأ "لم يتم العثور على رأس متعدد التمهيد" ، وهناك شك ، في رأيي أن الخطأ يرجع إلى بيئة أو بنية نظام التشغيل الذي نقوم فيه بتجميع ملفاتنا ... وما فعلته هو تجميع ملفاتي ، وتحديد البيئة أو بنية 32 بت ..
    * Sudo as -o kernel.o -c kernel.asm -32
    * sudo مجلس التعاون الخليجي -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding
    الغريب أن لدي بعض الشكوك هاهاها ، فإن نظام التشغيل الذي نقوم بإنشائه خطوة بخطوة هو لمعمارية x86 أو هل أنا مخطئ في عجاج….

    ملاحظة: شخص ما يساعدني في الشك ، ويعذر بعض الأخطاء الإملائية أو تعبيري السيئ ، حسنًا ، أنا لست مثاليًا ، لذا «للكمال سعره» ... والأهم من ذلك ، محاكاة نظام تشغيل 32 بت ، حل مقدس … .ها ها ها ها

    1.    مارتن فيلالبا قال

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

  8.   أوسكار قال

    مبروك انها مساهمة ممتازة. من الآن فصاعدًا أشارككم في توسيع نطاق عملكم الجيد من خلالي والآخرين ؛

    تحياتي