أجهزة محاكاة أنظمة الكمبيوتر: جهاز محاكاة النظام الأساسي الكامل المألوف ودورة ومسارات غير معروفة

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



صورة



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



محاكي نظام أساسي كامل ، أو "وحده في الميدان - ليس محاربًا"



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



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



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



صورة



في معظم الأحيان ، يتم تنفيذ محاكيات الأنظمة الأساسية الكاملة على مستوى تعليمات المعالج (ISA ، راجع المقالة السابقة). هذا يسمح لك بإنشاء المحاكي نفسه بشكل سريع نسبيًا وغير مكلف. مستوى ISA جيد أيضًا لأنه لا يزال ثابتًا إلى حد ما ، على عكس ، على سبيل المثال ، مستوى API / ABI ، والذي يتغير في كثير من الأحيان. بالإضافة إلى ذلك ، يتيح لك التنفيذ على مستوى التعليمات تشغيل ما يسمى بالبرنامج الثنائي غير المعدل ، أي تشغيل التعليمات البرمجية المترجمة بالفعل دون أي تغييرات ، تمامًا كما يتم استخدامها على أجهزة حقيقية. بمعنى آخر ، يمكنك إنشاء نسخة ("تفريغ") من محرك الأقراص الثابتة لديك ، وتحديدها كصورة لنموذج في جهاز محاكاة كامل المنصة ، وفويلا! - يتم تحميل نظام التشغيل والبرامج الأخرى في المحاكي دون أي إجراءات إضافية.



أداء محاكاة





صورة



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



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



تتمتع أكثر المحاكيات شيوعًا بمنصة كاملة في السوق ، مثل QEMU أو VirtualBox أو VmWare Workstation ، بأداء جيد. قد لا يكون ملحوظًا للمستخدم حتى أن العمل مستمر في المحاكي. ويرجع ذلك إلى ميزة المحاكاة الافتراضية الخاصة المطبقة في المعالجات وخوارزميات الترجمة الثنائية وأشياء أخرى مثيرة للاهتمام. هذا كله موضوع لمقال منفصل ، ولكن باختصار ، المحاكاة الافتراضية هي ميزة من أجهزة المعالجات الحديثة ، والتي تسمح لأجهزة المحاكاة بعدم محاكاة التعليمات ، ولكن لإرسالها للتنفيذ مباشرة إلى معالج حقيقي ، إذا كانت بنية المحاكي والمعالج متشابهة بالطبع. الترجمة الثنائية هي ترجمة رمز آلة الضيف إلى رمز المضيف والتنفيذ اللاحق على معالج حقيقي. ونتيجة لذلك ، تكون المحاكاة أبطأ قليلاً ، مرة كل 5-10 ،وعادة ما يعمل بنفس سرعة النظام الحقيقي. على الرغم من أن هذا يتأثر بالعديد من العوامل. على سبيل المثال ، إذا أردنا محاكاة نظام يحتوي على عدة عشرات من المعالجات ، فستنخفض السرعة فورًا بعشرات المرات. من ناحية أخرى ، تدعم المحاكيات مثل Simics في الإصدارات الحديثة الأجهزة المضيفة ذات المعالجات المتعددة وتوازي النوى المحاكية بشكل فعال مع نواة المعالج الحقيقي.تدعم أجهزة المحاكاة مثل Simics في أحدث الإصدارات الأجهزة المضيفة ذات المعالجات المتعددة وتوازي النوى المحاكية بشكل فعال مع النوى الحقيقية للمعالج.تدعم أجهزة المحاكاة مثل Simics في أحدث الإصدارات الأجهزة المضيفة ذات المعالجات المتعددة وتوازي النوى المحاكية بشكل فعال مع النوى الحقيقية للمعالج.



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



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



صورة



محاكاة على مدار الساعة



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



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



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



صورة



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



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



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



محاكاة قائمة على التتبع



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



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



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



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



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



All Articles