diff --git a/README.zh-CN.md b/README.zh-CN.md
index a96a0ea..3e6db14 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -1,4 +1,4 @@
-# 基于RISC-V代理内核的操作系统课程实验与课程设计
+# 采用RISC-V代理内核的操作系统和系统能力培养实验
**操作系统部分的实验用课件(PPT)及视频讲解内容可通过[百度网盘](https://pan.baidu.com/s/1H3PWEGwTa_GVrhhLYDwCwg)下载,提取码:66a3**
@@ -11,8 +11,7 @@
- [1.3 机器的特权状态](chapter1_riscv.md#machinestates)
- [1.4 中断和中断处理](chapter1_riscv.md#traps)
- [1.5 页式虚存管理](chapter1_riscv.md#paging)
-- [1.6 什么是代理内核](chapter1_riscv.md#proxykernel)
-- [1.7 相关工具软件](chapter1_riscv.md#toolsoftware)
+- [1.6 相关工具软件](chapter1_riscv.md#toolsoftware)
[第二章. 实验环境配置与实验构成](chapter2_installation.md)
diff --git a/chapter1_riscv.md b/chapter1_riscv.md
index 9d9fb97..dc132a2 100644
--- a/chapter1_riscv.md
+++ b/chapter1_riscv.md
@@ -6,8 +6,7 @@
- [1.3 机器的特权状态](#machinestates)
- [1.4 中断和中断处理](#traps)
- [1.5 页式虚存管理](#paging)
-- [1.6 什么是代理内核](#proxykernel)
-- [1.7 相关工具软件](#toolsoftware)
+- [1.6 相关工具软件](#toolsoftware)
本章的1.1节将简单介绍RISC-V的诞生和发展历史,其后将介绍和讨论RISC-V体系结构的各个方面,如1.2节介绍汇编语言、1.3节讨论机器状态、1.4节分析中断和中断处理机制、1.5节讨论分页机制。最后,在1.6节介绍PKE实验涉及的工具软件,以及它们的使用方法。值得注意的是,RISC-V的体系结构本身就是一个庞大的知识体系,实际上是很难用一章的内容完全讲清楚的(我们鼓励对该体系结构感兴趣的读者延申阅读参考文献[开源指令集的指南](#references)以及[RISC-V instruction set manual](#references))。然而,不懂体系结构又无法理解操作系统和开展PKE的实验,所以本章将重点阐述和讨论与操作系统设计有关的知识内容,力求精简和突出重点。
@@ -677,41 +676,9 @@ satp寄存器包含一个44位的PPN,它指向了一个页表的根目录所
实际上,开启采用兆页或吉页的方法,在RISC-V规范中并未提供,应该是让各个设计RISC-V处理器的单位自行制定。考虑到我们的PKE实验并未涉及这些非基础页,所以在这里我们不打算对这部分内容进一步讨论。
-
-### 1.6 什么是代理内核
-
-代理内核是一种轻量级的应用程序执行环境,可以承载静态链接的RISC-V ELF文件,其运行机制如下图所示。
-
-
-
-图1.10 代理内核的概念
-
-如图1.10所示,代理内核的工作适配的场景是,既有主机(host)又有目标机(target)的场景。代理内核并非独立存在的系统,它不具有独自的IO实现,而是将IO功能代理到Host主机上。它可以看成是操作系统的一个极小集,为应用提供最基本的操作系统支撑,使得应用可以在只具备核心资源(包括处理器、内存)的裸机上运行。为实现IO操作,代理内核通过HTIF接口(Host Target Interface的缩写)同宿主机器交互,完成大量IO相关的系调用,其工作机制如下图所示。
-
-
-
-图1.11 代理内核与主机内核的交互
-
-图1.11中的Frontend Server可理解为在Host主机上运行的一个守护进程,它将二进制文件(如代理操作系统内核Proxy kernel)加载到内存,通过控制/状态寄存器使target机器复位,并启动代理内核。后者和Frontend Server通过共享内存的HTIF接口通讯,实现IO操作以及加载和执行目标应用程序的动作。当目标应用程序执行完毕后,目标机器通过tohost CSR通知主机端的Frontend。
-
-代理内核的设计,对于在类似于[Zedboard开发板](#references)这样的环境下开发、验证RISC-V处理器,以及面向所开发RISC-V处理器的应用有着极大的帮助。 Zedboard是一个搭载了ARM处理器核的FPGA系统,其中ARM硬核部分一般被称为PS,而FPGA部分一般被称为PL,PS和PL端共享内存。PS端可以运行一个完整的ARM版Linux系统(如ubuntu),成为图1.10中的Host部分,PL端的逻辑资源则可以用来编程形成一个RISC-V处理器(软核)。为了在RISC-V软核上运行目标应用,就可以采用代理内核的思路(而无需为RISC-V处理器去开发一个完整的操作系统),让在RISC-V上运行的代理内核通过HTIF去“共享”访问PS端所控制的所有外部设备,如终端、存储等。这样,可以极大加速开发-验证的循环,最终形成可靠的基于RISC-V的系统。
-
-例如,我们可以采用伯克利大学的开源项目[fpga-zynq](#references),在Zedboard开发板上测试所开发的RISC-V处理器,fpga-zynq就用到了代理内核[Proxy Kernel](#references)来支撑目标应用。运行结果如图1.12所示:
-
-
-
-图1.12 代理内核与主机内核的交互
-
-我们的PKE内核实验中,也存在两个并行的Host和Target系统,Host就是我们的开发主机,其上运行了一个类Linux的完整操作系统,而Target就是我们用[Spike](#references)模拟出来的RISC-V机器,目标应用程序将在代理内核中执行。系统运行过程中,代理内核借助Spike所提供的HTIF完成所有IO动作。
-
-我们认为,代理内核除了它的实用特性(如以上讨论的对RISC-V的开发和验证)外,具有很好的教学用途。在开发代理内核的过程中,学生只需要将精力放在对计算机的“核心资产”(即处理器和内存)的管理,和通过各种数据结构实现的逻辑到物理的映射上,而无须过多考虑对IO设备控制的细节。这些都有助于降低操作系统开发的复杂度,尽量降低学生开发的难度和复杂度。**同时,代理内核的目标是支撑给定目标应用,无需搞个“大而全”的内核,去运行各种可能的应用**。
-
-一个显而易见的事实是:**比起复杂的多进程网络服务器(如[Apache HTTP Server](https://httpd.apache.org/))所需要的操作系统支持而言,简单的Hello world!程序所需要的操作系统支持显然要少得多!**例如,PKE的第一个实验(lab1_1)所就采用了Hello world!程序作为目标应用,而支撑该应用的PKE内核代码只有500多行,这可能是世界上**最小**的“操作系统”了!基于该事实,采用代理内核思想设计操作系统实验的一个更Strong的理由,是我们可以通过对输入的目标应用的迭代(从易到难,从简单到复杂),反推代理操作系统内核本身的“进化”,学生在进化代理内核的过程中完成对操作系统课程知识点的学习。
-
-需要说明的是,我们的PKE实验代码即可以满足操作系统课程实验的开发需求,同时,所开发的代理内核可以无缝地在Zedboard开发板上运行。这样PKE实验实际上是同时兼顾了教学用途(采用Spike模拟RISC-V环境),和实际工程开发(在Zedboard开发板的PL上搭载需要验证的RISC-V处理器软核)用途的。这样,就为选择PKE实验的学生打下了一定的RISC-V(软硬协同)开发基础。
-
-### 1.7 相关工具软件
+
+### 1.6 相关工具软件
PKE的实验将涉及Linux环境下较多工具软件的使用,以下列出一些我们认为比较重要的工具软件,并简要介绍其使用方法。详细的使用方法,希望读者通过阅读其使用手册进一步掌握。
diff --git a/pictures/fig0_1.png b/pictures/fig0_1.png
new file mode 100644
index 0000000..2d4bc93
Binary files /dev/null and b/pictures/fig0_1.png differ
diff --git a/pictures/fig0-1.png b/pictures/fig0_2.png
similarity index 100%
rename from pictures/fig0-1.png
rename to pictures/fig0_2.png
diff --git a/preliminary.md b/preliminary.md
index 016ee41..bd6c6a0 100644
--- a/preliminary.md
+++ b/preliminary.md
@@ -1,25 +1,51 @@
## 前言
-本书的写作目标是围绕基于RISC-V的代理内核(Proxy Kernel),设计和指导读者完成一组实验作为《操作系统原理》课程的课程实验以及课程设计内容。课程实验的内容需要学习《操作系统原理》课程的读者独立完成,课程设计的内容则鼓励有条件的读者多人合作完成。我们希望通过本书所设计的实验,加深读者对原理课程所授知识的理解。
+本书的写作以及配套实验代码(PKE,见[riscv-pke](https://gitee.com/hustos/riscv-pke))的设计目标,是给出一套采用代理内核(Proxy Kernel)思想,在RISC-V平台上的一组由给定应用驱动的内核开发(操作系统部分)实验,以及和操作系统相关联的软硬协同设计(系统能力培养部分)实验。通过完成本书所给出的操作系统部分系列实验,读者能够建立《操作系统原理》课程中所学习到的概念对应的工程上的认识。进而,通过完成本书所给出的系统能力培养部分系列实验,读者能够进一步从工程角度,对现代计算机的硬件(系统结构)和软件(操作系统以及应用)所构成的整体系统建立起较为完整的认识。
-**操作系统的本质,是介于硬件和用户软件(应用)之间的一个大型软件系统,通过对硬件的包装来支撑应用的运行**。这一点,在代理内核(Proxy Kernel)上体现得尤为明显:它的作用是为应用提供最基本的操作系统支撑,使其能够在裸机(在实验中,我们采用的是Spike模拟器)上运行。正是由于这一特点,代理内核可以看成是操作系统的一个极小子集(对于代理内核的详细讨论,参见[1.6](chapter1.md#proxykernel))。在采用代理内核的场景下,计算机的软硬件界限以及代理内核的地位如图1.1所示。
+代理内核(Proxy Kernel)是操作系统内核的一种,但区别于传统的宏内核(Monolithic kernel)和微内核(Microkernel),它的实质是和主机“伴生”的操作系统,其在计算机系统中的地位和逻辑结构如下图所示:
-
+
-图1.1 计算机的软硬件界限以及代理内核在计算机中所处的地位
-在本书所设计的实验中,我们选择的“裸机”是一个基于精简指令集(RISC)的RISC-V计算机,该计算机所支撑的指令集为RV64G(支持RISC-V的通用标量指令集以及浮点等诸多扩展)。我们在实验中采用了Spike模拟器来模拟RISC-V计算机的行为,Spike模拟器是RISC-V生态中重要的硬件模拟器,它通过软件的办法忠实地“复现”了硬件的行为。相较于在真正的物理机器上开发操作系统,采用模拟器开发操作系统实验具有环境搭载方便,便于调试等优点。
-本书设计的实验并未采用完整操作系统内核的方案,这是因为如果采用完整内核的思路来设计实验,非常容易陷入某个模块(如启动、中断处理、内存管理、进程调度、设备管理、文件系统、Shell等等)的设计细节,整个过程虽然也会用到一些应用来验证,但设计的重点始终是操作系统本身。完整方案中,即使是为了运行一个最简单的Hello world!程序,都需要实现如用户态进程封装、进程调度等以及之前的一系列操作系统模块(如启动、中断处理、内存管理等),这样做反而忽略了操作系统对硬件进行封装以支撑应用运行的本质!同时,为了更“像”一个完整的操作系统,完整操作系统内核实验方案往往需要自己“发明”一个简单文件系统,并用它来组织虚拟磁盘(一般是用一个文件来模拟),这样就不得不引入大量与应用支撑无关的代码,导致了工程庞大和重点不突出等诸多问题。
+通过上图可以看到,代理内核仅运行在目标机(target)上,支撑目标机上应用(Application)的执行。为了完成一些跟硬件相关的功能(如显示、读取主机上的数据等),代理内核可以通过HTIF(Host-Target InterFace)接口与主机上运行的前端服务器(Front-end server)进行通讯,由后者完成所需的硬件功能。这样,**代理内核的设计就可以无需自己去实现显示、访问数据这些与具体设备相关的琐碎的功能**。同时,**代理内核的设计目标从来都不是一个完整的操作系统**,而是只需要支撑所给定的应用的执行就好!这意味着随着应用的不同,代理内核的设计可以简单也可以复杂。
-代理内核方案避免了完整内核方案以上的很多缺点,因为代理内核的存在“天生”就是为在硬件(模拟器)上支撑应用,而设计的最小化的操作系统内核。**它可以根据应用的复杂度的不同,调整自身的复杂度**:例如,如果只是为了支撑Hello world!程序,它就只需要加载、系统调用支持即可,无需进程调度、设备、文件,甚至虚拟存储等等内容。当然,如果所支撑的应用非常复杂(例如,一个多线程的网络媒体服务器),代理内核将约等于一个完整的操作系统内核!**从学习操作系统知识的角度来看,代理内核的这些特点更有利于读者站在应用的角度来审视操作系统对硬件的包装和为应用所做的支撑,从而更好地理解从原理课程所学到的知识**。也正是代理内核的这些优点,驱使我们在RISC-V Proxy Kernel and Boot Loader这个开源项目[ProxyKernel](#references)的基础上,开发并设计了本书的一组操作系统实验。为了与开源项目进行区分,在本书中,我们将称我们开发和设计的代理内核为PKE(Proxy Kernel for Education)。
+总结起来,代理内核具有以下特点:
-为完成本书所设计的实验,读者应具备汇编语言、C语言、基础的计算机体系结构知识、Linux环境中的基础软件(如编译器、常见命令,以及git工具等)的使用,这些基础知识。考虑到《计算机组成原理》课程与《操作系统原理》课程在开课时间上可能的重叠,以及RISC-V汇编语言和8086汇编语言的巨大不同,我们将在第一章介绍RISC-V计算机的体系结构的相关知识。从第二章开始,我们将开始介绍PKE的实验。在完成PKE的5个实验后,本书的第七章将给出操作系统课程设计题目。
+- **代码的极简化**
-
-
-参考文献:
+ **代理内核能够通过HTIF接口与主机通讯来完成简单I/O操作、以及对文件数据的访问,能够(至少在内核初始阶段)实现与设备的无关性**。这一点能够有效避免采用传统操作系统内核设计作为《操作系统原理》辅助实验的场景中,学生因为一上来就迷失在设备初始化、复杂文件系统等(这些往往需要另外的指导手册)内容中出不来,最后不得不放弃的情况。
+
+- **系统规模随应用变化**
+
+ **代理内核的设计,往往只需要满足给定应用的执行,所以它自身的规模与复杂度是跟应用的要求紧密联系的**。当应用相对简单时,代理内核的设计只需要很少量的代码就能够完成。例如,为了在第一个实验中支持“Hello world!”应用程序的执行,我们的PKE实验代码([riscv-pke](https://gitee.com/hustos/riscv-pke))只需要500行代码;即使做到支持多任务应用这种复杂场景,我们的PKE实验代码也只需要1000行代码!
+
+- **概念和功能上的完整性**
+
+ **代理内核在实现代码规模的极简化的同时,并未牺牲作为一个操作系统在概念和功能上的完整性**。这是因为虽然它的设计将I/O交给了HTIF和与主机进行的通讯,代理内核仍然必须考虑对处理器、内存这些计算机“核心资产”的管理。同时,在系统能力培养实验阶段,代理内核还将管理连接到目标机(target)的定制化的设备的管理。所以,代理内核的设计极大地保留了操作系统的完整性。
+
+
+
+从实验的构成来看,PKE共开发了四组实验。其中前三组实验是为《操作系统原理》课程开发的配套实验,这三组实验分别涵盖了中断、内存管理,以及进程调度等操作系统原理的核心内容。PKE的第四组实验面向的是《系统能力培养》课程,该实验将发挥代理内核的实用性特点,在搭载了RISC-V处理器核的FPGA开发板(我们采用的是PYNQ Z1)上,实现所开发操作系统内核的部署以及软硬协同设计,从而实现如[视频](https://www.bilibili.com/video/BV1aL4y1A7RS/?vd_source=a17fc28107fa1bd622ace79a17bd6e54)所示的采用蓝牙进行操控的Arduino小车。本书采用代理内核的思想来构建《操作系统原理》课程的实验内容,并以此为基础,进而构造《系统能力培养》课程的实验内容。
+
+从工程设计的角度来看,课程实验内容的设计具有以下特点:
+
+- **循序渐进、突出阶段性重点**
+
+ 采用代理内核的概念设计的**操作系统实验就能够做到将重点放在处理器、内存这些核心资产的管理上**,同时,在**其扩展阶段(系统能力培养实验)再将重点转移到I/O设备上**,从而形成一个相对完整的计算机系统。
+
+- **基础和挑战并存**
+
+ **在PKE的每组实验中,我们将设计基础实验和挑战实验两个部分**。读者在完成基础试验后,可以选择自己感兴趣的挑战实验进一步加深对所学知识的理解。同时,也可以**发挥自己的想象力**,“发明”新的挑战实验,以获得更大的满足感(和更高的成绩)。
+
+- **教学性和实用性并存**
+
+ 本书中代理内核的设计,**面向的运行环境为采用精简指令集RISC-V的64位机器(支持RV64G)**。通过操作系统和系统能力培养部分实际系统的设计,读者能够在64位(今天广为采用且将来不大可能过时)的基础上,了解RISC-V指令集以及采用该指令集的计算机设计相关的知识。同时,由于代理内核本身有其实际工程意义,读者能够在实验的基础上,自己“发明”更有趣的计算机系统并对其进行验证。
+
+
+
+完成操作系统部分的实验,读者需要具备以下知识:C语言(熟练掌握)、汇编语言(了解基础知识)、操作系统原理(了解基础知识)、计算机系统结构(了解基础知识)、Linux的使用(了解);完成系统能力培养部分的实验,读者还需要具备以下知识:Verilog程序设计语言(了解基础知识)、FPGA开发(了解基础知识)、计算机接口技术(了解基础知识)。
+
+本书的组织结构如下:我们将在第一章介绍RISC-V计算机的体系结构的相关知识;第二章介绍实验环境的安装和使用;第三章到第六章为操作系统实验部分,分别设计了中断、内存管理和进程管理三个操作系统原理基础知识点的相关实验;第七章为系统能力培养部分,实验通过软硬协同的设计,实现一个真实可用的能够响应蓝牙控制信号的Arduino小车。
-[ProxyKernel] RISC-V Proxy Kernel and Boot Loader. https://github.com/riscv/riscv-pk
-
\ No newline at end of file