
قد يكون أولئك الذين يتابعون مشروعنا قد لاحظوا ظهور مجلد e2k في الدليل مع البنى ، والذي يحتوي على دعم للمعالجات المحلية ذات
بنية Elbrus . لن تكتمل
سلسلة من المقالات حول نقل
Embox إلى الأنظمة الأساسية المحلية بدون قصة عن هذه البنية.
سأدلي ببعض التعليقات على محتويات المقالة. أولاً ، عملية إتقان هذه الهندسة من قبلنا هي في المرحلة الأولية ، وتمكنا من إطلاق Embox على هذا النظام الأساسي ، لكننا لم ننفذ بعد العديد من الأجزاء الضرورية ، والتي سيتم مناقشتها في المنشورات المستقبلية. ثانيا ، هذه العمارة معقدة ، و
يتطلب الوصف التفصيلي نصًا أكثر بكثير مما يسمح به التنسيق
مقال واحد. لذلك ، نقترح أخذ هذه المقالة كمقدمة ،
تحتوي على الحد الأدنى من المعلومات التقنية حول العمارة نفسها.
دعنا نبدأ.
كائن البحث - تخطيط النظام المضمن في Elbrus
نظرًا لأننا منخرطون في Embox (وإذا لم يكن أي شخص على دراية ، فإنه يركز على الأنظمة المضمنة) ، فقد كنا مهتمين في المقام الأول بخيار وضع MTsST نفسه ، بما في ذلك للأنظمة المضمنة. بالانتقال إلى MCST ، اكتشفنا أن الشركة مهتمة باستخدام معالجاتها للأنظمة المدمجة. واحدة من أحدث الحلول لهذا القطاع هي
لوحة E4C-COM . في عملية التواصل مع MCST ، أصبح من الواضح أنه من أجل نقل البنية وإتقانها ، يمكنك استخدام أي من الأجهزة المتاحة ، وتم إعطاؤنا جهاز كمبيوتر يسمى
مزاج للاستخدام المؤقت. بشكل عام ، الكوب الأحادي ليس تمامًا كما اعتدنا عليه في الأنظمة المضمنة. عادة ، تستخدم الأنظمة المضمنة أجهزة كمبيوتر أحادية اللوحة ، رقاقة - نظام على شريحة أو حتى متحكم دقيق ، لكن monocube هو كمبيوتر كامل ، ولكن نظرًا لأنه تم اختباره في "المناخ والميكانيكا" ، فإنه لا يزال يمكن اعتباره نظامًا مضمنًا.
مترجم ، بناء ، تعبئة الصورة
بعد استلام وحدة النظام ، نشأ السؤال بشكل طبيعي - كيف تملأ الصورة. يستخدم MCST BIOS الخاص به (محمل تمهيد نظام المستوى الأول). بشكل افتراضي ، يتم تثبيت Elbrus OS (أي Debian مع التعديلات). نحن مهتمون بإطلاق صورتنا الخاصة. لحسن الحظ ، يمكن لمحمل MTST تشغيل الصور عبر الشبكة. للقيام بذلك ، استخدم
ATA عبر بروتوكول Ethernet .
بعد أن تم مساعدتنا في إنشاء منصة وإطلاق صورة خارجية عبر الشبكة ، بدأنا في تطوير صورتنا الخاصة. للقيام بذلك ، كنا بحاجة إلى مترجم. لم نجد المترجم في المجال العام ، ولكن منذ أن وقعنا على اتفاقية عدم الإفشاء ، حصلنا على ثنائيات لينكس. تبين أن المترجم متوافق تمامًا مع دول مجلس التعاون الخليجي ، ولم نضطر إلى تغيير أي شيء ، بالطبع ، باستثناء علامات التجميع ، التي وضعناها في ملف تكوين منفصل. وهو أمر يمكن التنبؤ به للغاية ، لأن لينكس ، وإن كان مع تعديلات ، يتم تجميعه بواسطة هذا المترجم.
زوجان من الأسئلة التقنية
يعرف المشاركون في أنشطة معينة مثل نقل نظام التشغيل إلى نظام أساسي أن أول ما يجب فعله هو وضع رمز البرنامج بشكل صحيح في الذاكرة. أي كتابة نص رابط (lds) وتنفيذ رمز البدء. لقد توصلنا بسرعة إلى نص الرابط ، ولكن عند تنفيذ رمز البدء ، واجهنا السحر الأول ، الذي لم نفهمه تمامًا. والحقيقة هي أن Elbrus لديها وضع التوافق مع x86 وعند 0x00FF0000 هناك رمز سأعطيه رابطًا ببساطة ، حيث استعارناه من مثال MCST. يحتوي البرنامج النصي رابط
.bootinfo : { _bootinfo_start = .; *(.x86_boot) . = _bootinfo_start + 0x10000; _bootinfo_end = .; } SECTION_REGION(bootinfo) .text : { _start = .; *(.e2k_entry);
لم يتم كتابة رمز البدء نفسه في المجمع ، ولكن ببساطة في
C. يتم وضعه في القسم الموجود عند 0x01000000 ، والذي يتوافق ، بالمناسبة ، مع عنوان البدء لأجهزة x86 العادية - يوجد رأس
متعدد أنظمة التشغيل أو رأس آخر في هذا العنوان.
من أجل التأكد من صحة رمز البدء والعناوين ، تحتاج إلى الحصول على بعض الإخراج. إذا تمكنت من طباعة أي حرف ، فعلى الأرجح لن تكون هناك مشاكل في إخراج السلاسل. باستخدام هذا الإخراج ، سيكون من الممكن بالفعل استخدام printf المألوف () لتصحيح الأخطاء. بالإضافة إلى ذلك ، توفر معظم الأنظمة الأساسية القدرة على إخراج الأحرف عن طريق إدخال إدخال بسيط في سجل معين (نظرًا لأن من المرجح أن يكون برنامج bootloader قد قام بتكوين UART حسب الحاجة).
يستخدم جهاز الكمبيوتر الخاص بنا جهاز تحكم المنفذ التسلسلي am85c30 (المعروف أيضًا باسم
z85c30 اكتشفنا بسرعة كافية كيفية طباعة حرف واحد ، وهذا يكفي لعمل printf. واجهنا على الفور مشكلة غريبة - يبدو أن بعض الأحرف التي طبعتها printf مكررة ، ولكن اختلطت في بعض الأحيان. على سبيل المثال ، عندما حاولت إخراج Hello ، world! اتضح شيء مثل Hhelellloo ، woworrlldd. الآن يبدو من الواضح أن الأمر متعدد النواة ، ولكن في البداية قمنا بالبحث في السائق نفسه. في monocub لدينا Elbrus-2C ثنائي النواة + (1891VM7YA) ( أربعة نوى DSP لا تحسب) ويقوم محمل الإقلاع بتنشيط جميع نوى المعالج ، ونتيجة لذلك ، حتى لا يتم العبث مع multicore (SMP) ، يتم إرسال جميع النوى باستثناء الأولى إلى حلقة لا نهائية. للقيام بذلك ، قدمنا متغيرًا لرقم المعالج وزيادته باستخدام الإضافة الذرية تستمر النواة الصفرية في العمل ، بينما تدور نواة أخرى.
cpuid = __e2k_atomic32_add(1, &last_cpuid); if (cpuid > 1) { while(1); } memcpy((void*)0, &_t_entry, 0x1800); kernel_start();
استدعاء kernel_start () بالفعل نقل عنصر تحكم إلى التعليمات البرمجية الخاصة بنا.
كما اقترضنا إضافة ذرية ، فبالنسبة لنا يبدو السحر. ولكن ، كما تعلم ، يعمل - لا تلمس!
#define WMB_AFTER_ATOMIC ".word 0x00008001\n" \ ".word 0x30000084\n" #define __e2k_atomic32_add(__val, __addr) \ ({ \ int __rval; \ asm volatile ("\n1:" \ "\n\tldw,0 %[addr], %[rval], mas=0x7" \ "\n\tadds %[rval], %[val], %[rval]" \ "\n\t{"\ "\n\tstw,2 %[addr], %[rval], mas=0x2" \ "\n\tibranch 1b ? %%MLOCK" \ "\n\t}" \ WMB_AFTER_ATOMIC \ : [rval] "=&r" (__rval), [addr] "+m" (*(__addr)) \ : [val] "ir" (__val) \ : "memory"); \ __rval; \ })
سحر آخر اضطررت إلى استعارته هو بعض الرموز المطلوبة لجميع النوى. وهي
static inline void e2k_wait_all(void) { _Pragma ("no_asm_inline") asm volatile ("wait \ttrap = %0, ma_c = %1, fl_c = %2, ld_c = %3, " "st_c = %4, all_e = %5, all_c = %6" : : "i" (0), "i" (1), "i" (1), "i" (0), "i" (0), "i" (1), "i" (1) : "memory"); }
ونتيجة لذلك ، بعد كتابة رمز بدء التشغيل ، لم نحصل فقط على الرسائل المعروضة باستخدام printk ، ولكن بدأنا أيضًا في تحميل الوحدات النمطية ، والتي لا تعد تافهة جدًا بالنسبة للمجمعين العاديين. لذا مرة أخرى ، ألاحظ أن توافق الوقت مع دول مجلس التعاون الخليجي كان مسرورًا للغاية.
عادة ما تكون الخطوة التالية هي بدء تشغيل جهاز تحكم المقاطعة وجهاز ضبط الوقت ، ولكن التفكير في أنه سيتعين علينا تطبيق ليس فقط دعم هذه الأجهزة ، ولكن أيضًا الكود المعماري لمعالجات المقاطعة ، قررنا أنه يمكننا البدء من المحيط. يحتوي monocub على ناقل PCIe ، بالنسبة للمبرمجين ، يبدو مثل PCI العادي. كنا مهتمين في المقام الأول بجهازين: وحدة تحكم عرض ووحدة تحكم شبكة.
يستخدم monocube وحدة تحكم رسومية من سلسلة
sm750 . هذا هو وحدة تحكم الرسومات للتطبيقات المضمنة ، لديه دعم مدمج للرسومات ثنائية الأبعاد. يتم لحام الشريحة مباشرة إلى اللوحة الأم ، كما أفهمها. يمكن العثور على مصادر برنامج التشغيل لنظام التشغيل Linux
هنا .
بعد العثور على السائق ، يبدو أن مشاكلنا انتهت ، ولم يتبق سوى تنفيذ وحدة التحكم لـ PCI. بتعبير أدق ، عمليات القراءة / الكتابة لمساحة تكوين PCI لمعرفة المعلمات. وكان لا بد من استعارة تنفيذ هذه المهام مرة أخرى. ونتيجة لذلك ، وصلت قراءة السجلات إلى وحدات الماكرو مثل
#define _E2K_READ_MAS(addr, mas, type, size_letter, chan_letter) \ ({ \ register type res; \ asm volatile ("ld" #size_letter "," #chan_letter " \t0x0, [%1] %2, %0" \ : "=r" (res) \ : "r" ((__e2k_ptr_t) (addr)), \ "i" (mas)); \ res; \ }) #define _E2K_WRITE_MAS(addr, val, mas, type, size_letter, chan_letter) \ ({ \ asm volatile ("st" #size_letter "," #chan_letter " \t0x0, [%0] %2, %1" \ : \ : "r" ((__e2k_ptr_t) (addr)), \ "r" ((type) (val)), \ "i" (mas) \ : "memory"); \ })
هناك بعض الفهم لما يحدث. يحتوي Elbrus على العديد من مساحات العناوين البديلة ، على سبيل المثال ، في
بنية SPARC . يتم تحديد الهوية باستخدام معرف مساحة العنوان. أي أن الأمر ld نفسه يصل إلى عناوين داخلية مختلفة ، كما أنه يولد عمليات قراءة بأطوال مختلفة (8 ، 16 ، 32 ، 64 بت). إذا كان هذا الأمر في SPARC أمرًا منفصلًا عن lda / sta ، ففي Elbrus نظرًا للمعلمات ، فهذا هو الأمر ld.
تم استعارة
نوافذ التسجيل من بنية SPARC. سأؤجل قصة أكثر تفصيلاً للمقالات اللاحقة.
ونتيجة لذلك ، تحول كل شيء مع PCI. تمكنا من الحصول على جميع البيانات اللازمة ، ونقل برنامج تشغيل الرسومات إلى أنفسنا ، ولكن بعد ذلك واجهنا المشكلة التالية. لرسم صورة في ذاكرة الفيديو ، كان عليك أن تكتب مرتين. كل شيء يشير إلى ذاكرة التخزين المؤقت. من أجل حل هذه المشكلة ، كان من الضروري التعامل مع MMU ، وهذا ، كما يقولون ، لا يمكن حله مع condachka ، حيث ، من حيث المبدأ ، العديد من المشاكل الأخرى التي واجهناها وسوف نواجهها أكثر من مرة أثناء تطوير هذه الهندسة المعمارية.
لقد تقدمنا في اتجاهات أخرى: المقاطعات ومكالمات النظام ، ولكننا سنتحدث أيضًا عن هذا في المقالات التالية من هذه الأقسام الفرعية. في نهاية هذه المقالة ، سأقوم ببساطة بإحضار الإخراج إلى وحدة التحكم (عبر المنفذ التسلسلي).

الاستنتاجات
كما قلت في المقدمة ، لا أريد التركيز بشكل أساسي على التفاصيل الفنية ، ولكن على المشاعر العامة. لذا ، فإن المشاعر متناقضة ، على الرغم من أنها بالتأكيد أكثر إيجابية. من ناحية ، يوجد المعالج ومثير للاهتمام للغاية من حيث الميزات المعمارية. بناءً على هذا المعالج ، يتم إنتاج أنظمة الكمبيوتر ، وهناك برنامج بجودة عالية إلى حد ما. كما قلت ، لم تكن هناك شكاوى حول المترجم (حتى نقطة معينة ، والتي سأصفها بعد ذلك بقليل) ، هناك لينكس كامل (نظام التشغيل "Elbrus"). لقد رأيت شخصيا كيف أن المطور قام بإنشاء ICST نفسه على سطح المكتب باستخدام بنية Elbrus.
ولكن من ناحية أخرى ، لا أفهم لماذا يحاولون بمثل هذا المثابرة إجراء استبدال عادي لـ Intel x86 من هذا المعالج. في الواقع ، في أي مكان في العالم يستخدمون المعالجات بناءً على بنية
VLIW كجهاز كمبيوتر شخصي عالمي. VLIW ، بسبب ميزاته المعمارية ، هي عبارة عن "محطم رقم" رائع ، يجعلون DSP عليه ، يصنعون خوادم itanium ، يصنعون بطاقات الرسوم. لا ، مع الحفار ، بالطبع ، يمكنك حفر حفرة لزراعة شجرة ، ولكن هل يستحق ذلك.
المشكلة الرئيسية التي تعوق تطوير العمارة ، في رأيي ، هي الطبيعة المغلقة للنظام البيئي بأكمله. نعم ، من أجل الحصول على وصف لنظام الأوامر ، ما عليك سوى التوقيع على اتفاقية عدم الإفشاء ، ولكن هذا لا يكفي. العمارة غير مألوفة ومعقدة للغاية. نعم ، اعتقدت دائمًا أنه يجب تطوير بعض البرامج الأساسية مباشرة من الشركة المصنعة للمعالج ، بشكل جيد ، أو بالتعاون الوثيق معه. وفقًا لهذا المبدأ ، يحتوي جهاز الكمبيوتر على Elbrus على حزمة برامج مع
نظام التشغيل Elbrus . ولكن لا يزال من السذاجة الاعتقاد بأن شركة واحدة ، حتى لو كانت كبيرة ، يمكنها تقديم دعم عالي الجودة لجميع المكونات: معالج ، مترجم ، أدوات تطوير وتصحيح ، برمجيات النظام (أنظمة تشغيل مختلفة) ، برنامج تطبيقي ، ... حتى إنتل لا تستطيع أن تفعل ذلك. يتجه العالم منذ فترة طويلة نحو ما يسمى التعاون أو التنمية المشتركة.
اسمحوا لي أن أقدم لكم مثالاً على مشكلة المترجم التي تعثرنا فيها. توقف برنامج تشغيل المنفذ التسلسلي في وقت ما عن عرض الأحرف ، وللوهلة الأولى ، لم يتغير شيء. اتضح أننا أزلنا وظيفة التصحيح غير المستخدمة ، التي أدرجناها من أجل فهم من خلال أداة التفكيك كيفية تمرير الوسيطات إلى الدالة في المجمع. أي ، إذا كانت الوظيفة موجودة ، فكل شيء على ما يرام ، إن لم يكن ، فسيختفي الناتج. في البداية ، أخطأوا من أجل المحاذاة ، ولكن اتضح أنه يمكن نقل الوظيفة إلى نهاية C-Schnick ، لذلك كانت جميع الشخصيات من السائق في نفس الأماكن كما كانت من قبل ، ولكن تم تكرار المشكلة. في حين أن هذه المشكلة لم يتم حلها ، فإننا نواصل التحقيق لإظهار مطوري المترجم من MCST أو لفهم أين ارتكبنا خطأ.
في رأيي ، كان من الممكن تجنب المشكلة المذكورة أعلاه إذا كان هناك المزيد من مستخدمي الطرف الثالث. كحد أدنى ، كانت ستظهر المشكلة في وقت سابق ، أو ، يمكن للمرء فقط جوجل ما فعلناه خطأ.
كما تدرك ICST مشكلة الإغلاق ، حيث أن عملية اكتشاف الأشياء غير المصنفة قد بدأت مع ذلك. على سبيل المثال ، رأيت Alt-Linux يعمل على العديد من أجهزة الكمبيوتر Elbrus في العديد من المؤتمرات. إليكم صور للعرض من أحد المؤتمرات هذا العام (آسف لرؤيتي سيئة ، كانت مظلمة). وصلنا أيضا مع التطور. نأمل أن نكون مفيدين لـ ICST ، لأنه ، كما اتضح ، لا يمكن دعم بعض النقاط البارزة في بنية Elbrus في Linux (أو أن التكاليف كبيرة جدًا) ، على سبيل المثال ، الذاكرة الموسومة.


نقطة مهمة أخرى عندما ناقشنا مشكلة الإغلاق مع مطوري MCST ، اعترضوا ، على سبيل المثال ، على أن مصادر نواة لينكس كانت مفتوحة لفترة طويلة ، لكننا نحن فقط ومطوري Dolomant طرحوا الأسئلة واستخدمناها بطريقة ما.
بالإضافة إلى ذلك ، وفقًا لمعلوماتي ، ستقوم MCST بتنظيم جناح
يمكن الوصول إليها عن بعد. حيث سيكون من الممكن تجميع البرامج وتشغيلها على جهاز كمبيوتر بهندسة Elbrus. إذا كان هناك اهتمام مماثل وتريد استخدام الحامل ، فيجب عليك الاتصال بي ، على سبيل المثال ، لي: وصف كيف يتم التخطيط لاستخدامه ، والوقت المستغرق وما إلى ذلك ، لأنه للمشاركة مع تغيير البرنامج ، تحتاج إلى تنظيم جدول زمني. سوف أقوم بنقل البيانات إلى ICST أو سأقوم بتوصيل أولئك الذين يرغبون مع المنظمين.
روابط مفيدة:
العنوان البريدي للمستخدمين هو المستخدم [على] mcst.ru
وصف موجز لهندسة Elbrusمصادر Emboxملاحظة:
سنعرض كل من يريد ما حصلنا عليه في مهرجان
TechTrain لتكنولوجيا المعلومات
في 1-2 سبتمبر.