0%

summerofcode2020 学习总结

summerofcode2020 第一阶段学习总结

我的rcore学习笔记在 这里

rust

rust这门语言的两大特点和难点就在于生命周期和所有权系统保证安全. 这两点有非常深入的理论基础, 感觉可以单独开一门课. 虽然我现在也不是完全明白, 但自从认真找一个例子思考过之后, 真正感受到生命周期标注的约束的各种不同的写法确实真正加上了各种不同的约束. 不同的写法可以把生命周期约束得或长或短, 当为各种传入的对象找到合适的生命周期标注的那时候, 我真实地感受到了rust的魅力. 可惜在rcore-tutorial中生命周期标注用得非常少, 而且不少都是’static, 使我在写操作系统的过程中没怎么思考生命周期的问题.

rust的安全性确实能从方方面面体验到. 整数溢出在rust中会panic产生运行时错误. 生命周期和所有权系统保证没有垂悬指针, 多线程只能传递线程安全的变量, 否则要加上一层读写锁/Arc/Mutex, 操作可变全局变量也需要unsafe块. rust使用Option, Result这两个类型返回错误或者失败的情况, 也保证了错误的任何情况都能处理到, 并且通常也不会特别繁琐, 可以使用unwarp函数在失败时panic, 或者在返回值为Result类型时使用?简单直接地自动返回错误.

rcore-tutorial

我挺想好好把计算机的课程学完的, 因此早就开始看x86架构的ucore学堂在线的网课. 但是ucore的难度确实大, 我网课视频都看完了, ucore还不怎么下得了手. 之前做完lab1, 停了几个月, 后面又做到lab2, 又放了一学期, 走走停停地我现在才做到了lab6. 后面的网络部分和操作系统部分也没能学好. 没有规划时学习效率真的是要多低有多低. 不过这一阶段的学习还是让我这一个月的学习轻松了很多很多.

这是我第二次熟悉编写小型操作系统, 我总结出大概的写操作系统的主线:

  1. 硬件的启动流程, 将程序链接到指定物理内存地址
  2. 实现物理内存管理
  3. 开启分页, 实现虚拟内存管理
  4. 实现内核进程, 进程调度
  5. 实现用户进程
  6. 文件系统/计算机网络

学了risc-v后, 才真正明白为什么x86有很多历史的包袱, 感受到了risc-v的简洁前瞻性.risc-v上不仅中断和分页简介好用, 而且还考虑到CPU架构未来的创新方向, 在虚拟化和用户态中断上布局. 另外, risc-v架构上, 启动和打印字符直接由opensbi完成, 让我们非常轻松就能启动起来并与外界交互.

之前用C语言写操作系统, 因为对C语言比较熟悉, 就有种使用的就是汇编语言的感觉, 但现在使用新兴的rust语言, 而我对新的编译技术也不够了解, 各种抽象的底层实现也不了解, 就没有那种特别底层的感觉了, 各种抽象虽然说是零成本, 但是由于不清楚是怎么实现的而没有实感.

这一个月学rcore-Tutorial的过程中, 作为只接触过ucore和rcore的初学者, 我在学rcore的时候总在和ucore对比, 并想为什么有不同的地方. 这样的思考让我感受到了操作系统顶层设计的不容易. 现在的lab每次trap都会切换栈, 而不管特权级, x86中是硬件切换栈的, 如果有特权级变化会自动切换栈, ring0到ring0则不会切换栈. 如果想要在中断发生的时候根据特权级决定是否切换栈, 不但当前的寄存器都需要保存, 不能空出寄存器来读取和判断, 而且也不好暂时在当前栈上保存一些数据, 因为可能是用户态的栈. 不知risc-v向量模式的中断能否突破这个困境.

进程调度方面, x86的ucore和现在的rcore差别真的很大, ucore的中断栈是每个进程分开的, 而且还支持中断的嵌套, 调度上是连带着中断栈一起调度. 而rcore则通过在trap时的Context调度.

然而我会的还是太少, 我目前见识过的操作系统, 只有ucore和rcore, 看了看树莓派的rust os教学, 里面单独建立arch文件夹放特定架构的代码, 还为不同的开发板放专用的代码, 整个项目的结构就和我接触过的完全不一样. 还有编写驱动, 文件系统, 各种开发版的之间的差异和对操作系统的影响等等都是我不熟悉的领域, 我要学的还有很多.