该项目来自存储库 / 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,等等。
就这样。希望你喜欢!