You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
## 前言
本书的写作以及配套实验代码的设计目标, 是给出一套在RISC-V平台上的一组由给定应用驱动的操作系统内核开发( 操作系统部分) 实验, 以及和操作系统相关联的软硬协同设计( 系统能力培养部分) 实验。通过完成本书所给出的操作系统部分系列实验, 读者能够建立与《操作系统原理》课程中所学习到的概念相对应的工程上的认识。进而, 通过完成本书所给出的系统能力培养部分系列实验, 读者能够从工程角度, 对现代计算机的硬件( 涉及《计算机组成原理》和《接口技术》等课程) 和底层软件( 涉及《操作系统原理》课程) 所构成的整体系统建立起较为完整的认识。
RISC-V是一套新兴的开放指令集系统, 采用RISC-V指令集设计的处理器由于没有指令集版权的羁绊, 正在成为处理器设计者的开发首选。我们的实验将围绕64位RISC-V机器( 支持RV64G指令集) 展开, 在操作系统实验部分, 读者将在一组给定应用的驱动下, 开发基于代理内核( PKE, 见[riscv-pke](https://gitee.com/hustos/riscv-pke)) 思想的操作系统内核; 在系统能力培养实验部分, 我们在FPGA开发板( PYNQ Z1) 上实际部署一个RISC-V处理器软核, 通过一组实验将处理器软核与外设( PL端的马达、蓝牙) 进行互联, 继而扩展操作系统部分开发的代理内核, 通过一组实验使其能够控制连接到FPGA开发板上的设备( 包括PL端的马达、蓝牙, 以及PS端的设备如摄像头) , 并在Arduino小车上最终让所有软、硬件代码都“跑”起来! 做完后的效果可以参考这个[视频](https://www.bilibili.com/video/BV1aL4y1A7RS/?vd_source=a17fc28107fa1bd622ace79a17bd6e54)。
代理内核( Proxy Kernel) 是操作系统内核的一种, 但区别于传统的宏内核( Monolithic kernel) 和微内核( Microkernel) , 它的实质是和主机“伴生”的操作系统, 其在计算机系统中的地位和逻辑结构如下图所示:
< img src = "pictures/fig0_1.png" alt = "fig0_1" style = "zoom:80%;" />
通过上图可以看到, 代理内核仅运行在目标机( target) 上, 支撑目标机上应用( Application) 的执行。为了完成一些跟硬件相关的功能( 如显示、读取主机上的数据等) , 代理内核可以通过HTIF( Host-Target InterFace) 接口与主机上运行的前端服务器( Front-end server) 进行通讯, 由后者完成所需的硬件功能。这样, **代理内核的设计就可以无需自己去实现显示、访问数据这些与具体设备相关的琐碎的功能**。同时,**代理内核的设计目标从来都不是一个完整的操作系统,而是只需要支撑所给定的应用的执行就好**!这意味着随着应用的不同,代理内核的设计可以简单也可以复杂。
总结起来,代理内核具有以下特点:
- **代码的极简化**
** 代理内核能够通过HTIF接口与主机通讯来完成简单I/O操作、以及对文件数据的访问, 能够( 至少在内核初始阶段) 实现与设备的无关性**。这一点能够有效避免采用传统操作系统内核设计作为《操作系统原理》辅助实验的场景中,学生因为一上来就迷失在设备初始化、复杂文件系统等(这些往往需要另外的指导手册)内容中出不来,最后不得不放弃的情况。
- **系统规模随应用变化**
** 代理内核的设计,往往只需要满足给定应用的执行,所以它自身的规模与复杂度是跟应用的要求紧密联系的**。当应用相对简单时, 代理内核的设计只需要很少量的代码就能够完成。例如, 为了在第一个实验中支持“Hello world!”应用程序的执行, 我们的PKE实验代码( [riscv-pke](https://gitee.com/hustos/riscv-pke)) 只需要500行代码; 即使做到支持多任务应用这种复杂场景, 我们的PKE实验代码也只需要1000行代码!
- **概念和功能上的完整性**
** 代理内核在实现代码规模的极简化的同时,并未牺牲作为一个操作系统在概念和功能上的完整性**。这是因为虽然它的设计将I/O交给了HTIF和与主机进行的通讯, 代理内核仍然必须考虑对处理器、内存这些计算机“核心资产”的管理。同时, 在系统能力培养实验阶段, 代理内核还将管理连接到目标机( target) 的定制化的设备的管理。所以, 代理内核的设计极大地保留了操作系统的完整性。
- **实用性**
** 代理内核实际上是用于验证所开发的处理器的重要手段**。例如, 某公司开发了一款采用RISC-V指令集的处理器, 为了验证该处理器是否满足它所面向的应用场景, 就可以采用FPGA开发板( 如我们采用的PYNQ-Z1) , 将所开发的处理器以软核的形式部署在开发板的PL端, 以类似于本书中系统能力培养实验的方法在所开发的处理器( 软核) 上部署代理内核和应用, 以检验系统整体的完整性。
本书所设计的实验分为两大部分, 分别用于满足《操作系统原理》课程和《系统能力培养》课程的教学需要。其中, 第一部分包含了PKE的前三组实验, 分别涵盖了中断、内存管理, 以及进程调度等《操作系统原理》课程的核心内容。第二部分采用软硬协同设计的办法构建《系统能力培养》课程实验: 硬件部分指导读者在FPGA开发板上部署RISC-V处理器核, 并完成的三个基础硬件实验( UART支持、中断支持和蓝牙小车集成) ; 软件部分则包含与硬件部分配合的第四组PKE实验( 涵盖设备管理和文件访问) 。无论是操作系统部分还是系统能力培养部分, 每组PKE实验又包含了3个基础实验与一些挑战实验, 基础实验实现操作系统的基础功能, 挑战实验部分在基础实验的基础上扩展系统的功能, 使得系统能够处理更复杂的问题。
从工程设计的角度来看,本书所设计的课程实验内容具有以下特点:
- **循序渐进、突出阶段性重点**
采用代理内核的概念设计的**操作系统实验就能够做到将重点放在处理器、内存这些核心资产的管理上**,同时,在**其扩展阶段( 系统能力培养实验) 将重点转移到I/O设备上**,从而培养学生对作为整体的计算机系统的认识。
- **教学性和实用性并存**
本书中代理内核的设计,**面向的运行环境为采用精简指令集RISC-V的64位机器( 支持RV64G) **。通过操作系统和系统能力培养部分实际系统的设计, 读者能够在64位( 今天广为采用且将来不大可能过时) 的基础上, 了解RISC-V指令集以及采用该指令集的计算机设计相关的知识。同时, 由于代理内核本身有其实际工程意义, 读者能够在实验的基础上, 自己“发明”更有趣的计算机系统并对其进行验证。
- **基础和挑战并存**
** 在PKE的每组实验中, 我们将设计基础实验和挑战实验两个部分**。读者在完成基础试验后,可以选择自己感兴趣的挑战实验进一步加深对所学知识的理解。同时,也可以**发挥自己的想象力**,“发明”新的挑战实验,以获得更大的满足感(和更高的成绩)。
完成操作系统部分的实验, 读者需要具备以下知识: C语言( 熟练掌握) 、汇编语言( 了解基础知识) 、操作系统原理( 了解基础知识) 、计算机系统结构( 了解基础知识) 、Linux的使用( 了解) ; 完成系统能力培养部分的实验, 读者还需要具备以下知识: Verilog程序设计语言( 熟练掌握) 、FPGA开发( 了解基础知识) 、计算机接口技术( 了解基础知识) 。