Compare commits

..

2 Commits

Author SHA1 Message Date
Zhiyuan Shao 74fb18d6ff add link, book and challengeX
1 month ago
Zhiyuan Shao 35346f83a3 add docker support
1 month ago

@ -29,7 +29,11 @@
读者可以采用VMware、VirtualBox等软件在客户机中安装客户机再在客户机中安装执行支撑软件来构建实验环境。客户机的选择我们推荐采用Ubuntu 16.04LTSx86_64或更高版本的Ubuntu发行版如18.04LTS、20.04LTS或更高)操作系统,或者**华为openEuler操作系统**。我们未在其他系统如archRHEL等上做过测试但理论上只要将实验中所涉及到的安装包替换成其他系统中的等效软件包就可完成同样效果。 读者可以采用VMware、VirtualBox等软件在客户机中安装客户机再在客户机中安装执行支撑软件来构建实验环境。客户机的选择我们推荐采用Ubuntu 16.04LTSx86_64或更高版本的Ubuntu发行版如18.04LTS、20.04LTS或更高)操作系统,或者**华为openEuler操作系统**。我们未在其他系统如archRHEL等上做过测试但理论上只要将实验中所涉及到的安装包替换成其他系统中的等效软件包就可完成同样效果。
**方案三:头歌实验平台** **方案三Docker环境**
读者可以采用Docker作为开发环境。我们提供的 Docker 镜像中已经预装了完整的实验环境,实验源代码以及必要的辅助软件,读者无需手动安装任何支撑软件,便可轻松运行实验。我们建议读者使用 **x86_64**例如采用Intel或者ARM处理器的笔记本、台式机电脑**arm64** 处理器架构(例如,苹果公司新款**采用M系列处理器**的笔记本如MacBook等的客户机来运行 Docker 容器。具体的安装过程可以看[下一节](#subsec_docker)。
**方案四:头歌实验平台**
我们在EduCoder实验平台网址https://www.educoder.net 上创建了riscv-pke的同步实验课程课程的终端环境docker虚拟机中已完成实验所需软件工具的安装所以如果读者是在头歌平台上选择的本课程则可跳过本节的实验环境搭建过程以及执行支撑软件的安装过程直接进入通过终端命令行进入实验环境头歌实验平台的使用方法见[2.1.3节](#subsec_educoder)。 我们在EduCoder实验平台网址https://www.educoder.net 上创建了riscv-pke的同步实验课程课程的终端环境docker虚拟机中已完成实验所需软件工具的安装所以如果读者是在头歌平台上选择的本课程则可跳过本节的实验环境搭建过程以及执行支撑软件的安装过程直接进入通过终端命令行进入实验环境头歌实验平台的使用方法见[2.1.3节](#subsec_educoder)。
@ -146,6 +150,119 @@ RISC-V交叉编译器的构建需要一些本地支撑软件包可使用以
在以上命令中我们假设RISCV环境变量已经指向了RISC-V交叉编译器的安装目录即[your.RISCV.install.path]。 在以上命令中我们假设RISCV环境变量已经指向了RISC-V交叉编译器的安装目录即[your.RISCV.install.path]。
<a name="subsec_docker"></a>
**方案三安装Docker桌面环境**
* 第一步安装Docker
* **Ubuntu**
对于 **x86_64** 架构,安装具体的过程可以参考[这篇](https://blog.csdn.net/magic_ll/article/details/139985543?spm=1001.2014.3001.5506)文章。对于 **arm64** 架构,安装具体的过程可以参考[这篇](https://blog.csdn.net/sglin123/article/details/139754107?ops_request_misc=&request_id=&biz_id=102&utm_term=arm64%E5%AE%89%E8%A3%85docker&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-139754107.142^v100^pc_search_result_base8&spm=1018.2226.3001.4187)文章。
* **Windows**
Windows 版本的 Docker 安装可以参考[这篇](https://blog.csdn.net/Liuj666/article/details/126099982?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522EC5F862A-6D9C-439D-96AB-6CB77A783F13%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=EC5F862A-6D9C-439D-96AB-6CB77A783F13&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-126099982-null-null.142^v100^pc_search_result_base8&utm_term=windows%E5%AE%89%E8%A3%85docker&spm=1018.2226.3001.4187)文章。
* **macOS**
macOS 版本的 Docker 安装可以参考[这篇](https://blog.csdn.net/weixin_41860471/article/details/135048312?ops_request_misc=%257B%2522request%255Fid%2522%253A%25220015913A-5C64-4FD0-A192-3686BF8FE2C4%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=0015913A-5C64-4FD0-A192-3686BF8FE2C4&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-4-135048312-null-null.142^v100^pc_search_result_base8&utm_term=macos%E5%AE%89%E8%A3%85docker&spm=1018.2226.3001.4187)文章。
* 第二步,拉取镜像
* **x86_64/amd64 版本镜像**
*Dockerhub 镜像源*
`$ docker pull docker.io/tjr9098/amd64_pke_mirrors:1.0`
*阿里云镜像源*
`$ docker pull crpi-vycj2ba2y82yi8d0.cn-hangzhou.personal.cr.aliyuncs.com/pke_mirrors/amd64_pke_mirrors:1.0`
* **arm64 版本镜像**
*Dockerhub 镜像源*
`$ docker pull docker.io/tjr9098/arm64_pke_mirrors:1.0`
*阿里云镜像源*
`$ docker pull crpi-vycj2ba2y82yi8d0.cn-hangzhou.personal.cr.aliyuncs.com/pke_mirrors/arm64_pke_mirrors:1.0`
* 第三步,运行镜像
`$ docker run -it --name pke_mirror IMAGE:1.0`
**`IMAGE`** 是镜像名称,名称可通过`$ docker images`查看。
**`-it`**: 交互式运行容器,分配一个伪终端。
**`--name`**: 为容器命名,便于后续使用。
若出现下图所示则成功进入容器。
<img src="pictures/image1-docker.png" alt="image1-docker" style="zoom:80%;" />
* 第四步,验证环境
接下来切换到pke实验代码目录并构造
`# cd riscv-pke`
`# make`
若得到以下输出则可正常进行实验
```bash
# make
compiling util/snprintf.c
compiling util/string.c
linking obj/util.a ...
Util lib has been build into "obj/util.a"
compiling spike_interface/spike_file.c
compiling spike_interface/spike_htif.c
compiling spike_interface/spike_utils.c
compiling spike_interface/dts_parse.c
compiling spike_interface/spike_memory.c
linking obj/spike_interface.a ...
Spike lib has been build into "obj/spike_interface.a"
compiling kernel/syscall.c
compiling kernel/kernel.c
compiling kernel/elf.c
compiling kernel/process.c
compiling kernel/strap.c
compiling kernel/machine/minit.c
compiling kernel/strap_vector.S
compiling kernel/machine/mentry.S
linking obj/riscv-pke ...
PKE core has been built into "obj/riscv-pke"
compiling user/app_helloworld.c
compiling user/user_lib.c
linking obj/app_helloworld ...
User app has been built into "obj/app_helloworld"
```
* 再次进入容器
* 第一步,启动容器
`$ docker container start pke_mirror`
* 第二步,进入容器
`$ docker exec -it pke_mirror /bin/bash`
若出现下图所示则成功进入容器。
<img src="pictures/image2-docker.png" alt="image2-docker" style="zoom:80%;" />
**注意:以上代码默认容器名称为`pke_mirror`,请读者根据自己的容器名称做修改**。
<a name="subsec_educoder"></a> <a name="subsec_educoder"></a>

@ -892,9 +892,10 @@ spike基于HTIF内存的传递定义了一组HTIF调用类似于操作系
<a name="syscall"></a> <a name="syscall"></a>
## 3.2 lab1_1 系统调用 ## 3.2 lab1_1 系统调用[头歌实验链接](https://www.educoder.net/shixuns/lawkz324/challenges)
<a name="lab1_1_app"></a> <a name="lab1_1_app"></a>
#### **给定应用** #### **给定应用**
- user/app_helloworld.c - user/app_helloworld.c
@ -1117,11 +1118,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab1_1 is done." $ git commit -a -m "my work on lab1_1 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="exception"></a> <a name="exception"></a>
## 3.3 lab1_2 异常处理 ## 3.3 lab1_2 异常处理[头歌实验链接](https://www.educoder.net/shixuns/tznof6hx/challenges)
<a name="lab1_2_app"></a> <a name="lab1_2_app"></a>
@ -1323,11 +1326,13 @@ lab1_2实验需要读者了解和掌握操作系统中异常exception
$ git commit -a -m "my work on lab1_2 is done." $ git commit -a -m "my work on lab1_2 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="irq"></a> <a name="irq"></a>
## 3.4 lab1_3 (外部)中断 ## 3.4 lab1_3 (外部)中断 [头歌实验链接](https://www.educoder.net/shixuns/wp4ys5ag/challenges)
<a name="lab1_3_app"></a> <a name="lab1_3_app"></a>
@ -1619,11 +1624,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab1_3 is done." $ git commit -a -m "my work on lab1_3 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab1_challenge1_backtrace"></a> <a name="lab1_challenge1_backtrace"></a>
## 3.5 lab1_challenge1 打印用户程序调用栈(难度:&#9733;&#9733;&#9733;&#9734;&#9734; ## 3.5 lab1_challenge1 打印用户程序调用栈(难度:&#9733;&#9733;&#9733;&#9734;&#9734;[头歌实验链接](https://www.educoder.net/shixuns/9i8lur4h/challenges)
<a name="lab1_challenge1_app"></a> <a name="lab1_challenge1_app"></a>
@ -1798,11 +1805,13 @@ uint64 elf_fpread(elf_ctx *ctx, void *dest, uint64 nb, uint64 offset)
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。** **另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab1_challenge2_errorline"></a> <a name="lab1_challenge2_errorline"></a>
## 3.6 lab1_challenge2 打印异常代码行(难度:&#9733;&#9733;&#9733;&#9734;&#9734; ## 3.6 lab1_challenge2 打印异常代码行(难度:&#9733;&#9733;&#9733;&#9734;&#9734;[头歌实验链接](https://www.educoder.net/shixuns/5apy6ojf/challenges)
<a name="lab1_challenge2_app"></a> <a name="lab1_challenge2_app"></a>
@ -1883,11 +1892,13 @@ $ git merge lab1_3_irq -m "continue to work on lab1_challenge1"
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。** **另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab1_challenge3_multicore"></a> <a name="lab1_challenge3_multicore"></a>
## 3.7 lab1_challenge3 多核启动及运行(难度:&#9733;&#9733;&#9733;&#9733;&#9734; ## 3.7 lab1_challenge3 多核启动及运行(难度:&#9733;&#9733;&#9733;&#9733;&#9734;[头歌实验链接](https://www.educoder.net/shixuns/2znkcmh9/challenges)
之前的实验都在单核环境下进行。在本次实验中,你需要修改操作系统内核使其支持两核并发运行,并且在每个核上加载一个程序运行,等到两个程序都执行完毕后退出并关闭模拟器。 之前的实验都在单核环境下进行。在本次实验中,你需要修改操作系统内核使其支持两核并发运行,并且在每个核上加载一个程序运行,等到两个程序都执行完毕后退出并关闭模拟器。
@ -2000,3 +2011,6 @@ spike模拟器支持`-p`选项来模拟多个核在pke中通过`spike -p2
1. 对于riscv处理器有一个寄存器`tp (thread pointer)`是专门用来保存hart相关信息的可以利用此寄存器存储每个核关于自身的信息。 1. 对于riscv处理器有一个寄存器`tp (thread pointer)`是专门用来保存hart相关信息的可以利用此寄存器存储每个核关于自身的信息。
2. `kernel/sync_utils.h`提供了一个简单的同步屏障的实现,你可以通过这个同步原语实现并发控制,或者自行设计其它同步原语。 2. `kernel/sync_utils.h`提供了一个简单的同步屏障的实现,你可以通过这个同步原语实现并发控制,或者自行设计其它同步原语。
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。

@ -321,7 +321,7 @@ load_user_program()函数对于应用进程逻辑空间的操作可以分成以
<a name="lab2_1_pagetable"></a> <a name="lab2_1_pagetable"></a>
## 4.2 lab2_1 虚实地址转换 ## 4.2 lab2_1 虚实地址转换[头歌实验链接](https://www.educoder.net/shixuns/l87hxkyb/challenges)
<a name="lab2_1_app"></a> <a name="lab2_1_app"></a>
@ -457,11 +457,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab2_1 is done." $ git commit -a -m "my work on lab2_1 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab2_2_allocatepage"></a> <a name="lab2_2_allocatepage"></a>
## 4.3 lab2_2 简单内存分配和回收 ## 4.3 lab2_2 简单内存分配和回收[头歌实验链接](https://www.educoder.net/shixuns/hbmok6cf/challenges)
<a name="lab2_2_app"></a> <a name="lab2_2_app"></a>
@ -612,11 +614,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab2_2 is done." $ git commit -a -m "my work on lab2_2 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab2_3_pagefault"></a> <a name="lab2_3_pagefault"></a>
## 4.4 lab2_3 缺页异常 ## 4.4 lab2_3 缺页异常[头歌实验链接](https://www.educoder.net/shixuns/zepyv5fu/challenges)
<a name="lab2_3_app"></a> <a name="lab2_3_app"></a>
@ -801,11 +805,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab2_3 is done." $ git commit -a -m "my work on lab2_3 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab2_challenge1_pagefault"></a> <a name="lab2_challenge1_pagefault"></a>
## 4.5 lab2_challenge1 复杂缺页异常(难度:&#9733;&#9734;&#9734;&#9734;&#9734; ## 4.5 lab2_challenge1 复杂缺页异常(难度:&#9733;&#9734;&#9734;&#9734;&#9734;[头歌实验链接](https://www.educoder.net/shixuns/xtyf8qwr/challenges)
<a name="lab2_challenge1_app"></a> <a name="lab2_challenge1_app"></a>
@ -917,9 +923,13 @@ $ git merge lab2_3_pagefault -m "continue to work on lab2_challenge1"
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。** **另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab2_challenge2_singlepageheap"></a> <a name="lab2_challenge2_singlepageheap"></a>
## 4.6 lab2_challenge2 堆空间管理 (难度:&#9733;&#9733;&#9733;&#9733;&#9734; ## 4.6 lab2_challenge2 堆空间管理 (难度:&#9733;&#9733;&#9733;&#9733;&#9734;[头歌实验链接](https://www.educoder.net/shixuns/ljzygpmb/challenges)
<a name="lab2_challenge2_app"></a> <a name="lab2_challenge2_app"></a>
@ -1040,11 +1050,13 @@ $ git merge lab2_3_pagefault -m "continue to work on lab2_challenge2"
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。** **另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab2_challenge3_multicoremem"></a> <a name="lab2_challenge3_multicoremem"></a>
## 4.7 lab2_challenge3 多核内存管理(难度:&#9733;&#9733;&#9734;&#9734;&#9734; ## 4.7 lab2_challenge3 多核内存管理(难度:&#9733;&#9733;&#9734;&#9734;&#9734;[头歌实验链接](https://www.educoder.net/shixuns/fitplahw/challenges)
<a name="lab2_challenge3_app"></a> <a name="lab2_challenge3_app"></a>
@ -1241,3 +1253,6 @@ void *alloc_page(void) {
在实验的基础代码中,有一些打印分配内存地址的代码,你需要将这部分代码改为支持多核执行的版本,然后便可以阅读执行后的输出来判断是否为每个进程分配得到的物理内存页和对应的虚拟内存。 在实验的基础代码中,有一些打印分配内存地址的代码,你需要将这部分代码改为支持多核执行的版本,然后便可以阅读执行后的输出来判断是否为每个进程分配得到的物理内存页和对应的虚拟内存。
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。

@ -447,7 +447,7 @@ PKE操作系统内核通过调用schedule()函数来完成进程的选择和换
<a name="lab3_1_naive_fork"></a> <a name="lab3_1_naive_fork"></a>
## 5.2 lab3_1 进程创建fork ## 5.2 lab3_1 进程创建fork[头歌实验链接](https://www.educoder.net/shixuns/lf3vgx7c/challenges)
<a name="lab3_1_app"></a> <a name="lab3_1_app"></a>
@ -684,11 +684,13 @@ user/app_naive_fork.c --> user/user_lib.c --> kernel/strap_vector.S --> kernel/s
$ git commit -a -m "my work on lab3_1 is done." $ git commit -a -m "my work on lab3_1 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab3_2_yield"></a> <a name="lab3_2_yield"></a>
## 5.3 lab3_2 进程yield ## 5.3 lab3_2 进程yield[头歌实验链接](https://www.educoder.net/shixuns/e7q4csmt/challenges)
<a name="lab3_2_app"></a> <a name="lab3_2_app"></a>
@ -879,11 +881,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab3_2 is done." $ git commit -a -m "my work on lab3_2 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab3_3_rrsched"></a> <a name="lab3_3_rrsched"></a>
## 5.4 lab3_3 循环轮转调度 ## 5.4 lab3_3 循环轮转调度[头歌实验链接](https://www.educoder.net/shixuns/3cvhjfw4/challenges)
<a name="lab3_3_app"></a> <a name="lab3_3_app"></a>
@ -1089,11 +1093,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab3_3 is done." $ git commit -a -m "my work on lab3_3 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab3_challenge1_wait"></a> <a name="lab3_challenge1_wait"></a>
## 5.5 lab3_challenge1 进程等待和数据段复制(难度:&#9733;&#9733;&#9734;&#9734;&#9734; ## 5.5 lab3_challenge1 进程等待和数据段复制(难度:&#9733;&#9733;&#9734;&#9734;&#9734;[头歌实验链接](https://www.educoder.net/shixuns/hwtam4is/challenges)
<a name="lab3_challenge1_app"></a> <a name="lab3_challenge1_app"></a>
@ -1225,9 +1231,13 @@ $ git merge lab3_3_rrsched -m "continue to work on lab3_challenge1"
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。** **另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab3_challenge2_semaphore"></a> <a name="lab3_challenge2_semaphore"></a>
## 5.6 lab3_challenge2 实现信号量(难度:&#9733;&#9733;&#9733;&#9734;&#9734; ## 5.6 lab3_challenge2 实现信号量(难度:&#9733;&#9733;&#9733;&#9734;&#9734;[头歌实验链接](https://www.educoder.net/shixuns/ehb5zf9f/challenges)
<a name="lab3_challenge2_app"></a> <a name="lab3_challenge2_app"></a>
@ -1427,11 +1437,13 @@ $ git merge lab3_3_rrsched -m "continue to work on lab3_challenge1"
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。** **另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab3_challenge3_cow"></a> <a name="lab3_challenge3_cow"></a>
## 5.7 lab3_challenge3 写时复制Copy On Write难度&#9733;&#9733;&#9733;&#9734;&#9734; ## 5.7 lab3_challenge3 写时复制Copy On Write难度&#9733;&#9733;&#9733;&#9734;&#9734;[头歌实验链接](https://www.educoder.net/shixuns/lfhrecys/challenges)
<a name="lab3_challenge3_app"></a> <a name="lab3_challenge3_app"></a>
@ -1585,3 +1597,6 @@ System is shutting down with exit code 0.
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。** **另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。

@ -32,6 +32,9 @@
- [给定应用](#lab4_challenge3_app) - [给定应用](#lab4_challenge3_app)
- [实验内容](#lab4_challenge3_content) - [实验内容](#lab4_challenge3_content)
- [实验指导](#lab4_challenge3_guide) - [实验指导](#lab4_challenge3_guide)
- [6.8 challengeX Put it all together难度&#9733;&#9733;&#9733;&#9733;&#9733;](#challengeX)
- [实验内容](#challengeX_content)
- [加分内容](#challengeX_bonus)
<a name="fundamental"></a> <a name="fundamental"></a>
@ -1037,7 +1040,7 @@ RFS给每个文件都分配了一个硬链接数nlinks在rfs_dinode的定义
<a name="lab4_1_file"></a> <a name="lab4_1_file"></a>
## 6.2 lab4_1 文件 ## 6.2 lab4_1 文件[头歌实验链接](https://www.educoder.net/shixuns/jali46cf/challenges)
<a name="lab4_1_app"></a> <a name="lab4_1_app"></a>
@ -1328,9 +1331,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab4_1 is done." $ git commit -a -m "my work on lab4_1 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab4_2_dir"></a> <a name="lab4_2_dir"></a>
## 6.3 lab4_2 目录文件 ## 6.3 lab4_2 目录文件[头歌实验链接](https://www.educoder.net/shixuns/wn83kmuv/challenges)
<a name="lab4_2_app"></a> <a name="lab4_2_app"></a>
@ -1688,9 +1695,13 @@ RFS的读目录函数由rfs_readdir实现按照上文跟踪opendir_u的过程
$ git commit -a -m "my work on lab4_2 is done." $ git commit -a -m "my work on lab4_2 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab4_3_hardlink"></a> <a name="lab4_3_hardlink"></a>
## 6.4 lab4_3 硬链接 ## 6.4 lab4_3 硬链接[头歌实验链接](https://www.educoder.net/shixuns/bg6cpqtk/challenges)
<a name="lab4_3_app"></a> <a name="lab4_3_app"></a>
@ -2024,9 +2035,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab4_3 is done." $ git commit -a -m "my work on lab4_3 is done."
``` ```
#### **参考答案**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab4_challenge1_pwd"></a> <a name="lab4_challenge1_pwd"></a>
## 6.5 lab4_challenge1 相对路径(难度:&#9733;&#9733;&#9733;&#9734;&#9734; ## 6.5 lab4_challenge1 相对路径(难度:&#9733;&#9733;&#9733;&#9734;&#9734;[头歌实验链接](https://www.educoder.net/shixuns/wfne9cxb/challenges)
<a name="lab4_challenge1_app"></a> <a name="lab4_challenge1_app"></a>
@ -2214,9 +2229,13 @@ $ git commit -a -m "my work on lab4_3 is done."
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。** **另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab4_challenge2_exec"></a> <a name="lab4_challenge2_exec"></a>
## 6.6 lab4_challenge2 重载执行(难度:&#9733;&#9733;&#9733;&#9733;&#9734; ## 6.6 lab4_challenge2 重载执行(难度:&#9733;&#9733;&#9733;&#9733;&#9734;[头歌实验链接](https://www.educoder.net/shixuns/b3zijkmx/challenges)
<a name="lab4_challenge2_app"></a> <a name="lab4_challenge2_app"></a>
@ -2364,9 +2383,13 @@ $ git commit -a -m "my work on lab4_3 is done."
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。** **另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="lab4_challenge3_shell"></a> <a name="lab4_challenge3_shell"></a>
## 6.7 lab4_challenge3 简易Shell难度&#9733;&#9733;&#9733;&#9733;&#9733; ## 6.7 lab4_challenge3 简易Shell难度&#9733;&#9733;&#9733;&#9733;&#9733;[头歌实验链接](https://www.educoder.net/shixuns/oc8kfqb2/challenges)
<a name="lab4_challenge3_app"></a> <a name="lab4_challenge3_app"></a>
@ -2706,3 +2729,35 @@ shell是Linux中的一个重要概念主要用于和用户的交互。其基
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。** **另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
#### **更多指导**
请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
<a name="challengeX"></a>
## 6.8 challengeX Put it all together难度&#9733;&#9733;&#9733;&#9733;&#9733;
<a name="challengeX_content"></a>
#### 实验内容
本实验为综合实验,给定的应用为**前面四个实验的所有挑战实验**。有以下注意事项:
- 开始本实验前应至少完成[lab4_challenge3 简易Shell](#lab4_challenge3_shell)
- 考虑将之前的挑战实验融入简易Shell每个挑战对应的程序作为app可在简易shell中通过命令行调用执行
- app可预先编译、链接好放在host端的根目录或bin子目录通过PKE的VFS对它们进行访问
- 执行app即之前的挑战实验给定应用验证PKE内核对app的支持
- 在完成以上内容后,可考虑以下[加分内容](#challengeX_bonus)
<a name="challengeX_bonus"></a>
#### 加分内容
本挑战实验为**线下检查**,检查时可考虑对以下内容进行加分:
- 通过ls命令参考前面的实验自行编写列出hostfs文件系统里面的文件
- 通过后台执行app命令行间加入”&“符号)同时启动和运行多个进程;
- 管道功能("|"),即一个进程的输出作为另一个进程的输入;
- 命令历史、环境变量等;
- 对所得到的系统进行压力测试比如测试系统能同时启动的进程的最大个数、系统的I/O性能等

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Loading…
Cancel
Save