新学期伊始,华中科技大学团队在第一首歌中推出“基于RISCV的操作系统实验”,作为高校计算机专业课程《操作系统原理》的配套实验。方便即将开始学习操作系统,想通过实践练习巩固理论知识的大学生。同时支持各校老师使用这套实验进行辅助教学!

本实验课程基于RISC-V的代理内核,其中本实验开发设计的代理内核称为PKE。该实验可作为操作系统原理的课程实验和课程设计内容。实验的内容需要学习操作系统原理课程的读者独立完成,而课程设计的内容鼓励有条件的读者与他人合作。基于对各层次学生水平的考虑,实验组织结构分为基础部分和挑战部分,基础部分进一步分为操作系统中断、内存管理和进程三个概念,逐步引导学生建立关于操作系统核心知识的认知体系。在开始本实验之前,学生应具备计算机组成原理、汇编语言和C语言的基础知识,以及计算机系统基础的学习经验。同时,本实验课程的指导文档和源代码已经在Trustie平台开源。
Trustie在线实验指导书节选实验特性-RISCV代理内核
操作系统的本质是介于硬件和用户软件之间的大型软件系统,通过封装硬件来支持应用的运行。这一点在代理内核中表现得尤为明显:它的功能是为应用程序提供最基本的操作系统支持,并使它们能够在裸机上运行。由于这个特性,代理内核可以被视为操作系统的最小子集。在使用代理内核的场景下,计算机硬件和软件的界限以及代理内核的状态如下图所示:
计算机的软硬件界限以及代理内核在计算在这组实验中,华中科技大学团队选择的“裸机”是一台基于精简指令集的RISC-V计算机,这台计算机支持的指令集是RV64G。在实验中,他们使用Spike模拟器来模拟RISC-V计算机的行为,其中Spike模拟器是RISC-V生态中重要的硬件模拟器,它通过软件忠实地“再现”了硬件的行为。与在真实物理机上开发操作系统相比,使用模拟器开发操作系统实验具有环境加载和调试方便的优点。
RV64I的常用基础指令本次实验采用的代理内核方案避免了完全内核方案设计的诸多缺点,因为代理内核的存在是“天生”在硬件上支持应用的,设计的最小操作系统内核可以根据应用的复杂程度调整自身的复杂程度:比如,如果只是为了支持Helloworld!程序,它只需要加载和系统调用支持,不需要进程调度、设备、文件,甚至虚拟存储等。当支持的应用程序非常复杂时,代理内核就相当于一个完整的操作系统内核。从学习操作系统知识的角度来说,代理内核的这些特点更有利于学生从应用的角度来考察操作系统的硬件封装和支持,从而更好地理解原理课程所学的知识。
实验组织设计
PKE实验由三组基础实验和挑战实验组成。两个实验的基本内容和要求如下:
对于基础实验,第一组基础实验侧重于系统调用、异常和外部中断的知识;第二组基础实验侧重于主存管理的知识;第三组实验侧重于过程管理的知识。
对于挑战实验,每组实验的挑战实验可以理解为该组实验的挑战内容,只给出题目和预期效果。这部分实验指导文件只是给出了一个大方向,需要学生多查阅和了解课外内容。
PKE实验的组织结构图基础实验部分:
实验1_1:系统调用
改进PKE操作系统内核中的系统调用,实现应用程序的屏幕打印功能。
实验1_2:异常处理
改进PKE操作系统内核中的异常处理,以捕捉应用程序中的非法指令。
Lab1_3:外部中断
改进PKE操作系统内核对时钟中断的处理,实现时钟中断信息的打印。
2 _ 1:虚拟地址转换
改进PKE操作系统内核中的页表管理,实现应用加载和虚实地址映射。
实验2_2:简单的内存分配和回收
改进PKE操作系统内核中简单堆的管理,实现应用程序中简单的内存分配和回收。
2 _ 3:页面缺失异常
改进PKE操作系统内核中的栈页缺失异常处理,满足应用执行递归时对栈内存空的要求。
3 _ 1:流程创建
提高PKE操作系统内核对进程创建的支持,满足应用程序创建子进程的执行。
3 _ 2:过程产量

提高PKE操作系统内核对进程释放处理器的支持,使应用程序中的父子进程可以交替执行。
3 _ 3:循环调度
改进PKE操作系统内核中的循环调度支持,使应用程序中的父子进程用完时隙后交替执行。
基础实验实例-Lab2_1挑战部分:
实验1 _挑战1:打印用户程序调用堆栈
基于Lab1_3的第一组实验第一个挑战实验需要设计一个系统调用,应用程序通过调用系统调用打印自己的函数调用栈。
Lab1_challenge2:打印异常代码行
基于Lab1_3的第一组实验的第二个挑战实验,要求操作系统拦截异常指令,打印异常代码行的行号。
2 _ Challenge1:复杂页面缺失异常
基于Lab2_3的第二组实验的第一个挑战实验要求处理更复杂的缺页异常,并区分合法和非法缺页异常。
实验2 _挑战2:堆空管理
基于Lab2_3的第二组实验的第二个挑战实验,需要对堆进行更精细的管理。
3 _挑战1:流程等待和数据段复制
基于Lab2_3的第三组实验第一个挑战实验需要复制进程数据段和进程的等待函数。
3 _挑战2:实现信号量
基于Lab2_3的第三组实验的第二个挑战实验,要求同步执行信号量完成过程。
挑战实验实例-Lab1_challenge1请点击输学习与教学指南
第一个平台为每个实验建立了单独的代码仓库。每个实验完成后,学生需要记录自己在这个实验中的变化,在切换到下一个实验时,将自己在上一个实验中的变化填入之前对应的文件中。比如从Lab1_1切换到Lab1_2,需要在正式开始Lab1_2之前,将自己在Lab1_1中所做的改动填入之前在Lab1_1中修改过的文件中。使用Git direct clone的同学可以自动继承代码。
Git命令指导节选同时,华中科技大学团队在设计部署这组实验时,根据高校操作系统原理实验安排分为课内设计和课程设计两部分的经验,给出了以下两套教学方案:
方案一
课内实验包括所有基础实验;
课程设计学生可以在每组实验中选择一个挑战性实验。
对课内实验的建议是:每个基础实验=30分,每组实验总分90分;取三组实验的平均分后,实验报告总分加10分等于课内实验总分;对课程设计的建议是:每个挑战实验=30分,三个挑战实验总分之和,最后实验报告的10分等于课程设计总分。
选项2
课内实验包括所有基础实验,外加一个基础实验的挑战实验;

在每组实验中,课程设计的学生可以选择一个以前没有完成的挑战性实验。
对课内实验的建议是:每个基础实验=20分,加上一个挑战性实验,每组实验总分3*20+30=90分;取三组实验的平均分后,实验报告总分加10分等于课内实验总分;对课程设计的建议是:每个挑战实验=30分,三个挑战实验总分之和,最后实验报告的10分等于课程设计总分。
教学团队
邵志远
华中科技大学教授、博士。主要从事计算机体系结构、操作系统、FPGA、并行计算等领域的研究。主持了湖北省自然科学基金、国家自然科学基金、湖北省科技创新重大项目等多项省部级和国家级项目。参与了973计划、国家自然科学基金重大研究项目、国家自然科学基金重点项目等多项国家级项目。已在VEE、FPGA、DASFAA等重要学术会议和期刊上发表学术论文近50篇。获得10多项国家发明专利。获湖北省科技进步一等奖。他曾担任多个国际学术会议的项目委员会和项目委员会主席。现在他是IEEE和中国计算机联合会的成员。


