diff --git a/chapter3_traps.md b/chapter3_traps.md
index 1109562..bac51b3 100644
--- a/chapter3_traps.md
+++ b/chapter3_traps.md
@@ -892,9 +892,10 @@ spike基于HTIF内存的传递,定义了一组HTIF调用(类似于操作系
-## 3.2 lab1_1 系统调用
+## 3.2 lab1_1 系统调用([头歌实验链接](https://www.educoder.net/shixuns/lawkz324/challenges))
+
#### **给定应用**
- 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."
```
+#### **参考答案**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 3.3 lab1_2 异常处理
+## 3.3 lab1_2 异常处理([头歌实验链接](https://www.educoder.net/shixuns/tznof6hx/challenges))
@@ -1323,11 +1326,13 @@ lab1_2实验需要读者了解和掌握操作系统中异常(exception)的
$ git commit -a -m "my work on lab1_2 is done."
```
+#### **参考答案**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 3.4 lab1_3 (外部)中断
+## 3.4 lab1_3 (外部)中断 ([头歌实验链接](https://www.educoder.net/shixuns/wp4ys5ag/challenges))
@@ -1619,11 +1624,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab1_3 is done."
```
+#### **参考答案**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 3.5 lab1_challenge1 打印用户程序调用栈(难度:★★★☆☆)
+## 3.5 lab1_challenge1 打印用户程序调用栈(难度:★★★☆☆,[头歌实验链接](https://www.educoder.net/shixuns/9i8lur4h/challenges))
@@ -1798,11 +1805,13 @@ uint64 elf_fpread(elf_ctx *ctx, void *dest, uint64 nb, uint64 offset)
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
+#### **更多指导**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 3.6 lab1_challenge2 打印异常代码行(难度:★★★☆☆)
+## 3.6 lab1_challenge2 打印异常代码行(难度:★★★☆☆,[头歌实验链接](https://www.educoder.net/shixuns/5apy6ojf/challenges))
@@ -1883,11 +1892,13 @@ $ git merge lab1_3_irq -m "continue to work on lab1_challenge1"
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
+#### **更多指导**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 3.7 lab1_challenge3 多核启动及运行(难度:★★★★☆)
+## 3.7 lab1_challenge3 多核启动及运行(难度:★★★★☆,[头歌实验链接](https://www.educoder.net/shixuns/2znkcmh9/challenges))
之前的实验都在单核环境下进行。在本次实验中,你需要修改操作系统内核使其支持两核并发运行,并且在每个核上加载一个程序运行,等到两个程序都执行完毕后退出并关闭模拟器。
@@ -2000,3 +2011,6 @@ spike模拟器支持`-p`选项来模拟多个核,在pke中,通过`spike -p2
1. 对于riscv处理器,有一个寄存器`tp (thread pointer)`是专门用来保存hart相关信息的,可以利用此寄存器存储每个核关于自身的信息。
2. `kernel/sync_utils.h`提供了一个简单的同步屏障的实现,你可以通过这个同步原语实现并发控制,或者自行设计其它同步原语。
+#### **更多指导**
+
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
\ No newline at end of file
diff --git a/chapter4_memory.md b/chapter4_memory.md
index 87f988d..8580038 100644
--- a/chapter4_memory.md
+++ b/chapter4_memory.md
@@ -321,7 +321,7 @@ load_user_program()函数对于应用进程逻辑空间的操作可以分成以
-## 4.2 lab2_1 虚实地址转换
+## 4.2 lab2_1 虚实地址转换([头歌实验链接](https://www.educoder.net/shixuns/l87hxkyb/challenges))
@@ -457,11 +457,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab2_1 is done."
```
+#### **参考答案**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 4.3 lab2_2 简单内存分配和回收
+## 4.3 lab2_2 简单内存分配和回收([头歌实验链接](https://www.educoder.net/shixuns/hbmok6cf/challenges))
@@ -612,11 +614,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab2_2 is done."
```
+#### **参考答案**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 4.4 lab2_3 缺页异常
+## 4.4 lab2_3 缺页异常([头歌实验链接](https://www.educoder.net/shixuns/zepyv5fu/challenges))
@@ -801,11 +805,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab2_3 is done."
```
+#### **参考答案**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 4.5 lab2_challenge1 复杂缺页异常(难度:★☆☆☆☆)
+## 4.5 lab2_challenge1 复杂缺页异常(难度:★☆☆☆☆,[头歌实验链接](https://www.educoder.net/shixuns/xtyf8qwr/challenges))
@@ -917,9 +923,13 @@ $ git merge lab2_3_pagefault -m "continue to work on lab2_challenge1"
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
+#### **更多指导**
+
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
+
-## 4.6 lab2_challenge2 堆空间管理 (难度:★★★★☆)
+## 4.6 lab2_challenge2 堆空间管理 (难度:★★★★☆,[头歌实验链接](https://www.educoder.net/shixuns/ljzygpmb/challenges))
@@ -1040,11 +1050,13 @@ $ git merge lab2_3_pagefault -m "continue to work on lab2_challenge2"
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
+#### **更多指导**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 4.7 lab2_challenge3 多核内存管理(难度:★★☆☆☆)
+## 4.7 lab2_challenge3 多核内存管理(难度:★★☆☆☆,[头歌实验链接](https://www.educoder.net/shixuns/fitplahw/challenges))
@@ -1241,3 +1253,6 @@ void *alloc_page(void) {
在实验的基础代码中,有一些打印分配内存地址的代码,你需要将这部分代码改为支持多核执行的版本,然后便可以阅读执行后的输出来判断是否为每个进程分配得到的物理内存页和对应的虚拟内存。
+#### **更多指导**
+
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
\ No newline at end of file
diff --git a/chapter5_process.md b/chapter5_process.md
index cdb8022..6e42991 100644
--- a/chapter5_process.md
+++ b/chapter5_process.md
@@ -447,7 +447,7 @@ PKE操作系统内核通过调用schedule()函数来完成进程的选择和换
-## 5.2 lab3_1 进程创建(fork)
+## 5.2 lab3_1 进程创建(fork)([头歌实验链接](https://www.educoder.net/shixuns/lf3vgx7c/challenges))
@@ -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."
```
+#### **参考答案**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 5.3 lab3_2 进程yield
+## 5.3 lab3_2 进程yield([头歌实验链接](https://www.educoder.net/shixuns/e7q4csmt/challenges))
@@ -879,11 +881,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab3_2 is done."
```
+#### **参考答案**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 5.4 lab3_3 循环轮转调度
+## 5.4 lab3_3 循环轮转调度([头歌实验链接](https://www.educoder.net/shixuns/3cvhjfw4/challenges))
@@ -1089,11 +1093,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab3_3 is done."
```
+#### **参考答案**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 5.5 lab3_challenge1 进程等待和数据段复制(难度:★★☆☆☆)
+## 5.5 lab3_challenge1 进程等待和数据段复制(难度:★★☆☆☆,[头歌实验链接](https://www.educoder.net/shixuns/hwtam4is/challenges))
@@ -1225,9 +1231,13 @@ $ git merge lab3_3_rrsched -m "continue to work on lab3_challenge1"
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
+#### **更多指导**
+
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
+
-## 5.6 lab3_challenge2 实现信号量(难度:★★★☆☆)
+## 5.6 lab3_challenge2 实现信号量(难度:★★★☆☆,[头歌实验链接](https://www.educoder.net/shixuns/ehb5zf9f/challenges))
@@ -1427,11 +1437,13 @@ $ git merge lab3_3_rrsched -m "continue to work on lab3_challenge1"
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
+#### **更多指导**
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
-## 5.7 lab3_challenge3 写时复制(Copy On Write)(难度:★★★☆☆)
+## 5.7 lab3_challenge3 写时复制(Copy On Write)(难度:★★★☆☆,[头歌实验链接](https://www.educoder.net/shixuns/lfhrecys/challenges))
@@ -1585,3 +1597,6 @@ System is shutting down with exit code 0.
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
+#### **更多指导**
+
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
\ No newline at end of file
diff --git a/chapter6_filesystem.md b/chapter6_filesystem.md
index e2ff9ed..84eda67 100644
--- a/chapter6_filesystem.md
+++ b/chapter6_filesystem.md
@@ -32,6 +32,9 @@
- [给定应用](#lab4_challenge3_app)
- [实验内容](#lab4_challenge3_content)
- [实验指导](#lab4_challenge3_guide)
+- [6.8 challengeX :Put it all together(难度:★★★★★)](#challengeX)
+ - [实验内容](#challengeX_content)
+ - [加分内容](#challengeX_bonus)
@@ -1037,7 +1040,7 @@ RFS给每个文件都分配了一个硬链接数nlinks,在rfs_dinode的定义
-## 6.2 lab4_1 文件
+## 6.2 lab4_1 文件([头歌实验链接](https://www.educoder.net/shixuns/jali46cf/challenges))
@@ -1328,9 +1331,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab4_1 is done."
```
+#### **参考答案**
+
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
+
-## 6.3 lab4_2 目录文件
+## 6.3 lab4_2 目录文件([头歌实验链接](https://www.educoder.net/shixuns/wn83kmuv/challenges))
@@ -1688,9 +1695,13 @@ RFS的读目录函数由rfs_readdir实现(按照上文跟踪opendir_u的过程
$ git commit -a -m "my work on lab4_2 is done."
```
+#### **参考答案**
+
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
+
-## 6.4 lab4_3 硬链接
+## 6.4 lab4_3 硬链接([头歌实验链接](https://www.educoder.net/shixuns/bg6cpqtk/challenges))
@@ -2024,9 +2035,13 @@ System is shutting down with exit code 0.
$ git commit -a -m "my work on lab4_3 is done."
```
+#### **参考答案**
+
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
+
-## 6.5 lab4_challenge1 相对路径(难度:★★★☆☆)
+## 6.5 lab4_challenge1 相对路径(难度:★★★☆☆,[头歌实验链接](https://www.educoder.net/shixuns/wfne9cxb/challenges))
@@ -2214,9 +2229,13 @@ $ git commit -a -m "my work on lab4_3 is done."
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
+#### **更多指导**
+
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
+
-## 6.6 lab4_challenge2 重载执行(难度:★★★★☆)
+## 6.6 lab4_challenge2 重载执行(难度:★★★★☆,[头歌实验链接](https://www.educoder.net/shixuns/b3zijkmx/challenges))
@@ -2364,9 +2383,13 @@ $ git commit -a -m "my work on lab4_3 is done."
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
+#### **更多指导**
+
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
+
-## 6.7 lab4_challenge3 简易Shell(难度:★★★★★)
+## 6.7 lab4_challenge3 简易Shell(难度:★★★★★,[头歌实验链接](https://www.educoder.net/shixuns/oc8kfqb2/challenges))
@@ -2706,3 +2729,35 @@ shell是Linux中的一个重要概念,主要用于和用户的交互。其基
**另外,后续的基础实验代码并不依赖挑战实验,所以读者可自行决定是否将自己的工作提交到本地代码仓库中(当然,提交到本地仓库是个好习惯,至少能保存自己的“作品”)。**
+#### **更多指导**
+
+请参考本文档的[纸质书](https://www.ryjiaoyu.com/book/details/50200)。
+
+
+
+## 6.8 challengeX :Put it all together(难度:★★★★★)
+
+
+
+#### 实验内容
+
+本实验为综合实验,给定的应用为**前面四个实验的所有挑战实验**。有以下注意事项:
+
+- 开始本实验前应至少完成[lab4_challenge3 简易Shell](#lab4_challenge3_shell);
+- 考虑将之前的挑战实验融入简易Shell,每个挑战对应的程序作为app,可在简易shell中通过命令行调用执行;
+- app可预先编译、链接好,放在host端的根目录(或bin子目录)下,通过PKE的VFS对它们进行访问;
+- 执行app(即之前的挑战实验给定应用),验证PKE内核对app的支持;
+- 在完成以上内容后,可考虑以下[加分内容](#challengeX_bonus):
+
+
+
+#### 加分内容
+
+本挑战实验为**线下检查**,检查时可考虑对以下内容进行加分:
+
+- 通过ls命令(参考前面的实验,自行编写)列出hostfs文件系统里面的文件;
+- 通过后台执行(app命令行间加入”&“符号)同时启动和运行多个进程;
+- 管道功能("|"),即一个进程的输出作为另一个进程的输入;
+- 命令历史、环境变量等;
+- 对所得到的系统进行压力测试,比如测试系统能同时启动的进程的最大个数、系统的I/O性能等;
+