0%

哪一个计算机系的学生不想写一个自己的操作系统呢?

没事的时候,我总会想这件事。自己的操作系统,它应当闪耀着新时代的光芒:使用 Rust 编写、运行在 RISC 芯片上、最好还能抛弃宏内核……但一直没有真正坐下来实现,毕竟脑中还在幻想着其他事情。

后来在编译原理群里、年级群里都看到了这次活动的通知,我感到是时候了,即使没能写出完全自主的 OS,加入一个团体鞭策自己学习 Rust、OS 也是好的。

Read more »

题前

虽然本科专业属于数学系,我一直对计算机操作系统以及更底层的系统的运行原理深感兴趣。我也在2018年就学习了Rust 语言,2019 年的上半年一直在自学数学逻辑设计和 CPU 设计。自己设计一个 OS , CPU 或者其他大型的软硬件系统,是多么令人兴奋的一件事!之前一直畏难,这个夏天,终于在 rCore 的帮助下完成了。
Read more »

总结报告

学习情况

一个月的时间转眼便以过去,经过第一阶段的学习,我收获了很多知识,但也发现了自己的种种不足。
最终可归纳为以下几点:

  1. Rust语言的学习: 以《Rust 程序设计语言》和《Rust编程之道》为学习资料轻松上手了基本的语法操作,但是中间有点钻牛角尖,例如在对对象安全这一概念的不理解耽误了很多时间(这点需要改正)。在上手了rustlings后,通过一遍练习一遍学习知识点的方式很快就掌握了一部分的rust知识。由于缺乏实践经验,所以在写算法题时,发现自己对指针以及递归方面还是花了很大的功夫去理解的。随后在做lab的过程中发现对于模块化的知识确实要求很大,所以又回到了《Rust编程之道》中将第十章的代码全部实现了一遍。 总体来说对于rust语言的使用已经渐渐熟悉,但还是需要不断的学习和使用。

  2. risc-v与操作系统的学习: 对于risc-v而言一开始其实是比较畏惧的,因为之前没接触甚至没听说过。由于之前由于之前学过x86汇编和一些单片机的知识,慢慢理解了一些皮毛。不过在实践过程中如果实际遇到问题该查资料的地方倒是没有含糊,也是慢慢有所收获。 操作系统由于之前在学校学习过,理论部分的知识还是能在一定的时间内重新捡起来。

  3. lab实验: 因为怕自己rust不熟练,对lab本来比较畏惧,但为了学习也是迎着头皮往前冲。但是没想到一开始拦住我的居然是环境配置(果然装软件才是最难的),因为自己电脑版本较老,花了一天多才把环境给装配好,为此还专门写了篇博文记录了所走过的坑(或许对项目其他同学有帮助)。

接下来便是正式lab的环节:

  • lab0没有遇到太大的问题,但是收获很大。了解了bootloader已经一些与硬件环境,程序依赖有关的知识,这一部分的知识在学校学习的理论知识中是从未提及过的。
  • lab1是实现中断系统,中断是实现其他程序调度和硬件访问等功能的基础。有关寄存器,上下文等知识之前有了解过,所以没有遇到较大问题。
  • lab2是实现动态内存分配,主要涉及动态内存,连续内存分配算法,外碎片,碎片整合等概念。由于文档部分很多内容没有提及,所以花了较多的时间去比对源码以及学习其他同学的博客。
  • lab3是地址映射的内容,主要涉及虚地址与实地址的转换,页表等较为重要的概念。本实验包含较多的理论知识,花了较长的时间去查阅文档资料。并且开始有知识难以琢磨,比如页面转算法,在着方面挣扎花费了较多时间导致后期时间有所来不及。
  • lab4是线程和进程,理解起来也不是很轻松,由于时间的问题,只能照着人家的代码匆匆实现了一遍,花时间读了下实验指导书,可以说学的不是很扎实。
  • lab5-6同只是照着人家的代码匆匆实现了一遍,读了下实验指导书,在遇到不懂的问题时就立刻去问同学,自己的思考较少,这也是我要再补救的地方。后续打算把实验题也一同补上。

