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

كيف كان ذلك
كانت لدي رغبة كبيرة منذ وقت طويل ، عندما بدأت منذ 20 عامًا في المشاركة في أول مشاريعي. بالنسبة للجزء الأكبر ، كانت هذه البحوث العلمية ، والنمذجة الرياضية في إطار أوراق المصطلحات والمقالات العلمية. كانت هذه أيام باسكال ودلفي. ومع ذلك ، حتى ذلك الحين ، جذبت هاسكل والبرمجة الوظيفية اهتمامي. بمرور الوقت ، تغيرت لغات المشاريع والتقنيات التي شاركت فيها. ولكن منذ ذلك الحين ، أصبح الاهتمام بلغات البرمجة الوظيفية خيطًا مشتركًا ، وأصبحت: Haskell و Idris و Agda. في الآونة الأخيرة ، ومع ذلك ، كانت مشاريعي في الصدأ. قادني الانغماس الأعمق في Rust إلى دراسة الأجهزة المدمجة.
من الصدأ إلى المضمنة
إن قدرات Rust واسعة للغاية ، والمجتمع نشط للغاية حتى أن التطوير المضمن بدأ يدعم مجموعة واسعة من الأجهزة. وكانت هذه أول خطوة لي في فهم المستوى الأدنى للمعالجات.
وكان أول مجلس بلدي: STM32F407VET6 . لقد كان غمرًا في عالم المتحكمات الدقيقة ، التي كنت بعيدًا عنها في ذلك الوقت ، وفهمت ما يكفي تقريبًا كيف تم إنجاز العمل على مستوى منخفض.
تدريجيا ، تمت إضافة لوحات esp32 و ATmega328 (ممثلة في مجلس إدارة Ukraino UNO ) هنا تحول الغمر في stm32 إلى أن يكون مؤلما للغاية - المعلومات وفيرة وغالبا ما لا أحتاجه. واتضح أن تطوير ، على سبيل المثال ، على Assembler هي مهمة روتينية وغير مجحفة ، مع مجموعة فرعية من أكثر من 1000 تعليمات. ومع ذلك ، تعاملت مع هذا الصدأ بمرح ، رغم أنه في بعض الأحيان كانت هناك صعوبات في التكامل مع مجالس صينية معينة.
تحولت بنية AVR إلى أنها أكثر بساطة وشفافية. أعطتني الكتيبات الوفيرة فهماً كافياً لكيفية العمل مع مجموعة محدودة من التعليمات إلى حد ما ، ومع ذلك أكون قادرًا على إيجاد حلول مثيرة للاهتمام. ومع ذلك ، فإن مسار اردوينو لم يرضي على الإطلاق ، ولكن تبين أن الكتابة في Asm / C / Rust كانت أكثر إثارة للاهتمام.
أين هو RISC-V؟
وفي تلك اللحظة ، يطرح سؤال منطقي - أين وحدة المعالجة المركزية RISC-V ؟
إنها الطبيعة البسيطة ل AVR وتوثيقها الكافي الذي أعادني إلى حلمي السابق لمعرفة كيف يعمل المعالج. بحلول هذا الوقت ، كان لدي لوحة FPGA والتطبيقات الأولى له في شكل تفاعل مع أجهزة VGA ، إخراج الرسومات ، التفاعل مع الأجهزة الطرفية.
كانت الكتب دليلي على بنية المعالج:
- جون ل. هينيسي وديفيد أ. باترسون - هندسة الكمبيوتر: منهج كمي (سلسلة مورغان كوفمان في هندسة وتصميم الكمبيوتر)
- John L. Hennessy و David A. Patterson - تنظيم الكمبيوتر وتصميمه. واجهة الأجهزة / البرمجيات: الإصدار RISC-V
- David M. Harris and Sarah L. Harris - الدارات الرقمية وهندسة الكمبيوتر
- دليل مجموعة التعليمات RISC-V
لماذا هو ضروري
يبدو - كل شيء قد تم بالفعل كتابة وتنفيذها لفترة طويلة.
تطبيقات مختلفة في HDL ، ولغات البرمجة. بالمناسبة ، تطبيق مثير للاهتمام لـ RISC-V على Rust .
ومع ذلك ، ما يمكن أن يكون أكثر إثارة للاهتمام من معرفة ذلك بنفسك وخلق الخاصة بك. الدراجة الخاصة بك؟ أو المساهمة في بناء الدراجة ؟ بالإضافة إلى الاهتمام الشخصي العميق ، كان لديّ فكرة - كيف أحاول الترويج لها. والعثور على النموذج الخاص بك ، نهجكم. وهذا يعني تقديم وثائق RISC-V ISA الممل إلى حد ما في شكل مواصفات رسمية في شكل مختلف. ويبدو لي أن طريق إضفاء الطابع الرسمي بهذا المعنى مثير للغاية.
ما المقصود بإضفاء الطابع الرسمي؟ مفهوم واسع إلى حد ما. تمثيل مجموعة بيانات محددة في شكل رسمي. في هذه الحالة ، من خلال وصف الهياكل والوصف الوظيفي. وبهذا المعنى ، فإن لغات البرمجة الوظيفية لها سحرها الخاص. أيضًا ، تتمثل المهمة في أن الشخص الذي لا ينغمس في البرمجة يمكنه قراءة الكود كمواصفات ، إذا كان ذلك ممكنًا ، فيمكنك تقليل تفاصيل اللغة الموصوفة به.
نهج التصريح ، إذا جاز التعبير. هناك بيان ، لكن كيف يعمل بالضبط لم يعد ضروريًا. الشيء الرئيسي هو سهولة القراءة والوضوح وبالطبع. مراسلة البيانات الرسمية بالمعنى المضمن فيها.

