uCore-Tutorial-Guide-2023S/source/chapter8/0exercise.rst

169 lines
12 KiB
ReStructuredText
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

chapter8练习
================================================
.. _term-chapter8:
- 本节难度:**对OS的全局理解要求较高**
- 实验分为基础作业实验和扩展作业实验(二选一)。
基础作业
-------------------------------------------------
**在保持 syscall 数量和基本含义不变的情况下,通过对 OS 内部的改进,提升 OS 的质量**
同学们通过独立完成前面 7 个实验后,应该对于操作系统的核心关键机制有了较好的了解,并知道如何形成一个有进程 / 地址空间 / 文件核心概念的基本功能 OS。但同学自制的 OS 可能还需进一步完善,才能在功能 / 性能 / 可靠性上进一步进化,以使得 lab8 测试用例的正常运行。
第 8 个实验的目的是希望同学们能够在完成前 7 个实验的基础上,站在全局视角,分析 lab2~lab8 测试用例(没增加新的 syscall 访问,只是更加全面和深入地测试操作系统的质量和能力)的运行情况,分析和理解自己写的 OS 是否能比较好地满足应用需求?如果不满足应用需求,或者应用导致系统缓慢甚至崩溃,那原因出在哪里?应该如何修改?修改后的 OS 是否更加完善还是缺陷更多?
实验要求
+++++++++++++++++++++++++++++++++++++++++++++++++++++
- 实现分支ch8。
- 运行 `lab8测例 <https://github.com/DeathWish5/rCore_tutorial_tests>`_ ,观察并分析 ch8 中部分测试用例对 lab7 OS 造成的不良影响。
- 结合你学到的操作系统课程知识和你的操作系统具体实践情况,分析你写的 lab7 OS 对 lab8 的 app 支持不好的原因,比如:为何没运行通过,为何死在某处了,为何系统崩溃,为何系统非常缓慢。分析可能的解决方法。(2~4 个4 个合理的分析就可得到满分,超过 4 个不额外得分)。
- 更进一步完成编程实现,使其可以通过一些原本 fail 的测例。(12 个,超过 2 个不额外得分)。
报告要求
+++++++++++++++++++++++++++++++++++++++++++++++++++++
- 对于失败测例的现象观察,原因分析,并提出可能的解决思路(2~4个)。
- 编程实现的具体内容,不需要贴出全部代码,重要的是描述清楚自己的思路和做法(1~2个)。
- (optional)你对本次实验的其他看法。
其他说明
+++++++++++++++++++++++++++++++++++++++++++++++++++++
- 注意:编程实现部分的底线是 OS 不崩溃如果你解决不了问题就解决出问题的进程。可以通过简单杀死进程方式保证OS不会死掉。比如不支持某种 corner case就把触发该 case 的进程杀掉,如果是这样,至少完成两个。会根据报告综合给分。
- 有些测例属于非法程序,比如申请过量内存,对于这些程序,杀死进程其实就是正确的做法。参考: `OOM killer <https://docs.memset.com/other/linux-s-oom-process-killer>`_
- 不一定所有的测例都会导致自己实现的 OS 崩溃,与语言和实现都有关系,选择出问题的测例分析即可。对于没有出错的测例,可以选择性分析自己的 OS 是如何预防这些"刁钻"测例的。对于测例没有测到的,也可以分析自己觉得安全 / 高效的实现,只要分析合理及给分。
- 鼓励针对有趣的测例进行分析!开放思考!
.. note::
1. **lab8 分值与前 7 个 lab 相同,截至是时间为 15 周周末,基础实验属于必做实验(除非你选择做扩展作业来代替基础作业)**
2. 在测例中有简明描述想测试OS哪方面的质量。同学请量力而行推荐不要超过上述上限。咱们不要卷。
3. 对于有特殊要求的同学(比如你觉得上面的实验太难),可单独找助教或老师说出你感兴趣或力所能及的实验内容,得到老师和助教同意后,做你提出的实验。
4. **欢迎同学们贡献新测例有意义测例经过助教检查可以写进报告充当工作量欢迎打掉框架代码OS也欢迎打掉其他同学的OS**
实验检查
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 实验目录要求
目录要求不变(参考 lab1 目录或者示例代码目录结构)。同样在 os 目录下 `make run` 之后可以正确加载用户程序并执行。
加载的用户测例位置: `../user/build/elf`
- 检查
可以正确 `make run` 执行,可以正确执行目标用户测例,并得到预期输出(详见测例注释)。
问答作业
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
.. _term-chapter8-extended-exercise:
拓展作业(可选)
-------------------------------------------------
给部分同学不同的OS设计与实现的实验选择。扩展作业选项(1-14)基于 lab7 来实现,扩展作业选项(15)是发现目标内核(ch7 的 ucore / rcore os)漏洞。可选内容(有大致难度估计)如下:
1. 实现多核支持,设计多核相关测试用例,并通过已有和新的测试用例(难度8)
* 某学长的有bug的rcore tutorial参考实现 `https://github.com/xy-plus/rCore-Tutorial-v3/tree/ch7 <https://github.com/xy-plus/rCore-Tutorial-v3/tree/ch7?fileGuid=gXqmevn42YSgQpqo>`_
2. 实现slab内存分配算法通过相关测试用例(难度7)
* `https://github.com/tokio-rs/slab <https://github.com/tokio-rs/slab?fileGuid=gXqmevn42YSgQpqo>`_
3. 实现新的调度算法,如 CFS、BFS 等,通过相关测试用例(难度7)
* `https://en.wikipedia.org/wiki/Completely_Fair_Scheduler <https://en.wikipedia.org/wiki/Completely_Fair_Scheduler?fileGuid=gXqmevn42YSgQpqo>`_
* `https://www.kernel.org/doc/html/latest/scheduler/sched-design-CFS.html <https://www.kernel.org/doc/html/latest/scheduler/sched-design-CFS.html?fileGuid=gXqmevn42YSgQpqo>`_
4. 实现某种 IO buffer 缓存替换算法如2Q LRU-KLIRS等通过相关测试用例(难度6)
* `LIRS: http://web.cse.ohio-state.edu/~zhang.574/lirs-sigmetrics-02.html <http://web.cse.ohio-state.edu/~zhang.574/lirs-sigmetrics-02.html?fileGuid=gXqmevn42YSgQpqo>`_
* `2Q: https://nyuscholars.nyu.edu/en/publications/2q-a-low-overhead-high-performance-buffer-replacement-algorithm <https://nyuscholars.nyu.edu/en/publications/2q-a-low-overhead-high-performance-buffer-replacement-algorithm?fileGuid=gXqmevn42YSgQpqo>`_
* `LRU-K: https://dl.acm.org/doi/10.1145/170036.170081 <https://dl.acm.org/doi/10.1145/170036.170081?fileGuid=gXqmevn42YSgQpqo>`_
5. 实现某种页替换算法如Clock 二次机会算法等,通过相关测试用例(难度6)
6. 实现支持日志机制的可靠文件系统可参考OSTEP教材中对日志文件系统的描述(难度7)
7. 支持virtio disk的中断机制提高IO性能(难度4)
* `chapter8 https://github.com/rcore-os/rCore-Tutorial-Book-v3/tree/chy <https://github.com/rcore-os/rCore-Tutorial-Book-v3/tree/chy?fileGuid=gXqmevn42YSgQpqo>`_
* `https://github.com/rcore-os/virtio-drivers <https://github.com/rcore-os/virtio-drivers?fileGuid=gXqmevn42YSgQpqo>`_
* `https://github.com/belowthetree/TisuOS <https://github.com/belowthetree/TisuOS?fileGuid=gXqmevn42YSgQpqo>`_
8. 支持 virtio framebuffer /键盘/鼠标处理给出demo(推荐类似 pong 的 graphic game)的测试用例(难度7)
* code: `https://github.com/sgmarz/osblog/tree/pong <https://github.com/sgmarz/osblog/tree/pong?fileGuid=gXqmevn42YSgQpqo>`_
* code: `https://github.com/belowthetree/TisuOS <https://github.com/belowthetree/TisuOS?fileGuid=gXqmevn42YSgQpqo>`_
* `tutorial doc: Talking with our new Operating System by Handling Input Events and Devices <https://blog.stephenmarz.com/2020/08/03/risc-v-os-using-rust-input-devices/?fileGuid=gXqmevn42YSgQpqo>`_
* `tutorial doc: Getting Graphical Output from our Custom RISC-V Operating System in Rust <https://blog.stephenmarz.com/2020/11/11/risc-v-os-using-rust-graphics/?fileGuid=gXqmevn42YSgQpqo>`_
* `tutorial doc: Writing Pong Game in Rust for my OS Written in Rust <https://blog.stephenmarz.com/category/os/?fileGuid=gXqmevn42YSgQpqo>`_
9. 支持virtio NIC给出测试用例(难度7)
* `https://github.com/rcore-os/virtio-drivers <https://github.com/rcore-os/virtio-drivers?fileGuid=gXqmevn42YSgQpqo>`_
10. 支持 virtio fs or其他virtio虚拟外设通过测试用例(难度5)
* `https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.html <https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.html?fileGuid=gXqmevn42YSgQpqo>`_
11. 支持 `testsuits for kernel <https://gitee.com/oscomp/testsuits-for-oskernel#testsuits-for-os-kernel?fileGuid=gXqmevn42YSgQpqo>`_ 中15个以上的syscall通过相关测试用例(难度6)
* 大部分与我们实验涉及的 syscall 类似
* `https://gitee.com/oscomp/testsuits-for-oskernel#testsuits-for-os-kernel <https://gitee.com/oscomp/testsuits-for-oskernel#testsuits-for-os-kernel?fileGuid=gXqmevn42YSgQpqo>`_
12. 支持新文件系统,比如 fat32 或 ext2 等,通过相关测试用例(难度7)
* `https://github.com/rafalh/rust-fatfs <https://github.com/rafalh/rust-fatfs?fileGuid=gXqmevn42YSgQpqo>`_
* `https://github.com/pi-pi3/ext2-rs <https://github.com/pi-pi3/ext2-rs?fileGuid=gXqmevn42YSgQpqo>`_
13. 支持物理硬件(如全志哪吒开发板K210开发板等)。(难度8)
* 可找老师要物理硬件开发板和相关开发资料
14. 对fork/exec/spawn等进行扩展并改进shell程序实现“|”这种经典的管道机制。(难度4)
* 参考 rcore tutorial 文档中 chapter7 中内容
15. 向实验用操作系统发起 fuzzing 攻击(难度:?)
* 其实助教或老师写出的OS kernel也是漏洞百出不堪一击。我们缺少的仅仅是一个可以方便发现bug的工具。也许同学们能写出或改造出一个os kernel fuzzing工具来发现并crash它/它们。下面的仅仅是参考,应该还不能直接用,也许能给你一些启发。
* `gustave fuzzer for os kernel tutorial <https://github.com/airbus-seclab/gustave/blob/master/doc/tutorial.md?fileGuid=gXqmevn42YSgQpqo>`_
* `gustave fuzzer project <https://github.com/airbus-seclab/gustave?fileGuid=gXqmevn42YSgQpqo>`_
* `paper: GUSTAVE: Fuzzing OS kernels like simple applications <https://airbus-seclab.github.io/GUSTAVE_thcon/GUSTAVE_thcon.pdf?fileGuid=gXqmevn42YSgQpqo>`_
16. **学生自己的想法,但需要告知老师或助教,并得到同意。**
.. note::
1. 支持 1~3 人组队,如果确定并组队完成,请在 5 月 7 日前通过电子邮件告知助教。成员的具体得分可能会通过与老师和助教的当面交流综合判断给出。尽量减少划水与抱大腿。
2. 根据老师和助教的评价,可获得额外得分,但不会超过实验 的满分(30分)。也就是如果前面实验有失分,可以通过一个简单扩展把这部分分数拿回来。
其他说明
+++++++++++++++++++++++++++++++++++++++++++++++++++++
- 不能抄袭其他上课同学的作业,查出后,**所有实验成绩清零**
- lab8 扩展作业可代替 lab8 基础作业。拓展实验给分要求会远低于大实验,简单的拓展也可以的得到较高的评价。在完成代码的同时,也要求写出有关设计思路,问题及解决方法,实验分析等内容的实验报告。
- 完成lab1~lab8的编程作业也可得满分。这个扩展作业不是必须要做的是给有兴趣但不想选择大实验的同学一个选择。
实验检查
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
完成后当面交流。
问答作业
+++++++++++++++++++++++++++++++++++++++++++++++++++++++