โครงการนี้มาจากที่เก็บ华中科技大学操作系统团队 / RISCV-PKE
อย่างที่คุณเห็นใน สาขา แต่ละสาขาสอดคล้องกับระดับด้วยคำอธิบายที่กระชับ

นี่ ไม่ใช่ แพ็คเกจที่ใช้งานได้ในพื้นที่เพราะฉันไม่ได้ทำงานคอมไพล์ใด ๆ เลย เพียงแค่ถือว่าเป็นคำตอบของจุดตรวจในการประเมินออนไลน์ ของ Educoder หากคุณต้องการเรียกใช้โครงการนี้ในพื้นที่โปรดอ่านและหาทางใน ReadMe อย่างเป็นทางการ
คำนำนี้จะแสดงในสาขาเริ่มต้นเท่านั้น
เอกสารในภาษาจีนสามารถพบได้ที่นี่ ยังไม่มีเอกสารเฉพาะในภาษาอังกฤษ แต่ความคิดเห็นในบรรทัดในรหัสของเรารวมถึงชื่อที่อธิบายตนเองสำหรับตัวแปรและฟังก์ชั่นจะช่วยในการเดินทางของ PKE ของคุณ
PKE เป็นโครงการโอเพ่นซอร์ส (ดูใบอนุญาตสำหรับข้อมูลใบอนุญาต) เพื่อวัตถุประสงค์ทางการศึกษาของระบบวิศวกรรมระบบปฏิบัติการ/หลักสูตรวิศวกรรมระบบคอมพิวเตอร์ที่มอบให้กับนักศึกษาระดับปริญญาตรีที่ออกเสียงใน CS (วิทยาการคอมพิวเตอร์) หรือ EECs (วิศวกรรมไฟฟ้าและวิทยาศาสตร์คอมพิวเตอร์) ในมหาวิทยาลัย
PKE ให้บริการห้องปฏิบัติการที่ครอบคลุมจุดความรู้ด้านวิศวกรรมของระบบปฏิบัติการรวมถึงองค์กรคอมพิวเตอร์/สถาปัตยกรรมบางแห่งรวมถึง:
LAB1 (3 Labs Basic+2 Challenge Labs): กับดัก (SyScalls), ข้อยกเว้นและการขัดจังหวะ (IRQs ในคำศัพท์ Intel)
LAB2 (3 Labs Basic+2 Challenge Labs): การจัดการหน่วยความจำ
LAB3 (3 ห้องปฏิบัติการพื้นฐาน+2 ห้องปฏิบัติการท้าทาย): กระบวนการ
LAB4 (3 ห้องปฏิบัติการพื้นฐาน): อุปกรณ์และไฟล์ (ดำเนินการบนบอร์ด PYNQ FPGA + รถของเล่น Arduino)
การทดลองใน repo อาจแตกต่างกัน (กับห้องปฏิบัติการจริงมากขึ้น) จากรายการด้านบนเมื่อเวลาผ่านไป
จากมุมของการศึกษาเกี่ยวกับวิศวกรรมระบบปฏิบัติการแตกต่างจากโครงการการศึกษาระบบปฏิบัติการที่มีชื่อเสียงหลายแห่ง (เช่น XV6 ( JOS เมื่อ ก่อน หน้านี้) ใช้ใน MIT 6.828 และ Ucore สอนในมหาวิทยาลัย Tsinghua) ที่ใช้เมล็ดปฏิบัติการที่สมบูรณ์หรือใกล้เคียง
PKE ถูกสร้างขึ้นรอบ ๆ แนวคิดของเคอร์เนลพร็อกซี (เสนอใน PK ซึ่งเป็นโครงการโอเพนซอร์สของนิเวศวิทยาซอฟต์แวร์ RISC-V) ซึ่งเน้นที่จะสร้างเคอร์เนล OS "Just-enough" สำหรับแอปพลิเคชันที่กำหนด ด้วยความคิดดังกล่าวเราออกแบบชุดห้องปฏิบัติการใน PKE ที่ค่อยๆ "อัพเกรด" เคอร์เนล OS โดยให้ชุดแอปพลิเคชันตั้งแต่ง่ายไปจนถึงซับซ้อน ในระหว่างการอัพเกรดคุณสามารถเรียนรู้แนวคิดที่ซับซ้อนมากขึ้นเรื่อย ๆ ของระบบปฏิบัติการที่ทันสมัยและที่สำคัญกว่านั้นคือเล่นกับพวกเขาโดยทำตามห้องปฏิบัติการ
ในห้องปฏิบัติการแต่ละห้อง PKE เริ่มต้นด้วยแอปพลิเคชัน (วางไว้ในโฟลเดอร์ ./user/ พร้อมคำนำหน้า "App_") และเคอร์เนล OS พร็อกซี ที่ไม่สมบูรณ์ ในระหว่างห้องปฏิบัติการคุณต้อง 1) เข้าใจการมีปฏิสัมพันธ์ระหว่างแอปพลิเคชันและเคอร์เนลระบบปฏิบัติการพร็อกซี (บางครั้งก็เป็นเครื่อง RISC-V ที่เลียนแบบโดยใช้สไปค์หรือบอร์ด FPGA ที่มีแกน RISC-V ที่อ่อนนุ่ม); 2) ติดตามรหัสจากแอปพลิเคชันที่กำหนดไปยังเคอร์เนล OS ตามความเข้าใจ; 3) ทำเคอร์เนลระบบปฏิบัติการพร็อกซีเพื่อให้แอปพลิเคชัน (หรือระบบ) ดำเนินการอย่างถูกต้องและราบรื่น
ในห้องปฏิบัติการของ PKE เราพยายามอย่างดีที่สุดในการควบคุมและลดระดับรหัสของแต่ละห้องปฏิบัติการโดยหวังว่าจะช่วยให้คุณมุ่งเน้นไปที่องค์ประกอบสำคัญของระบบปฏิบัติการและลดความพยายามในเวลาเดียวกัน ติดต่อเราหากคุณมีคำแนะนำเพิ่มเติมเกี่ยวกับการลดระดับรหัสขอบคุณล่วงหน้า!
1. ติดตั้งระบบปฏิบัติการ (เครื่องเสมือนหรือ Linux การโค่นล้มของ Windows)
(ต้องการ) Ubuntu 16.04lts หรือสูงกว่า 64 บิต
2. ติดตั้งเครื่องมือสำหรับการสร้าง cross-compiler และ emluator
$ sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex3. ติดตั้ง RISC-V Cross Compiler
$ 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- UNDNOWN-ELF- OBJDUMP และอื่น ๆ อีกมากมาย
4. ติดตั้ง emulator (สไปค์)
$ 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หลังจากขั้นตอนนี้คุณควรพบว่าผู้ดำเนินการเช่นสไปค์, สไปค์-ดาบใน ไดเรกทอรี /ไดเรกทอรี bin ของคุณ
5. โคลน pke repo
$ git clone https://github.com/MrShawCode/riscv-pke.gitหลังจากขั้นตอนนี้คุณจะมีไดเรกทอรี PKE ที่มี PKE Labs
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 คุณสามารถดีบั๊กเคอร์เนล PKE เพียงใช้คำสั่งต่อไปนี้:
$ make gdbในห้องแล็บนี้เราจะเรียนรู้คำสำคัญพื้นฐานของกับดัก (เรียกอีกอย่างว่า syscall ในตำราหลายเล่ม)
กับดัก (ตัวอย่างเช่น printf ที่อยู่ในการใช้งานประจำวันของเรา) โดยทั่วไปจะออกโดยแอปพลิเคชันและจัดการโดยเคอร์เนล เป็นสิ่งสำคัญมากสำหรับระบบปฏิบัติการที่จะให้สิ่งอำนวยความสะดวกดังกล่าวเนื่องจากแอปพลิเคชันทำงานในโหมดที่มีสิทธิ์น้อยกว่า (เช่นโหมดผู้ใช้ใน RISC-V) จำเป็นต้องดำเนินการทางกฎหมายเช่น I/OS ที่ต้องดำเนินการในโหมด Priviledge ที่สูงขึ้น (เช่นโหมดหัวหน้างานหรือเครื่องจักรใน RISC-V)
Lab1_1 ให้แอปพลิเคชันใน "ผู้ใช้/lab1_1_helloworld.c" ซึ่งฟังก์ชั่นหลัก () เรียกฟังก์ชั่น printu ที่มีฟังก์ชั่นเช่นเดียวกับ printf แต่อยู่ภายใต้ชื่อที่แตกต่างกันเล็กน้อย printu ถูกกำหนดไว้ใน "ผู้ใช้/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 ) ไดเรกทอรีย่อย เคอร์เนล มีเคอร์เนล OS ในขณะที่ไดเรกทอรีย่อย ของผู้ใช้ มีแอปพลิเคชันที่กำหนด (ใน app_helloworld.c ) เช่นเดียวกับไฟล์รหัสแหล่งที่มีเส้นทางรองรับซึ่งควรวางไว้ในไลบรารีผู้ใช้ในระบบปฏิบัติการเต็มรูปแบบเช่น Linux
เพื่อทำความเข้าใจเคอร์เนล PKE OS (ของ 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 สามารถพบได้ใน ผู้ใช้/ผู้ใช้ และ ผู้ใช้และผู้ใช้/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 ได้
หมายเหตุ : Never Merge Challenge Labs เช่น LAB1_Challenge1_Backtrace, Lab2_Challenge1_PageFaults ฯลฯ
นั่นคือทั้งหมด หวังว่าคุณจะสนุก!