0%

前言

大家好,我是姚宇飞,非常高兴能参与到这次 os tutorial summer of code 的活动中来。我来自哈尔滨工业大学(深圳),目前大二。

在参加这次活动之前,我虽然对rust和risc-v并没有过多了解,但是我却对操作系统有着浓厚的兴趣,在学校还没有学习到相关内容之前,我就已经自学了os原理和linux内核设计

总体上来说,这次的第一阶段学习过程还算顺利,初步学习了Rust并且了解了 RISC-V 指令集的实现。从零开始,一步一步完成了一个简单os的设计,我还尝试为实验提供的os代码进行了自己的改进和功能添加

以下是每个阶段的总结,也希望和大家分享一些自己的学习经验。

Read more »

阶段一总结

第一部分 Rust语法

在这一阶段,主要任务就是熟悉 Rust 的语法。

Rustlings

首先是 Rustlings 的练习。作为颇负盛名的 Rust 入门练习,起到的效果也是极佳的,尤其对于我们这种拥有其他语言基础的人。

题目虽然看起来挺多,而如果没有太多不懂的地方的话,每道题的用时都不会很多。只有许多不常用的功能才需要频繁的查阅文档。同时也能提高我们查阅 Rust 文档的能力。

相较而言,Rust 的 API 文档比较好理解。不过其中的 Trait 方面容易被忽略,查阅起来还是要费一番功夫的。

Rust By Example

在例子中学会 Rust,也是比较推崇的一个方法,效率比单纯看 API 高效,也比单纯看别人源码来的轻松。这本书适合结合 API 文档使用,尤其是当 API 文档中的例子不够详细的时候。

Learn X The Hard Way + 自主练习

在做”笨方法学xx“系列时,其实感觉效果很差,里面很多都是鼓励我们直接使用现有的 API 来开发,不够底层。与此同时,C 语言中很多简单的语法,在 Rust 中都需要绕几个弯路才能实现,也带来的不便。

而如果选择 Python 版本的练习题,又会受限于 Python 频繁的”调包“特性,对学习 Rust 其实帮助不是很大。

于是自己选择了一些 Leetcode 上的题来练习手动实现数据结构。由于主要为了学习 Rust 的语法,因此并没有选择困难的算法题,而是选择了两三道普通的中等题来练手。

此外,为了详细了解 Rust 如何凭借 Unsafe 块,达到 C 语言同等的能力,还翻阅了 Rust 中对 LinkedList 的实现,了解了 Unsafe 使用的方式和技巧,并自己实现了一个链表数据结构。

第二部分 RiscV指令集

这一阶段主要着重于对 RiscV 指令集的熟悉。主要的材料就是 RiscV 的官方手册和中文手册。

RiscV 的指令大部分都是定长的。这样有利于 CPU 高速读取指令并且修改 PC 的值。

RiscV 的指令都是经过良好设计的。每个指令中的部分,都能获得很好的利用。

RiscV 中关于特权级的部分十分清晰,对设计系统而言起到帮助。关于 U, S, M 三个态的特权级切换和特性与功能,都在手册中得到的良好的阐述。关于页表切换的部分,也有足够长的篇幅进行描述。

第三部分 Lab实验

Lab 0

主要用于熟悉一下如何通过 Rust 的工具链来生成一个最简易的内核,为之后的步骤作铺垫。

在这一步,我们舍弃了 Rust 的运行时,同时切换到 RiscV 指令集下的工具链。

之后需要通过链接器,将我们的内核起始地址,放到 0x80200000 处,也就是 Qemu 调用我们内核的地址。

通过上述的步骤,最基本的 Playground 就已经搭建好了。

Lab 1

实现了中断处理机制的基本。

这一步主要通过和 RiscV 的中断机制相互结合,实现了内核中的中断机制,并且分别为几个中断事件实现了简单的中断处理程序。

同时,还将上下文的概念引入到内核中,使我们能够备份程序的运行状态,也为之后的实验做基础。

