يأتي هذا المشروع من المستودع 华中科技大学操作系统团队 / riscv-pke.
كما ترون في الفروع ، كل فرع يتوافق مع مستوى مع وصفه الموجز.

هذه ليست حزمة محلية قابلة للتشغيل ، لأنني لم أفعل أي أعمال تجميع فيها. ما عليك سوى اعتباره دفتر إجابات لنقاط التفتيش في تقييم Educoder عبر الإنترنت. إذا كنت ترغب في تشغيل هذا المشروع محليًا ، فيرجى القراءة والعثور على طريقك في Readme الرسمية .
سيتم عرض هذه المقدمة فقط في الفرع الافتراضي.
يمكن العثور على المستندات باللغة الصينية هنا. لا يزال هناك مستندات مخصصة باللغة الإنجليزية حتى الآن ، ولكن التعليقات الموجودة في رموزنا بالإضافة إلى أسماء الاستغناء عن الذات للمتغيرات والوظائف ستساعد في رحلتك من PKE.
PKE هو مشروع مفتوح المصدر (انظر الترخيص للحصول على معلومات الترخيص) للغرض التعليمي من دورات هندسة نظام التشغيل/نظام الكمبيوتر ، الممنوحة للطلاب الجامعيين الذين تخصصوا في CS (علوم الكمبيوتر) أو EECS (الهندسة الكهربائية وعلوم الكمبيوتر) في الجامعات.
يوفر PKE سلسلة من المختبرات التي تغطي نقاط المعرفة من جانب الهندسة لنظام التشغيل بالإضافة إلى بعض تنظيم/بنية الكمبيوتر ، بما في ذلك:
LAB1 (3 مختبرات أساسية+2 مختبرات تحدي): الفخاخ (SYSCALLS) ، والاستثناءات والمقاطعات (IRQs في مصطلحات Intel).
LAB2 (3 مختبرات أساسية+2 مختبرات تحدي): إدارة الذاكرة.
LAB3 (3 مختبرات أساسية+2 مختبرات تحدي): العمليات.
LAB4 (3 مختبرات أساسية): الجهاز والملف (أجريت على لوحة Pynq FPGA + سيارة لعبة Arduino).
قد تكون التجارب في الريبو مختلفة (مع المزيد من المختبرات الفعلية) من القائمة أعلاه مع مرور الوقت.
من زاوية التعليم في هندسة أنظمة التشغيل ، تختلف عن العديد من المشاريع التعليمية لشركة OS الشهيرة (مثل XV6 (JOS عند سابق) المستخدمة في MIT 6.828 و UCORE التي يتم تدريسها في جامعة Tsinghua) التي تستخدم kernels كاملة أو شبه مكتملة تحتوي على كل شيء مثل إدارة العمليات تقريبًا ، والعديد من الوحدات الأخرى ، لا يعتبر PKE كاملًا (في الواقع ، لا يعزز ذلك.
تم تصميم PKE حول فكرة kernel الوكيل (المقترح في PK ، وهو مشروع مفتوح المصدر لعلم البيئة البرمجيات RISC-V) ، والذي يؤكد على بناء kernel OS "فقط لا يكفي" لتطبيق معين. من خلال مثل هذه الفكرة ، نقوم بتصميم سلسلة من المختبرات في PKE التي "ترقية" تدريجياً على kernel من خلال تقديم مجموعة من التطبيقات ، من البسيط إلى المعقد. أثناء الترقيات ، يمكنك معرفة المزيد من الأفكار الأكثر تطوراً لأنظمة التشغيل الحديثة ، والأهم من ذلك ، اللعب معهم باتباع المختبرات ، واحدة تلو الأخرى.
في كل مختبر ، يبدأ PKE بتطبيق (يتم وضعه في مجلد ./user/ ، مع بادئة "APP_" و kernel غير مكتملة . أثناء المختبر ، تحتاج إلى 1) فهم التفاعل بين التطبيق و kernel OS بالوكالة (في بعض الأحيان ، أيضًا جهاز RISC-V المحاكاة باستخدام spike ، أو لوحة FPGA ذات جوهر RISC-V ناعم) ؛ 2) اتبع الرمز من التطبيق المحدد إلى kernel OS بناءً على الفهم ؛ 3) أكمل kernel الوكيل OS لجعل التطبيق (أو النظام) للتنفيذ بشكل صحيح وسلس.
في مختبرات PKE ، بذلنا قصارى جهدنا للتحكم في مقياس رمز كل مختبر وتقليله ، على أمل مساعدتك في التركيز على المكونات الرئيسية لنظام التشغيل ، وتقليل الجهود في نفس الوقت. اتصل بنا إذا كان لديك المزيد من الاقتراحات حول تقليل مقياس الكود ، شكرًا مقدمًا!
1. تثبيت نظام التشغيل (الجهاز الظاهري أو نظام Subversion Linux)
(مفضل) Ubuntu 16.04lts أو أعلى ، 64 بت
2. قم بتثبيت أدوات لبناء المتقاطع و emluator
$ sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex3. تثبيت RISC-V المتقاطع
$ export RISCV=/path-to-install-RISCV-toolchains
$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain.git
$ cd riscv-gnu-toolchain
$ ./configure --prefix= $RISCV
$ make -j $( nproc )
$ sudo make installفي الأوامر المذكورة أعلاه ، تعني $ (NPROC) عدد المواضيع التي تريد استدعاءها أثناء المبنى. generelly ، يجب أن تساوي $ (nproc) عدد النوى التي يمتلكها جهاز الكمبيوتر الخاص بك. بعد هذه الخطوة ، يجب أن تجد التنفيذيين ، مثل Riscv64-unknown-elf-GCC ، و riscv64-unknown-elf-gdb ، و riscv64-unknown-elf-objdump ، والعديد من الآخرين (مع بادئة اسم Riscv64-unknown-elf- ") في مسارك إلى الخسارة .
4. تثبيت المحاكي (سبايك)
$ sudo apt-get install device-tree-compiler
$ git clone https://github.com/riscv/riscv-isa-sim.git
$ cd riscv-isa-sim
$ mkdir build
$ cd build
$ ../configure --prefix= $RISCV
$ make -j $( nproc )
$ sudo make installبعد هذه الخطوة ، يجب أن تجد التنفيذيين مثل Spike و Spike-Dasm في دليل TOOLCHAINS /BIN من المسار /المسار .
5. استنساخ باي ريبو
$ git clone https://github.com/MrShawCode/riscv-pke.gitبعد هذه الخطوة ، سيكون لديك دليل PKE الذي يحتوي على مختبرات PKE.
6. بناء/تشغيل PKE
$ make [run]7. (اختياري) تثبيت OpenOCD لتصحيح الأخطاء
$ git clone https://github.com/riscv/riscv-openocd.git
$ cd openocd
$ ./bootstrap (when building from the git repository)
$ ./configure --prefix= $RISCV
$ make -j $( nproc )
$ sudo make install بعد تثبيت OpenOCD ، يمكنك تصحيح kernel pke. ببساطة استخدم الأمر التالي:
$ make gdbفي هذا المختبر ، سوف نتعلم الوصفات الأساسية للمصيدة (تسمى أيضًا Syscall في العديد من الكتب المدرسية).
يتم إصدار فخ (على سبيل المثال ، printf الموجود في استخدامنا اليومي) بشكل عام عن طريق تطبيق ، ويتم معالجته بشكل evetens بواسطة kernel. من المهم للغاية بالنسبة لنظام التشغيل توفير مثل هذه التسهيلات ، نظرًا لأن التطبيقات التي تعمل في أوضاع أقل امتيازًا (على سبيل المثال ، وضع المستخدم في RISC-V) تحتاج إلى إجراء عمليات قانونية بشكل متكرر مثل I/OS والتي تتطلب أن يتم إجراؤها في أوضاع ميزة أعلى (مثل ، أوضاع الماكينة أو الماكينة في RISC-V).
يقدم Lab1_1 تطبيقًا في "user/lab1_1_helloworld.c" ، الذي تستدعي وظيفة Main () وظيفة printu التي لها نفس الوظيفة مثل printf ، ولكن تحت اسم مختلف قليلاً. يتم تعريف printu في "user/do_print.c" ، ويحتج بالفعل الفخ بواسطة تعليمات eCall (انظر التجميعات المضمنة في وظيفة do_user_print ).
بنية lab1_1 مدرجة في ما يلي:
.
├── LICENSE.txt
├── Makefile
├── README.md
├── .spike.cfg
├── kernel
│ ├── config.h
│ ├── elf.c
│ ├── elf.h
│ ├── kernel.c
│ ├── kernel.lds
│ ├── machine
│ │ ├── mentry.S
│ │ └── minit.c
│ ├── process.c
│ ├── process.h
│ ├── riscv.h
│ ├── strap.c
│ ├── strap.h
│ ├── strap_vector.S
│ ├── syscall.c
│ └── syscall.h
├── spike_interface
│ ├── atomic.h
│ ├── dts_parse.c
│ ├── dts_parse.h
│ ├── spike_file.c
│ ├── spike_file.h
│ ├── spike_htif.c
│ ├── spike_htif.h
│ ├── spike_memory.c
│ ├── spike_memory.h
│ ├── spike_utils.c
│ └── spike_utils.h
├── user
│ ├── app_helloworld.c
│ ├── user.lds
│ ├── user_lib.c
│ └── user_lib.h
└── util
├── functions.h
├── load_store.S
├── snprintf.c
├── snprintf.h
├── string.c
├── string.h
└── types.h
يحتوي دليل الجذر بشكل أساسي على المستندات (أي ملفات MD) ، ونص الترخيص والأهم من ذلك ، ملف Make (المسمى على أنه Makefile ). يحتوي دليل kernel الفرعي على kernel OS ، في حين أن دليل المستخدم الفرعي يحتوي على التطبيق المحدد (في app_helloworld.c ) وكذلك ملفات رمز المصدر التي تحتوي على توجيهات الدعم ، والتي يجب وضعها في مكتبة المستخدم في OS الكاملة مثل linux.
لفهم PKE OS kernel (من lab1_1) وإنجاز المختبر ، يجب أن تبدأ من التطبيق المحدد. لذلك ، نبدأ السياحة من المستخدم/app_helloworld.c :
1 /*
2 * Below is the given application for lab1_1.
3 *
4 * You can build this app (as well as our PKE OS kernel) by command:
5 * $ make
6 *
7 * Or run this app (with the support from PKE OS kernel) by command:
8 * $ make run
9 */
10
11 #include " user_lib . h "
12
13 int main ( void ) {
14 printu ( "Hello world!n" );
15
16 exit ( 0 );
17 }من الكود ، يمكننا أن نلاحظ أن هناك وظيفة محددة حديثًا تسمى Printu ، والتي تساوي وظيفتها طباعة استخدامنا اليومي. السبب في تحديد وظيفة جديدة بدلاً من استخدام printf هو أن printf محددة بالفعل في newLib لسلسلة أدوات RISC-V المتبادلة.
يمكن العثور على النموذج الأولي وتنفيذ printu في المستخدم/المستخدم. h و user/do_print.c على التوالي.
بعد الانتهاء من المختبر (وارتكب الحل الخاص بك) ، يمكنك متابعة ممارسة المختبرات التالية. على سبيل المثال ، بعد الانتهاء من lab1_1 ، يمكنك ارتكاب الحل الخاص بك بواسطة:
$ git commit -a -m " your comments to lab1_1 "ثم ، قم بالتبديل إلى المختبر التالي (lab1_2) بواسطة:
$ git checkout lab1_2_exceptionودمج الحل الخاص بك في المختبر السابق بواسطة:
$ git merge lab1_1_syscall -m " continue lab1_2 "بعد كل هذا ، يمكنك المتابعة إلى العمل على Lab1_2.
ملاحظة : لا تندمج معمل التحدي ، مثل lab1_challenge1_backtrace ، lab2_challenge1_pagefaults ، إلخ.
هذا كل شيء. أتمنى أن تستمتع!