لم أكن أعرف كيف تعمل المعالجات ، لذلك كتبت محاكي برامج


قبل بضعة أشهر ، فوجئت فجأة بالاعتقاد بأن ليس لدي أي فكرة عن مبادئ أجهزة الكمبيوتر. ما زلت لا أعرف كيف تعمل أجهزة الكمبيوتر الحديثة .

قرأت الكتاب "لكن كيف يعرف؟" كلارك سكوت مع وصف مفصل لجهاز كمبيوتر بسيط 8 بت: بدءا من البوابات المنطقية ، ذاكرة الوصول العشوائي ، الترانزستورات المعالج ، وتنتهي مع جهاز المنطق الحسابي وعمليات الإدخال والإخراج. وأردت تنفيذ كل هذا في الكود.

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

يمكن العثور على نتيجة عملي في مستودع الكمبيوتر البسيط: آلة حاسبة بسيطة. انه بسيط ويحسب.






برامج العينة

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

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

حتى أنني كتبت مجمعا فظا فتح عيني على أشياء كثيرة ، على أقل تقدير. هو ليس مثالي. في الواقع ، حتى أنه مجنون بعض الشيء ، لكنه أظهر لي مشاكل أن الآخرين قد حلوا بالفعل الكثير ، منذ سنوات عديدة.

ولكن لماذا تفعل هذا؟


"يبلغ من العمر 13 عامًا بناء معالجات في Minecraft. اتصل بي عندما يمكنك إنشاء وحدة المعالجة المركزية الحقيقية من مرحلات التلغراف ".

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

أريد أن أفهم بشكل أفضل كيف يعمل كل شيء ، لأنني لا أعرف ، على سبيل المثال ، ما هي ذاكرة التخزين المؤقت وخطوط الأنابيب L1 / L2 ، ولست متأكدًا تمامًا من أنني أفهم المقالات حول نقاط الضعف Meltdown و Specter. قال أحدهم إنه يقوم بتحسين الشفرة بطريقة تستخدم ذاكرة التخزين المؤقت للمعالج ، لكنني لا أعرف كيفية التحقق منها ، باستثناء أخذ كلمة. لست متأكدًا تمامًا ماذا تعني جميع تعليمات x86. لا أفهم كيف يقوم الأشخاص بإرسال المهام إلى وحدات معالجة الرسومات أو وحدات معالجة البيانات. وبشكل عام ، ما هو TPU؟ لا أعرف كيفية استخدام تعليمات SIMD.

كل هذا مبني على أساس يحتاج إلى التعلم أولاً. هذا يعني العودة إلى الأساسيات والقيام بشيء بسيط. يصف كتاب كلارك سكوت المذكور آنفا جهاز كمبيوتر بسيط. هذا هو السبب في أنني بدأت معها.

المجد لسكوت! هو يعمل!


كمبيوتر Scott هو معالج 8 بت متصل بـ 256 بايت من ذاكرة الوصول العشوائي ، وكلها متصلة عبر ناقل نظام 8 بت. لديها 4 سجلات للأغراض العامة و 17 تعليمات الجهاز . قام شخص ما بمحاكاة مرئية للويب : إنه أمر رائع حقًا. إنه لأمر مخيف أن نفكر كم من الوقت استغرق لتتبع جميع حالات الدائرة!


الدائرة مع جميع مكونات المعالج سكوت. حقوق الطبع والنشر 2009-2016. سيبرت فيلبنجر وجون كلارك سكوت

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

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

عملية التطوير الخاصة بي


بشكل عام ، تم التطوير وفقًا لهذا المخطط: قراءة النص ، دراسة المخططات ، ثم محاولة تنفيذها بلغة برمجة للأغراض العامة وبالتأكيد لا تستخدم أي أدوات متخصصة لتصميم الدوائر المتكاملة. كتبت المحاكي على Go ببساطة لأنني معتاد قليلاً على هذه اللغة. قد يقول المشككون: "أخرس! لا يمكن أن تتعلم VHDL أو Verilog ، أو LogSim ، أو أي شيء آخر. لكن بحلول ذلك الوقت كنت قد كتبت بالفعل بتات بلدي ، بايتات وبوابات المنطق وانخفضت عميقة جدا. ربما في المرة القادمة سوف أتعلم هذه اللغات وأفهم مقدار الوقت الذي أضيعه ، لكن هذه هي مشاكلي.