感想

老师好!我叫文博,很高兴我能来参加本次实验,记得看到有关项目的消息时已是7月3号晚,压着最后的时间线进组已经是兴奋不已。在这种激动的心情下我开始着手于项目内容的学习。

对于rust的内容对我来说都是新接触的知识,可能上手有些慢。但是后期在完成了相应的练习和算法题后,渐渐有了一定的开发能力。

有关risc-v的知识之前是从来没有接触,但是由于之前学过x86汇编和一些单片机的知识,所以慢慢也能开始理解和接受。

虽然本身近期也在学习有关操作系统的知识,但是在实际动手后发现自己还是有诸多不足,例如对页面置换,线程调度等问题上有很多自己无法理解的知识。在不断的代码实践中发觉自身对操作系统的各种细节又了更进一步了解,可以说这是参加活动后最大的收获。

作为一名正在考研期间的学生,一开始我着力于分配两者之间的平衡,在发觉自己对操作系统方面欠缺的知识量很大的情况,我便决定中途花了近一个礼拜的时间将近期考研的任务完成,紧接着投入到全天候的实验中来。

在发觉自身的诸多不足时,我选择主对结交一些同学并向他们虚心请教。在此过程中即让自己收获到了知识,也认识到了很多厉害是大神同学。当然,期间因为自己的打扰,以及一些提问的不严谨等也着实给大家添了不少麻烦,为此在实验截至之际我也对大家表示了抱歉以及感谢,并收获到了友谊。

由于本身对较底层的知识比较感兴趣,在参加完实验后更萌生了以操作系统作为以后研究方向的想法。

最后感谢陈老师能让我参加这次项目,让我有如此大的收获,希望有机会能继续在项目组中学习,希望rcore项目越来越好!

OS Summer of Code 第一阶段总结报告

首先自报家门,我是在来自上海科技大学信息学院的张18级本科生张驰斌。了解到这一次实习机会是通过大群里面一位同学发的消息。原本自己也对“用Rust在RISC-V机器上面写一个OS”这样新技术的梦幻联动也有过畅想过,加上对计算机底层知识比较感兴趣,没有多想就报名了。

Read more »

活动总结

前言

我是徐文浩(freheit889),在学习ucore的过程中,我在群里突然发现了这个活动,当时心中一阵雀跃,后来一看要简历,想着我那么菜,怎么搞啊。后来仔细想想,投了又不亏,当时就决定要投,
后来紧张了两天,居然进来了,当时的心情是 o( ̄▽ ̄)ブ,在期末考试的重压下学习起了rust.

Read more »

前言

2020年6月30日,在年级群看到了一位同学发的 OS Tutorial Summer of Code 链接,拍拍脑袋,决定利用这个暑假参加这次活动。
原因要追溯到上个学期,也就是大二上学期,的末尾,第一次在我的笔记本电脑上装了 Linux 双系统,从此就喜欢上了 Linux,一发不可收拾,这种兴趣逐渐使我萌生了动手写 OS 的想法,但一直以来都没有一个完整的知识体系和现成框架,这让我无从下手。
从那天开始,这个活动带我进入了一个新的世界,一个关于 Rust 语言,RISC-V体系结构,和新时代操作系统的新世界。

Read more »

从8月初开始,我从0开始学习了一周的rust语言,完成了相关练习。学习rust的公开repo为:

https://github.com/gystar/HelloRust

之后开始跟着rCoreTutorial的实验指导完成了lab0-lab6,从简单的中断到内存管理,再到进程的创建和调度,最后是系统调用和设备树,将一个小型os内核用rust语言一步步的构建出来,还是挺有成就感的。对于os的原理有了比教科书要深刻得多的理解,感觉从中获益良多,感谢各位老师和助教。学习rCore的公开repo为:

https://github.com/gystar/rCoreTutorial

