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.
|
|
|
|
# 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行!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|