我们实现的中断中,时钟中断是最重要的。时钟中断将允许我们在之后进行线程的切换,也是计算机中并行的一种体现。

这一章的实验题,让我们自己捕获一种新的中断并处理,同时希望我们能够触发这个中断以验证。

Lab 2

建立起动态内存分配的机制,通过分配器来动态分配页帧,使得我们可以在内核运行过程中使用动态增长大小的数据结构了。

在这里,我们将物理地址具象化为一个结构体,为我们看待地址空间提供一种新的方式,也为下一章节引入虚拟内存作铺垫。

这一章的实验题,希望我们亲手实现一个物理页米分配算法或者堆分配的算法。

Lab 3

实现 Sv39 标准的页表机制。通过引入页表,并且开启 RiscV 中的 Sv39 的页表机制,我们实现虚拟内存的概念。其中,我们查询、建立和修改页表以适应我们的需求,让每个线程看到的地址空间几乎都是独立的。

同时完善了内核重映射的过程。为了将我们的内核成功地放置于虚拟空间的高地址处,我们通过临时的页表,使得我们能够将内核的虚拟地址转移到高地址处。

这一部分的实验题,要求我们自己实现一个页面缺页置换算法,并且需要使用到第 5 章的有关文件的内容。

Lab 4

本章节完成线程概念的实现,使运算资源能分到各个线程上去。

我们将线程中的信息统合为 Thread 结构体,并通过修改时钟中断历程,结合线程调度器,做到不同时间运行不同的线程,以分摊运行时间。

为了使我们在时钟中断的时候,内核能够拥有稳定的栈空间,而非使用程序的空间,我们还指定了程序中一段空间作为内核栈。

这一章的实验题,一部分在于通过获取键盘输入(第 5 章的内容)来响应线程中断和线程克隆的事件;另一部分在于自己实现 Stride Scheduling 的调度算法。

Lab 5

这一章配置 Qemu 挂载支持 VirtIO 协议的设备,同时通过现有的 rCore-fs 工具,实现特定文件系统的访问。

这要求我们熟悉设备树的概念,并且了解 VirtIO 的协议。了解我们的系统如何通过 DMA 来获得对应设备的信息。

同时,还要拥有最基本的文件系统知识,能够清晰对文件访问的过程。

Lab 6

这一章相对较于杂糅,不仅实现了 ELF 格式文件的读取,还实现了少数的系统调用,同时还完善了条件变量的机制,以实现更好的线程调度功能。

我们通过调用现成的 ELF 解析器,能够做到读取 ELF 文件的信息,并且将系统的控制权交由 ELF 可执行文件来运行,也就相当于允许用户程序的运行。

同时,为了让用户进程更好的运行,我们还实现了几个系统调用,并提供其接口给用户进程,逐渐建立起了用户的框架。

此外,为了更有效的分配运行时间,还添加了条件变量的机制,使得系统不需要理会睡眠中的线程,更有效的分配运行时间。

这一章的实验题基本上重点在于自己实现几个系统调用,以供用户使用。

前言

大家好,这里是云微(郑昱笙),非常高兴能参与到这次 os tutorial summer of code 的活动中来。我是一名浙江大学的18级本科生,其实很早就听说了rCore这样一个项目,也是机缘巧合在 github 上面随便逛逛的时候发现了它,就报名参加啦。

在参加这次活动之前,我对 rust 可以说是只闻其名,并没有过任何实际的了解;risc-v同样如此;在课程中了解过一些操作系统相关的原理,但也没有很完整的实践过程,虽然之前六月底的时候学了一点 mit 6.828 相关的内容(完成了前两个lab),但由于参加了这次活动就暂时没有继续。

总体上来说,这次的第一阶段学习过程还算顺利,正式学习了 rust 这样一门注重安全性的优秀现代语言,了解了 RISC-V 指令集的实现,也第一次完整地体验了一个简单操作系统的开发流程,对于相关原理的具体实现有了一个直观的理解。另外,这也是我第一次参与这样的社区活动,尝试作出了一点微小的贡献,也认识了好多非常厉害的大佬们,感觉收获还是非常丰盛的喵。