المجموع - أنا فضولي حقًا في نقل اهتمامي للآخرين. هناك بعض الوهم بأن الاهتمام هو القوة الدافعة لاتخاذ الإجراءات. من خلالها تصبح الفردية وتتجلى. وهذا جزء من تحقيق الذات ، تجسيدًا للإبداع.
الطموح وقليلا من كلمات. ماذا بعد؟
التطبيقات الحالية
وهي موجودة ويتم تجميعها حاليًا بواسطة المشروع: التحقق الرسمي من RISC-V .
قائمة المواصفات الرسمية (بما في ذلك عملي): https://github.com/SymbioticEDA/riscv-formal/blob/master/docs/references.md
كما ترون - بالنسبة للجزء الأكبر من هذه هي إرشادات في لغة هاسكل. كانت هذه نقطة الانطلاق في اختيار لغة وظيفية مختلفة. وانخفض خياري على F # .
لماذا F#
لقد حدث أن عرفت عن F # لفترة طويلة ، لكن بطريقة ما في صخب الحياة اليومية لم تكن لديّ فرصة للتعرف على بعضنا البعض بشكل أفضل. عامل آخر كان منصة. NET . مع الأخذ في الاعتبار أنني تحت نظام Linux ، ولم أكن سعيدًا لفترة طويلة مع IDE ، وبدا أحاديًا بشكل كافٍ. والعودة إلى Windows فقط من أجل MS Visual Studio هي فكرة مشكوك فيها إلى حد ما.
ومع ذلك ، فإن الوقت لا يقف ساكنا ، والنجوم في السماء ليست في عجلة من أمرهم للتغيير. ولكن بحلول هذا الوقت ، كان Jetbrains Rider قد تطور إلى أداة كاملة ومريحة ، و .NET Core
for Linux لا يسبب الألم في لمحة.
كان السؤال - أي لغة وظيفية للاختيار. حقيقة أنه ينبغي أن يكون مجرد لغة وظيفية - في شكل مثير للشفقة إلى حد ما ، جادل أعلاه.
Haskell, Idris, Agda
؟ F#
- أنا لست على دراية به. مناسبة رائعة لتعلم ألوان جديدة من عالم اللغات الوظيفية.
نعم ، F#
ليست وظيفية بحتة. ولكن ما الذي يمنع التمسك بـ " النقاء "؟ ثم اتضح - أن وثائق F # مفصلة وكاملة تمامًا. قراءة ، وأود أن أقول حتى مثيرة للاهتمام.
ما هو F#
بالنسبة لي الآن؟ لغة مرنة إلى حد ما ، مع IDEs مريحة للغاية (رايدر ، Visual Studio). أنواع مطورة بالكامل (رغم أن Idris
بالطبع بعيد جدًا). وعموما حلوة جميلة من حيث سهولة القراءة. ومع ذلك ، كما اتضح فيما بعد ، يمكن لـ " غير نقاء " وظيفي أن يؤدي الكود إلى شكل مجنون تمامًا ، من حيث قابلية القراءة والمنطق. يوضح تحليل الحزم في Nuget هذا.
ميزة أخرى مثيرة للاهتمام وغامضة بالنسبة لي هي اكتشاف أنه لم يكن أحد مهتمًا بكتابة إضفاء الطابع الرسمي على RISC-V ISA في F # من قبل (رسميًا أو في شكل قابل للبحث). وهذا يعني أن لدي فرصة لإدخال دفق جديد في هذا المجتمع واللغة و " النظام البيئي ".
المزالق التي واجهتها
الجزء الأكثر صعوبة كان تنفيذ تدفق التنفيذ. اتضح غالبًا أنه لم يكن من الواضح تمامًا كيف يجب أن تعمل التعليمات. لسوء الحظ ، صديق موثوق به يمكن الاتصال به في الساعة 3 صباحًا وسؤاله بصوت متحمس BLTU
: "كما تعلمون ، من المحتمل أن يكون تعليم BLTU
هو signextend بشكل مختلف ..." - لا أعرف. وبهذا المعنى ، فإن وجود رفاق مؤهلين يساعدون بكلمة طيبة ونصيحة مؤهلة مناسبة أمر مرحب به للغاية.
ما هي الصعوبات والمآزق. سأحاول الأطروحة:
- ELF - كانت مهمة غريبة معرفة كيفية التعامل معها وقراءة الأقسام والتعليمات. على الأرجح هذه القصة في إطار المشروع الحالي لم تنته بعد.
- أدت الإرشادات غير الموقعة بشكل دوري إلى حدوث أخطاء اكتشفتها أثناء اختبار الوحدة
- تنفيذ العمل مع الذاكرة المطلوبة للتفكير في خوارزميات تكوين البايتات الجميلة والقابلة للقراءة.
- لم يكن هناك حزمة مناسبة للعمل مع البتات تحت
int32, int64
. استغرق الأمر بعض الوقت لكتابة حزمة بلدي واختباره.
هنا أود أن أشير إلى أن العمل مع وحدات البت في F # هو أكثر ملاءمة من Haskell مع Data.Bits - الدعم المناسب للبت التسجيل ، مع القدرة على دعم
x32
و x64
في نفس الوقت. عدم الاهتمام قادني لاستخدام int64
في بعض الأماكن. ساعدت اختبارات الوحدة في تحديد هذا. لكن الأمر استغرق بعض الوقت. - لم أجد حزمة CLI F # بسيطة وموجزة ومناسبة شخصياً بالنسبة لي شخصيًا. كان من الآثار الجانبية كتابة نسخة أضيق الحدود بأسلوب وظيفي.
- في الوقت الحالي ، يظل لغزًا كيفية تنفيذ تعليمات النظام بشكل صحيح: FENCE ، ECALL ، BREAK
- بعيدًا عن المجموعة الكاملة من الامتدادات (امتدادات ISA) من القائمة:
[A, M, C, F, D]
واضحة حاليًا. على وجه الخصوص ، لا يتم تنفيذ [F,D]
عن طريق soft float
. - في الوقت الحالي ، لا يوجد فهم واضح للتعليمات المميزة ، و User Mod ، والعمل مع الأجهزة الطرفية - للأسف. وهذه هي طريقة البحث والتجربة والخطأ.
- لا يوجد حزام أسود لكتابة برامج المجمع تحت RISC-V. ربما ستكون هذه حاجة في كثير من الأحيان ، بالنظر إلى عدد اللغات التي تم نقلها بالفعل للكتابة تحت RISC-V.
- كان عامل الوقت كبيرًا أيضًا - فهو صغير جدًا في دوامة العمل الأساسي والاحتياجات اليومية ومحيط الحياة المحيط به. وهناك الكثير من العمل ، ومعظمه ليس كثيرًا في " الترميز " - كتابة الكود نفسه ، ولكن في التعلم ، إتقان المواد.
كيف يعمل وما الميزات
الآن ربما الجزء الأكثر تقنية . ما هي الميزات في الوقت الراهن:
rv32i
مجموعة التعليمات rv32i
- القدرة على تشغيل البرنامج كمحاكي RISC-V - تنفيذ ملفات ELF.
- دعم سطر الأوامر (CLI) - اختيار البنية القابلة للتنفيذ ، مجموعة من التعليمات ، ملفات ELF القابلة للتنفيذ ، وضع التسجيل ، مساعدة سطر الأوامر.
- القدرة على عرض سجل الإرشادات القابلة للتنفيذ ، بالقرب من عرض
objdump
عند التفكيك. - القدرة على إجراء اختبارات تغطي مجموعة التعليمات الكاملة المنفذة.
ينقسم البرنامج إلى مثل هذه المراحل والدورات:
- قراءة سطر الأوامر
- قراءة التعليمات من ملف ELF
- قراءة تعليمات محددة وفقًا لعداد الكمبيوتر الحالي (عداد البرامج)
- تعليمات فك التشفير
- تنفيذ التعليمات
- في حالة المواقف غير المتوقعة ، يتم إعداد الفخاخ ، مما يسمح لك بإكمال عملية التنفيذ ، والإشارة إلى مشكلة ، وتوفير البيانات اللازمة
- إذا لم يكن البرنامج في حلقة لا نهائية - عرض حالة السجلات وإنهاء برنامج المحاكاة
ما هو مدرج في الخطط:
- 64i الأساسية (كاملة تقريبا)
- الامتداد القياسي M (عدد صحيح ضرب / قسمة)
- التمديد القياسي A (عمليات ذاكرة الذاكرة الذرية)
- ملحق قياسي C (تعليمات مضغوطة 16 بت)
- التمديد القياسي F (نقطة عائمة أحادية الدقة)
- الامتداد القياسي D (النقطة العائمة المزدوجة الدقة * مستوى الامتياز M (الجهاز)
- مستوى الامتياز U (مستخدم)
- مستوى الامتياز S (مشرف)
- مخططات الذاكرة الظاهرية SV32 و SV39 و SV48
- البرامج المضيفة
- GPIO - العمل مع الأجهزة الطرفية
كيفية الجري
من أجل تشغيل البرنامج ، يجب أن يكون لديك .NET Core
. إذا لم يكن مثبتًا لديك ، فعلى سبيل المثال ، تحت Ubuntu 16.04
ستحتاج إلى تشغيل مجموعة الأوامر التالية:
$ wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb $ sudo dpkg -i packages-microsoft-prod.deb $ sudo apt-get update $ sudo apt-get install apt-transport-https $ sudo apt-get update $ sudo apt-get install dotnet-sdk-3.0
للتحقق من تغير شيء ما في الحياة ، قم بتشغيل:
$ dotnet --version
وينبغي أن الحياة التألق بألوان جديدة!
الآن حاول الجري. للقيام بذلك ، قم بتخزين الشاي أو القهوة المفضلة لديك ، والشوكولاتة مع الكعك ، وتشغيل الموسيقى المفضلة لديك واتبع هذه المجموعة من الأوامر:
$ cd some/my/dev/dir $ git clone https://github.com/mrLSD/riscv-fs $ cd riscv-fs $ dotnet build $ dotnet run -- --help
وحدة التحكم الخاصة بك يجب أن تغمز في وجهك برسالة مساعدة.
الإطلاق هو:
$ dotnet run
في لهجة صارمة سيقول أن هناك حاجة المعلمات. لذلك ، قم بتشغيل:
$ dotnet run -- -A rv32i -v myapp.elf
هذه هي نفس اللحظة المحرجة عندما يتبين أننا لا نزال بحاجة إلى برنامج جاهز للتنفيذ من أجل RISC-V. وهناك شيء بالنسبة لي لمساعدتك. ومع ذلك ، سوف تحتاج إلى سلسلة أدوات GNU لـ RISC-V . دعه يتم تثبيته في الواجب المنزلي - وصف المستودع يصف بتفاصيل كافية كيفية القيام بذلك.
بعد ذلك ، للحصول على ملف ELF الخاص بالاختبار المطلوب ، نقوم بتنفيذ الإجراءات التالية:
$ cd Tests/asm/ $ make build32
إذا كان لديك مجموعة أدوات RISC-V ، فيجب أن يسير كل شيء بسلاسة. ويجب أن تظهر الملفات في الدليل:
$ ls Tests/asm/build/ add32 alu32 alui32 br32 j32 mem32 sys32 ui32
والآن بجرأة ، دون النظر إلى الوراء ، نحاول الأمر:
$ dotnet run -- -A rv32i -v Tests/asm/build/ui32
من المهم الإشارة إلى أن Tests/asm
ليس برنامج اختبار ، ولكن الغرض الرئيسي منه هو تعليمات الاختبار ورموزها الخاصة باختبارات الكتابة. لذلك ، إذا كنت تحب شيئًا أكبر وأكثر بطولية ، فإن تغيير العالم حسب رغبتك هو العثور على ملف ELF 32 بت قابل للتنفيذ بشكل مستقل يدعم تعليمات rv32i
فقط.
ومع ذلك ، سيتم تجديد مجموعة التعليمات والإضافات ، واكتساب الزخم وزيادة الوزن.
الملخص والروابط
اتضح أن السرد مثير للشفقة قليلا النكهة من التاريخ الشخصي. التقنية في بعض الأحيان ، وأحيانا ذاتية. ومع ذلك حماسة مع لمسة من الحماس.
من جهتي ، يهمني أن أسمع منك: المراجعات ، والانطباعات ، وكلمات فراق جيدة. وللأكثر جرأة - المساعدة في دعم المشروع.
هل أنت مهتم بهذا الشكل السردي وتريد المتابعة؟