該項目來自存儲庫 / riscv-pke。
如您在分支中看到的那樣,每個分支都與其簡潔的描述相對應。

這不是本地可運行的軟件包,因為我沒有做任何編譯工作。只需將其視為教育錄像帶中檢查點的答案手冊即可。如果您想在當地運行此項目,請繼續閱讀並在官方讀書中找到自己的方式。
此序言僅在默認分支中顯示。
可以在這裡找到中文的文件。仍然沒有英文專用文檔,但是我們的代碼中的在線評論以及變量和功能的自我解釋名稱將有助於您的PKE旅程。
PKE是一個開源項目(有關許可信息,請參見License.TXT),以實現操作系統工程/計算機系統工程課程的教育目的,該課程授予大學的本科生(計算機科學)或大學的EEC(電氣工程和計算機科學)專業的本科生。
PKE提供了一系列實驗室,這些實驗室涵蓋了操作系統的工程側知識點以及一些計算機組織/體系結構,包括:
LAB1(3個基本實驗室+2個挑戰實驗室):陷阱(SYSCALLS),異常和中斷(Intel術語中的IRQ)。
LAB2(3個基本實驗室+2個挑戰實驗室):內存管理。
LAB3(3個基本實驗室+2個挑戰實驗室):過程。
LAB4(3個基本實驗室):設備和文件(在Pynq FPGA板上進行 + Arduino玩具車)。
隨著時間的流逝,回購中的實驗可能與上述列表不同(具有更多實際的實驗室)。
From the angle of education on Operating System Engineering, different from many famous OS educational projects (like xv6 (JOS when earlier) used in MIT 6.828 and ucore taught in Tsinghua University) that use complete or near-complete OS kernels containing almost everything like process management, file systems and many other modules, PKE is NOT a complete OS kernel (actually, PKE never intends to be one of them.) .
PKE是圍繞代理內核(RISC-V軟件生態學的開源項目提出的)構建的,該項目強調為給定應用構造“恰好能量” OS內核。有了這樣的想法,我們在PKE中設計了一系列實驗室,這些實驗室通過提供從簡單到復雜的一組應用程序來逐漸“升級” OS內核。在升級期間,您可以學習越來越複雜的現代操作系統思想,更重要的是,通過跟隨實驗室,一個接一個地與它們一起玩。
在每個實驗室中,PKE從應用程序開始(放置在./user/文件夾中,帶有“ App_”前綴)和不完整的代理OS內核。在實驗室期間,您需要1)了解應用程序和代理OS內核之間的相互作用(有時也是通過使用Spike模擬的RISC-V機器,或具有軟RISC-V核心的FPGA板); 2)根據理解遵循從給定應用程序到OS內核的代碼; 3)完成代理OS內核,以使應用程序(或系統)正確執行。
在PKE的實驗室中,我們盡了最大的努力來控制和最大程度地減少每個實驗室的代碼量表,希望幫助您專注於操作系統的關鍵組成部分,並同時最大程度地減少努力。如果您對減少代碼量表有進一步的建議,請與我們聯繫,請提前!
1。安裝操作系統(虛擬機或Windows 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)應等於計算機的內核數。 After this step, you should find executables, like riscv64-unknown-elf-gcc, riscv64-unknown-elf-gdb, riscv64-unknown-elf-objdump, and many others (with the name prefix of "riscv64-unknown-elf-") in your /path-to-install-RISCV-toolchains/bin directory.
4。安裝仿真器(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 install在此步驟之後,您應該在/ /途徑安裝式 - 式 - 託管 /bin目錄中找到諸如Spike,Spike-DASM之類的可執行文件。
5。克隆人PKE回購
$ 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後,您可以調試PKE內核。只需使用以下命令:
$ make gdb在這個實驗室中,我們將學習陷阱的基本定價(在許多教科書中也被稱為Syscall )。
一個陷阱(例如,我們日常使用中的printf )通常由應用程序發出,並由內核處理。對於操作系統來說,提供此類設施非常重要,因為以較低的特權模式(例如,RISC-V中的用戶模式)運行的應用程序需要經常執行需要以更高的特權模式進行的I/OS(例如,RISC-V中的主管或機器模式)進行的法律操作。
LAB1_1在“用戶/lab1_1_helloworld.c”中給出了一個應用程序,其main()函數調用函數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 File(稱為MakeFile )。內核子目錄包含OS內核,而用戶子目錄包含給定的應用程序(在App_helloworld.c中)以及包含支撐路由的源代碼文件,該文件應將其放置在用戶庫中的完整Plapleded OS的用戶庫中。
要了解PKE OS內核(LAB1_1的)並完成實驗室,您應該從給定的應用程序開始。因此,我們從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 }從代碼中,我們可以觀察到有一個新定義的函數稱為printu ,其功能等於我們的日常使用。我們定義一個新功能而不是使用printf的原因是printf已經在RISC-V交叉編譯工具鏈的Newlib中定義。
PRINTU的原型和實現分別可以在user/user.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,等等。
就這樣。希望你喜歡!