Dieses Projekt stammt aus dem Repository 华中科技大学操作系统团队 / RISCV-PKE.
Wie Sie in den Zweigen sehen können, entspricht jeder Zweig einer Ebene mit seiner präzisen Beschreibung.

Dies ist kein lokales Runnable -Paket, denn ich habe keine Kompilierarbeiten darin gemacht. Betrachten Sie es einfach als ein Antwortbuch von Kontrollpunkten in der Online -Bewertung von Educoder . Wenn Sie dieses Projekt lokal ausführen möchten, lesen Sie bitte weiter und finden Sie Ihren Weg in offizieller Readme .
Dieses Vorwort wird nur in Standardzweig angezeigt.
Dokumente auf Chinesisch finden Sie hier. Es gibt noch keine speziellen Dokumente auf Englisch, aber die Inline-Kommentare in unseren Codes sowie die selbsterklärenden Namen für Variablen und Funktionen helfen auf Ihrer Reise von PKE.
PKE ist ein Open -Source -Projekt (siehe Lizenz.TXT für Lizenzinformationen) zum Bildungszweck des Betriebssystemtechnik/des Computersystemtechnik -Kurses, der an Studenten der Studienstudie zur Verfügung gestellt wurde, die in CS (Informatik) oder EECs (Elektrotechnik und Informatik) an Universitäten studierten.
PKE bietet eine Reihe von Labors, die die technischen Wissenspunkte des Betriebssystems sowie einige der Computerorganisation/-architektur abdecken, einschließlich:
Lab1 (3 Basic Labs+2 Challenge Labs): Fallen (Syscalls), Ausnahmen und Interrupts (IRQs in der Intel -Terminologie).
Lab2 (3 Basic Labs+2 Challenge Labs): Speicherverwaltung.
Lab3 (3 Basic Labs+2 Challenge Labs): Prozesse.
Lab4 (3 Basic Labs): Gerät und Datei (durchgeführt auf einem Pynq FPGA -Board + einem Arduino -Spielzeugauto).
Die Experimente im Repo können sich von der obigen Liste mit dem Zeitverlauf unterschiedlich (mit mehr labenden Labors) unterscheiden.
Aus dem Bildungswinkel über das Betriebssystemtechnik, unterscheidet sich von vielen berühmten OS-Bildungsprojekten (wie XV6 (JOS, wenn früher) im MIT 6.828 und Ucore an der Tsinghua-Universität unterrichtet, die vollständige oder nahezu vollständige OS-Kernel verwenden, die fast alles wie Prozessmanagement, Dateisysteme und viele andere Moduls, PKE, kein vollständiges OS-Kern.
PKE basiert auf der Idee des Proxy-Kernels (vorgeschlagen in PK, einem Open-Source-Projekt der RISC-V-Software-Ökologie), in dem hervorgehoben wird, dass ein "Just-Celoug-Os" -Kernel für eine bestimmte Anwendung erstellt wird. Mit einer solchen Idee entwerfen wir eine Reihe von Labors in PKE, die den OS -Kernel allmählich "aktualisiert", indem wir eine Reihe von Anwendungen von einfach bis komplex angeben. Während der Upgrades können Sie immer anspruchsvollere Ideen moderner Betriebssysteme lernen und vor allem mit ihnen spielen, indem Sie den Labors nacheinander folgen.
In jedem Labor startet PKE mit einer Anwendung (in den Ordner ./User/ mit dem Präfix "app_") und einem unvollständigen Proxy -OS -Kernel. Während des Labors müssen Sie 1) die Wechselwirkung zwischen Anwendung und Proxy-OS-Kernel verstehen (manchmal auch die RISC-V-Maschine, die durch Verwendung von Spike oder eine FPGA-Platine mit einem weichen RISC-V-Kern emuliert wird); 2) den Code aus der angegebenen Anwendung auf den OS -Kernel basierend auf dem Verständnis folgen; 3) Füllen Sie den Proxy -OS -Kernel aus, damit die Anwendung (oder das System) korrekt und reibungslos ausgeführt werden kann.
In den Labors von PKE versuchten wir unser Bestes, um die Codeskala jedes Labors zu kontrollieren und zu minimieren, in der Hoffnung, Ihnen zu helfen, sich auf die Schlüsselkomponenten des Betriebssystems zu konzentrieren und die Bemühungen gleichzeitig zu minimieren. Kontaktieren Sie uns, wenn Sie weitere Vorschläge zur Reduzierung der Codeskala haben, danke im Voraus!
1. Installieren Sie das Betriebssystem (Virtual Machine oder Windows Subversion Linux)
(bevorzugt) Ubuntu 16.04lts oder höher, 64-Bit
2. Installieren Sie Werkzeuge zum Bau von Cross-Compiler und Emluator
$ sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex3. Installieren Sie 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 installIn den obigen Befehlen steht $ (NPROC) für die Anzahl der Threads, die Sie während des Gebäudes aufrufen möchten. Generelly, $ (NPROC) sollte der Anzahl der Kerne entsprechen, die Ihr Computer hat. Nach diesem Schritt sollten Sie Executables wie RISCV64-UNKNOWN-FLCC-GCC, RISCV64-UNKNOWNLEFELF-GDB, RISCV64-UNKNOWN-SLEF-OBJDUMP und viele andere (mit dem Namen Prefix von "Riscv64-Ob-Ob-Elf-Elf-Elf-Elnen-") in Ihrem /Path-to-In-Stall-Riscv-Tupool-Richtungen /Bin-Richtungen /Bin- Relzien finden.
4. Installieren Sie den Emulator (Spike)
$ 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 installNach diesem Schritt sollten Sie Executables wie Spike, Spike-DASM in Ihrem /path-zu-install-riscV-Toolchains /Bin- Verzeichnis finden.
5. Klonpke Repo
$ git clone https://github.com/MrShawCode/riscv-pke.gitNach diesem Schritt haben Sie das PKE -Verzeichnis mit den PKE -Labors.
6. bauen/run pke
$ make [run]7. (optional) Installieren Sie OpenOCD zum Debuggen
$ 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 Nach der Installation von OpenOCD können Sie den PKE -Kernel debuggen. Verwenden Sie einfach den folgenden Befehl:
$ make gdbIn diesem Labor lernen wir die grundlegenden Priores of Trap (auch in vielen Lehrbüchern genannt).
Eine Falle (zum Beispiel Printf in unserer täglichen Verwendung) wird im Allgemeinen von einem Antrag ausgestellt und vom Kernel evallunabhängig behandelt. Für ein Betriebssystem ist es sehr wichtig, eine solche Einrichtung bereitzustellen, da Anwendungen, die in weniger priviledierten Modi ausgeführt werden (z. B. Benutzermodus in RISC-V), häufig Rechtsvorgänge wie I/Os durchführen müssen, die in höheren Berechtigungsmodi (z. B. in RISC-V) durchgeführt werden müssen.
LAB1_1 gibt eine Anwendung in "Benutzer/Lab1_1_Helloworld.c" an, deren main () Funktion eine Funktion aufnimmt , die die gleiche Funktionalität wie printf hat, jedoch unter einem etwas anderen Namen. Printu ist in "user/do_print.c" definiert und ruft tatsächlich die Falle durch die ECALL -Anweisung auf (siehe die Inline -Assemblys in der Funktion do_user_print ).
Die Struktur von Lab1_1 ist im Folgenden aufgeführt:
.
├── 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
Das Stammverzeichnis enthält hauptsächlich die Dokumente (dh die MD -Dateien), den Lizenztext und vor allem die Datei make -Datei (benannt als Makefile ). Das Kernel -Unterdirektory enthält den OS-Kernel, während das User Sub-Directory die angegebene Anwendung (in App_Helloworld.c ) sowie die Quellcode-Dateien enthält, die die unterstützenden Routungen enthalten, die in der Benutzerbibliothek in vollgeplodeltem Betriebssystem wie Linux platziert werden sollten.
Um den PKE OS -Kernel (von Lab1_1) zu verstehen und das Labor zu erreichen, sollten Sie mit der angegebenen Anwendung beginnen. Daher beginnen wir den Tourismus von user/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 }Aus dem Code können wir beobachten, dass es eine neu definierte Funktion namens Printu gibt, deren Funktionalität dem Printf unserer täglichen Verwendung entspricht. Der Grund, warum wir eine neue Funktion definieren, anstatt Printf zu verwenden, ist, dass Printf bereits in der Newlib der RISC-V-Cross-Compiling-Werkzeugkette definiert ist.
Der Prototyp und die Implementierung von Printu finden Sie in user/user.h und user/do_print.c .
Nachdem Sie ein Labor beendet haben (und Ihre Lösung festgelegt haben), können Sie das Üben der folgenden Labors fortsetzen. Zum Beispiel können Sie nach Abschluss von Lab1_1 Ihre Lösung begehen, um:
$ git commit -a -m " your comments to lab1_1 "Wechseln Sie dann zum nächsten Labor (Lab1_2) nach:
$ git checkout lab1_2_exceptionund fusionieren Sie Ihre Lösung im vorherigen Labor mit:
$ git merge lab1_1_syscall -m " continue lab1_2 "Nach all dem können Sie an Lab1_2 arbeiten.
HINWEIS : Fusion Challenge Labs wie Lab1_Challenge1_Backtrace, Lab2_Challenge1_PageFaults usw.
Das ist alles. Hoffe du genießt!