UCAS OS
本仓库是中国科学院大学操作系统研讨课的实验内容。本研讨课的实验基于RISC-V指令集,逐步实现了操作系统启动、进程调度和管理、虚拟内存、网卡驱动、文件系统等内容。
目录结构
将六个实验项目组织为了七个文件夹,其中第二个实验项目比较困难因此分为了两部分。后面的实验项目的完成过程中只对前面的实验项目的代码做了少量修改,基本没有删减功能。(例如Project3-6仍基于双核完成)。
- Project1-Bootloader
- Project2-A_Simple_Kernel_Part1
- Project2-A_Simple_Kernel_Part2
- Project3-Interactive_OS_and_Process_Management
- Project4-Virtual_Memory_Management
- Project5-Device_Driver
- Project6-File_System
开发环境
本实验用到的RISC-V开发板是XILINX PYNQ Z2开发板,开发板上有ARM核和FPGA,RISC-V核烧写到FPGA中。在开发板上电时由ARM核启动相关程序(BOOT.bin),将RISC-V核烧入FPGA。之后,RISC-V核自动加载相关程序。RISC-V核为采用SiFive开源的Rocket核心。其基本信息为:
- RV64IMAFDC(GC)指令集
- 双核五级流水处理器
- 数据/指令缓存大小各为16KB,4路组相联
- 时钟频率为100MHz
另外我们需要一张SD卡。将SD卡格式化为两个分区:第一个分区34MB,采用fat32文件系统;剩余空间全部划入第二个分区,保持第二个分区为空分区。制作完以后,将预先提供的BOOT.bin和RV_BOOT.bin拷入到第一个分区。
运行方法
拿到裸开发板以后,需要将开发板按如下方式配置:
- 将开发板设置为SD卡启动。PYNQ Z2支持从SD、QSPI和JTAG启动。我们将跳线插到最左侧,选择用SD卡启动。
- 设置电源选项。PYNQ Z2支持电源供电和Micro-USB供电。我们把跳线插到USB这个选项上,用Micro-USB直接供电。
配置完开发板后,可以按照各实验项目中的README进行操作。
实验总结
虽然完成了Project1-5的C-Core和Project6的A-Core,但还是有一些地方因为时间关系没来得及完成,算是留下了一些遗憾。
- Project6的代码应该可以运行C-Core的测试程序,但因为需要修改发包程序等而没有进行测试。
- Project6中关于文件系统的系统调用中的路径查找操作可以提取出来,形成一个单独的函数。
- Project6中软链接的实现共用了文件的数据块,不符合设计要求。
- Project5中网卡驱动的代码有很多冗余,可以删除部分无用代码让这一部分变得更优美。
- 部分需要在Shell中输出的系统调用的实现方式为用户态传入buffer的地址,内核将打印的内容填入buffer中让用户打印。但这种实现方式非常不优美,可以用prints完成一样的功能。
- 使用prints在Shell中输出的系统调用可能会打印超出屏幕边界。
- 进程只能阻塞在用户态:进程被解除阻塞后只能从用户态的代码开始执行。这一feature造成waitpid系统调用实现困难,因为父进程在子进程结束时被解除阻塞,此时父进程还要回收子进程的内核栈和PCB,但父进程被解除阻塞后只能从用户态的代码开始执行,没有机会进行回收操作。本人的waitpid系统调用实现非常tricky。
- 大部分系统调用没有进行参数检查。
- 双核运行的情况下进程两次获取当前的tick数可能获取到不同核的数据,造成时间测量精度差。
- 与体系结构相关的代码,特别是虚存管理部分的代码,没有写在arch/riscv目录下。
- 不能从SD卡的文件中加载可执行程序,可执行程序只能随内核一起编译并附带在内核中。
- 很多文件include了一些不必要的头文件,头文件的引用也有不规范的地方。