以下是每个阶段的总结,也希望和大家分享一些自己的学习经验。

Read more »

2024S第一阶段总结报告-贺兰星辰

说来也不是第一次学 Rust,早在前年在朋友的逼迫(迫真)下就花了一个月读完了 course.rs,可以说是受益匪浅,不仅学到了 rust,更重要的是对整个编程语言的体系有了深刻的了解。但今年确实是第一次接触 Rust 操作系统,甚至是普通的操作系统开发,这也是我第一次参加操作系统训练营。

讲讲 rustlings

挺好玩的一个项目,是 rust 官方为了鼓励程序员学习 rust 语言而开发的一套渐进式学习方案,今年的操作系统训练营除了原有的 100 道 rustlings 题目外,还新增了 10 道算法题,感觉难度基本都在这儿了,有的确实不简单,但最终还是在两天内把 rustlings 全部搞完了。

最后

希望自己能够坚持到最后,至少完成第二阶段吧(苦笑
:wq <- 故意的

前言

大家好,我是来自济南大学的李宇。

如标题中所说,我是今年应届考研的学生,目前的目标是清华大学,但是我作为一名跨考生,又碍于没有项目没有论文,机缘巧合之中在向勇老师的 学堂在线 OS 课程交流群 中看到了本次活动的消息,所以就报名参加了该活动。

不知道是因为努力还是因为运气,我在本活动第一个月的进展还算顺利,在活动的第 20 天就几乎完成了所有的项目,所以我想在此分享一下我在这一阶段的学习经验和总结报告。

Read more »

这是我第一次接触rust语言,因为是初次接触,而且语法系统和之前学过的C++语言完全不同,因此在学习上遇到了不少困难,幸运的是在个人的持续努力以及与同学的持续交流下,最终是赶在截止之前实现了基础的110题的需求。由于接触比较晚,再加上现实生活并没有很多空闲时间,因此完成rustling训练的过程的时间过程相对较长,对语言的理解也依然不是很深刻,在后续的学习中会尽量在不影响正常学习的情况下尽量提高对rust语言的熟悉度与熟练度。以下则是按相对日期所展示的具体时间安排:
day1 配置环境 + 1 ~ 30题的完成
day2 31 ~ 60
day3 61 ~ 80
day4 81 ~ 101
day5-7 102~110
通过这段时间的学习实际收获其实并不少,只是由于时间以及客观环境的限制,对rust语言解决问题的编码思路与生命周期相关的内容依然不算很熟悉,也算是一个需要继续精进的点了。

不知不觉一个月都要过去了,整了将近一个月(中间因为各种事情咕咕了一周多)的 rCoreLab, 在这里做一个小小的总结。

Read more »

学习报告

一个月的rCore学习已经步入了尾声,虽然Lab还在进行中,但是还是在这里简单复盘一下这一个月的学习心得。刚看到这样一个实习机会的时候,就挺想尝试的,因为学习一个月、参与项目一个月的模式真的很打动我,然后就从做简历和学习github的用法开始,一点一点靠近这个实习。其实报名的时候就是抱着试一试的心态,因为毕竟是完全零基础,填写报名问卷的时候,是否学过Rust、是否做过操作系统相关项目都战战兢兢的写了否,生怕这里就被刷下去,所幸,最终还是得到了一个机会,可以参与进来。然后就是按照rCoreTutorial的要求,按部就班的进行啦,暑假的时间还是很宽裕的,所以基本每天从早到晚都在学习这些,一度感觉自己比上课时候还用功,虽然比较用功,但是还是自知和参与这项活动的很多大佬还是有很大差距的,但是我心态比较好,也不和别人比较嘛,就尽自己所能,来完成每日的要求,还没有完成的事情,接下来几天也一定抓紧补齐。

Read more »