في دائرة كبيرة ، يتم نقل مجموعة من القيم المنطقية ببساطة في الكمبيوتر ، لذلك فإن أي لغة صديقة لجبر Boolean مناسبة.

يساعدنا تطبيق مخطط على هذه القيم المنطقية (المبرمجين) على استنباط المعنى ، والأهم من ذلك ، تحديد ترتيب البايتات التي سيستخدمها النظام ، والتأكد من أن جميع المكونات تنقل البيانات على الناقل بالترتيب الصحيح.

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

لم تتطور التنمية بسرعة: ربما استغرق الأمر حوالي شهر أو شهرين من وقت فراغي. ولكن عندما اكتمل المعالج بنجاح العملية 2+2=5، كنت في الجنة السابعة مع السعادة.

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

المحيط


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


كيف تتصل محولات الإدخال / الإخراج بإطار GLFW

مع هذا الفصل ، اتضح أنه من السهل جدًا توصيل لوحة المفاتيح وعرضها بنافذة تشغل GLFW. في الواقع ، لقد سحبت معظم الشفرة من المحاكي وعدّلتها قليلاً لجعل قنوات Go تعمل كإشارات I / O.

نبدأ الكمبيوتر




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

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

قررت أن أقضي وقتًا في CALL واحدة مزيفة لاستدعاء دالة ثم العودة إلى النقطة. بدون ذلك ، تتوفر المكالمات مستوى واحد فقط في العمق.

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

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

لم يكن الأمر سهلاً. الجزء الأصعب من برنامج الكاتب النصي هو معرفة الوقت المناسب للانتقال إلى سطر جديد أو ما يحدث عندما تضغط على Enter.

 main-getInput: CALL ROUTINE-io-pollKeyboard CALL ROUTINE-io-drawFontCharacter JMP main-getInput 
الدورة الرئيسية لبرنامج كتابة النص

لم أكن مضطرا لتطبيق مفتاح Backspace ومفاتيح التعديل. لكنني أدركت مقدار العمل الذي يتطلبه تطوير برامج تحرير النصوص ومدى إجهاده.

النتائج


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

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

  • كيف تتحرك البتات عبر الحافلة بين جميع المكونات.
  • كيف تعمل ALU البسيطة ؟
  • كيف تبدو حلقة Fetch-Decode-Execute البسيطة .
  • أن الجهاز دون تسجيل مؤشر مكدس ومفهوم المكدس - تمتص.
  • هذه السيارة دون انقطاع تمتص أيضا.
  • ما هو المجمع وماذا يفعل؟
  • كيف تتفاعل الأجهزة الطرفية مع معالج بسيط.
  • كيف تعمل الخطوط البسيطة وكيفية عرضها على الشاشة.
  • كيف يبدو نظام التشغيل البسيط .

إذن ماذا بعد؟ يقول الكتاب أن لا أحد أنتج أجهزة الكمبيوتر هذه منذ عام 1952. هذا يعني أنه يجب علي دراسة المواد على مدار الـ 67 عامًا الماضية. سوف يستغرق مني بعض الوقت. أستطيع أن أرى أن دليل x86 يبلغ طوله 4800 صفحة يكفي لقراءة ممتعة وسهلة قبل وقت النوم.

ربما سأكون مدللاً قليلاً على نظام التشغيل واللغة C ، وسأقتل المساء باستخدام طقم بناء PiDP-11 ومكواة لحام ، ثم أترك هذا الشيء. لا أعرف ، سنرى.

على محمل الجد ، أفكر في استكشاف بنية RISC ، وربما RISC-V. من الأفضل أن نبدأ بمعالجات RISC المبكرة لفهم أصلها. تحتوي المعالجات الحديثة على ميزات أكثر بكثير: ذاكرة التخزين المؤقت والمزيد ، أريد أن أفهمها. هناك الكثير لنتعلمه.

هل ستكون هذه المعرفة مفيدة لعملي الرئيسي؟ ربما مفيدة ، على الرغم من غير المرجح. في أي حال ، أنا أحب ذلك ، لذلك لا يهم. شكرا للقراءة!

Source: https://habr.com/ru/post/ar453158/


All Articles