并且我完成了所有的实验题目。其中,我感觉比较难写的是伙伴分配算法,难点在于:

  • 完成传统的伙伴分配算法
  • 分配的地址有对齐要求,因此可能要检查空闲表的多个链表的多个结点
  • 由于此算法是用于动态内存分配,所以一开始不能直接使用动态分配内存的数据结构,如linkedlist,否则陷入互相new的死锁。但是此算法本身是基于链表实现的,因此我实现了一种新的链表:一开始分配一个静态结点,之后的结点在堆上动态分配的链表。伙伴算法,最开始每个链表最多一个结点,因此这个链表是刚好满足要求的。

  • 题前

    学习os一年,看过两个教程哈工大的linux0.11和清华的ucore,拿起放弃好多次,算是坚持下来入门了。一直以来想写个简单的os,奈何功力尚浅,迟迟不敢动手,今年有幸参加了summerofcode2020线上学习,对我来说是个很不错的实践机会,开始动手,边学习边搭建自己的os环境,为后期学习高级操作系统做准备
  • 总结

    本次实习要求用rust+riscv实现os,对我来说都是新知识,就按部就班的按照step0的要求建立自己的学习步骤,rust看了下语法后直接实现基本的数据结构,os中的页面分配算法,调度算法等本质就是对基本数据结构的操作,算法原理不是很强。收获比较大的是学习riscv汇编吧,我以为我会被这个困住,像当初学习Intel和AT&T汇编那样,是刚开始我在尝试写第一个riscv汇编时候遇到点问题,后面学习csr特权级指令没遇到什么问题,以后再学习汇编指令啥的不会是什+么问题了。其次逼着自己看youtobe视频教学(riscv如何控制SiFive闪烁灯),国外视频似乎不是很难了,毕竟我英语听力一塌糊涂。
    os方面,基本来说就那几块,中断,系统调用,进程线程管理这几块原理代码我在学其他os课程时候理解了,剩余的就是内存管理部分,这部分主要是页表的建立,学哈工大的课程时候有个实验是根据虚拟地址查看物理地址,并读取物理地址的值来直观感受MMU翻译过程,本次中也试了下,rust写os内存管理这部分确实简单多了,通过本次学习弥补了不少以前的知识盲点,还有一个就是设备的管理,这两块通过这次实习消除了不少盲点,其他方面就是巩固了OS的一些基础知识
  • 展望

    本次实习对我来说帮助很大,学到不少知识。从实习的实验项来说,确实不多,我只完成了实验指导0-6步,其他的本来想留出一周时间来做下,没时间了。不过这没什么,一开始我就想的就是按照实验指导书后的步骤从0一步步搭建到6,通读下rcore-tutiorial代码以及想清楚这么设计的合理性。接下来的时间,我打算去迭代下本次做的这个os,学习os没什么捷径,只有一句话,绝知此事要躬行!!!
  • 相关 repo

第一阶段

算是完成了100道题,但感觉多线程,闭包的掌握还太差,函数式编程有点新奇

第二阶段

lab1

读了一遍guide后接触项目时有点不知所措,参考了blog再加上自己的思考后慢慢地才感觉有点掌握了实验
完成了lab1,感觉思路上并不难,其中的链接,特区等级的切换等仍需仔细研究。

lab2

感觉lab2代码量十分的大,我花了大量时间来理解代码,这是我花费时间最长的实验,仍感觉部分理解不透
最后感觉实验逻辑比较简单,发现位运算的漏洞,该写datalab了。
还有个println调试导致的乌龙,该学gdb了。

lab3

lab3感觉比较简单,就是修改了一下idle,spwan的逻辑理解fork和exec后并不难,而且和new几乎一样。

一些感想

  • 通过这个实验,我基本了解了Rust语法,Risc-V以及简单os的设计
  • 我的基础技能有欠缺,比如多线程等,及时补上
  • book仍需细读,写完后续实验
  • 非常感谢老师同学们对我的帮助