2024 开源操作系统训练营第二阶段总结-刘梓陆
写在前面
真是一段很长的旅程啊,怎么说呢,这一阶段的任务我基本上都是“挣扎”着完成的,一开始感觉以我对 Rust 和 OS 的理解,应该此阶段的任务不会非常困难。后来发现还得是“纸上得来终觉浅,绝知此事要躬行”,有些东西在课上学习理论知识和实际使用代码进行实现完全是不一样的感觉,而且怎么说呢,Rust 的运用程度实际上对编写操作系统的帮助也不是特别大,就好像你要和亚里士多德探讨哲学问题,重点是这个哲学问题,而不是古希腊语,当然你得先对古希腊语有一个大致的了解,但是古希腊语本身对理解这个哲学问题是没有什么帮助的。
反正总之由于种种原因,我感觉我在这方面的经验根本就是 0,导致本阶段的任务超出截止时间一周差不多才完成。
但是怎么说呢,就好比是 DND 里面的等级系统一样,在等级为 1 的情况下,升到 2 级所需要的经验值是很少的,所以这个训练营给我的提升感觉也特别大(OS 子职等级),了解到了很多之前根本没有机会接触的知识领域,最重要的,更是加深了我对 os 的理解。
我在第一阶段的总结之中也提到了我非常崇拜 Linux,现在感觉我离他好像又进一步了,感到非常开心!
欢迎交流;-)
在写这篇博客时,本人东北大学大三在读,前两年东学西学,Rust 就是之一,说实话,在本学期开始时,我实在找不到什么东西来做,准备先买一本《趣读 Linux 源码》来看,感谢我学弟翊嘉,是他给我推荐了这个操作系统训练营,这样直接上手操作系统的效果比看书要好太多了,真的十分感谢!
我对 Rust 的理解还是比较少,future、unsafe 的内容更是知之甚少,所以大佬求带!看到我这篇总结报告之中有什么不足也请指出!
- github ID: destinyFvcker
- 邮箱:destinyfunk@163.com
- 微信号:wxid_r3se52q2d4pg22
OS 大概是个什么东西捏?我在完成了这个阶段的任务之后的理解
最近在看 Linus 的自传,他在里面讲了一段关于 OS 的话感觉说得特别好:
计算机上的所有功能要起作用,都得以操作系统为基础。于是,创造一个操作系统就成了终极挑战。你创造操作系统的时候,相当于给所有在这部电脑上跑的程序创造了一个全新的生存环境—从根本上说,其实就是在制定这个世界的规则:什么事可以接受、可以做,什么事不可以接受、不可以做。其实所有的程序都是在制定规则,只不过操作系统制定的是最根本的规则。创造一个操作系统,就相当于自己创造的一方土地制定宪法,而在电脑上跑的程序则相当于各式各样的普通法律。
这段话形象地表达了操作系统的功能、作用、以及它对上层应用程序强大的控制能力,但是实际上感觉在实现了一些东西之后,好像也不完全是这样。
os 下面还有一个 sbi?
原来就是认为是下面这个层级关系:
- 计算机硬件 -> os -> user application
但是在使用 RISC-V 实际上应该是这样的!
- 计算机硬件 -> sbi -> os -> user application
实际上操作系统也要向下请求 sbi 提供的功能!在本次训练营之中一个比较常用的功能——往屏幕上输出字符就是通过 sbi 完成的。实际上完全不止于此,SBI 还会在计算机启动的时候进行它所负责的环境初始化工作,并将计算机控制权移交给内核,操作系统的关闭也是由 SBI 控制的。
从 RISC-V 特权级架构的视角来看,我们编写的 OS 内核位于 Supervisor 特权级,而 RustSBI 位于 Machine 特权级,也是最高的特权级。
说实话,我对 SBI 的理解就到此为止了,在代码之中,很贴心地向我们提供了 SBI 服务调用的接口,我们直接使用就可以了。
这部分我感觉还不是很清楚的内容:
SBI 的内容我感觉真的后续还有必要继续学习一下。
毫无疑问就是一个应用程序
在本阶段的相关代码项目之中,除了一些关键的处理 Trap 和上下文切换的逻辑是使用汇编进行编写的之外,其他都是使用 Rust 编写的、和普通的用户应用程序并没有什么不同。
在实现了地址空间之后,基本上就完全停留在逻辑上的开发了,不再关心操作系统的实现细节,实际上我在实现了进程和文件系统的相关功能之后回头一看都感觉地址空间之中的一些实现细节都开始遗忘了。
这部分我感觉还不是很清楚的内容:
Rust 编译器是如何将这个汇编代码和 Rust 代码链接在一起的?
而且在 Rust 之中是如何调用在汇编代码之中定义的过程的?
通过寄存器和 pc 的指令流
而且我发现真的一个应用程序实际上非常简单,就是一堆指令,pc 拿到之后一条条执行,然后会有一个跳转指令跳转到另外一条指令进行执行,然后指令的操作数都是从寄存器拿出来的,线程或者进程实际上就是一个包装了指令流的上下文,在里面进行了一些簿记工作,记录了当前指令进行到了哪里,然后一些相关寄存器的状态。