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.

2.2 KiB

2018操作系统专题训练

实验3实现和测试报告

计53 王润基 2015011279

2018.11.16

实验目标

基于RustOS参考sv6完成多核实现和优化。

分为以下三个子任务:

  1. 实现x86_64和RISCV下的多核启动和通信
  2. 拓展线程管理模块,使之支持多核调度
  3. 学习sv6进行多核优化

前两个目标在三周前上一次报告时已经完成。

后来经过考虑发现补全RustOS的文件系统功能是一件比多核优化更紧迫的任务而且后者会依赖于前者。

因此这三周的任务调整为补全缺失的系统调用目标能运行用户态shell。

实现过程

修复RV原子操作

  • __atomic_compare_exchange_4之前的实现有Bug
  • 直接给标准库打补丁,修复了AtomicBool的实现不用再进行上层workaround

修复RV32多核

  • 原来context switch时忘了关中断
  • RV32下忘了开启其它核包括初始化页表正确设置新用户进程的sstatus

小的修改

  • 开启了RV下串口中断。getchar改为阻塞式。

    当从串口输入字符时,由中断处理程序将其放入全局缓冲区中。

    getchar从缓冲区中获取字符如果为空则挂起等待。

    空闲时QEMU的CPU占用率保持在10%左右。

  • 精简了x86 IDE驱动代码

修改SFS支持多线程

  • 基于朱书聪这段时间来对SFS的改进。
  • 将全部Rc/RefCell替换为Arc/Mutex。
  • 反转INode和Fs的所有权关系。
  • 为INode实现Sync/Send使得它可以定义在全局。

补全文件相关系统调用

  • 实现了File对象对应文件描述符层简单包装INode对象并加入权限检查。
  • 实现了系统调用read,write,open,close,fstat,dup,getdirentry。可以运行ls程序。
  • 实现了用户程序argc/argv。可以向ls传入参数。
  • 定义SysError错误类型并在syscall中使用简化错误处理代码。
  • 在INode接口下实现了Stdin/Stdout可以作为文件使用了。
  • 实现系统调用sys_exec。用户程序sh可以正常运行

具体分析

  • 文件系统部分Rust总代码量近约1000行而原版C的代码量有3000行