0%

2025秋冬季开源操作系统训练营一二阶段总结-史喆元

前言

这是我第二次报名这个训练营但是相当于是第一次参加了,因为第一次报名是在2024年的秋冬季,那时候我刚大一刚刚
接触到计算机,感觉很有意思就报名了但是那时候连使用Github对我来说都极其困难且刚进入大学没有适应繁多的课程,
我便决定先放弃,潜修一年有了些许微波的基础后再来试一试。我总是喜欢去了解一些东西的底层,所以我对操作系统算
是有一总执念吧,让我再次来到这里。但由于本人比较愚笨,学习速度极慢,再加上早八到晚十的课程,所以进度相较于其
他优秀学院慢了许多,但贵在坚持嘛……

第一阶段-Rust编程

第一阶段的任务是熟悉rust语言,完成一系列的题目,对于我来说还是具有一定的挑战,由于我受C语言的影响较深,对rust
的适应需要花费一定的功夫,从所有权,引用借用和用结构体组织相关联的数据以及它的方法、关联函数等等到泛型、Trait
和生命周期到最后的闭包、迭代器、智能指针和宏等等。这些对我来说都是很新的东西。但好在测试题目并不算难,我没有
太困难的完成了第一阶段,想着在第二阶段同步进行rust的进一步学习。

第二阶段-OS设计与实现

刚开始这一阶段的学习时,我还有些懵,配置实验环境时下载qemu7.0.0就捣鼓了半天(因为按照实验手册上的步骤下载遇到
网络问题),好在最后还是通过别的路径下载好了。正式进入第一章的内容后一开始还能读懂,但到了代码讲解和实践部分就
有点看不懂了,后来才发现看的是rCore-Tutorial-Guide-2025S,这个版本是较为简洁的,对于我这个没什么基础的人来说
读起来有些吃力,换到rCore-Tutorial-Book-v3这个更为详细的版本后就比较轻松了(指读懂)。

第一章:应用程序与基本执行环境

这一章从cargo new 开始,介绍了rust项目的创建,以及基本的文件结构,接着介绍了如何编译和运行一个简单的
应用程序,并讲解了操作系统的基本执行环境,包括内存布局、堆栈、入口点等内容。通过这一章的学习,我了解了
rust项目的基本结构和操作系统的基本执行环境,为后续章节的学习打下了基础。

第二章:批处理系统

这一章增加很多模块如syscall,trap和sync等,其中trap和sync模块比较难理解,trap模块涉及到中断和异常处理,
sync模块定义UPSafeCell结合RefCell来提供可在单核上的安全使用全局变量,这些内容对于我来说比较新颖,需要花费较多时间去理解和实践。通过这一章的学习,
我了解了操作系统的基本功能和机制,为后续章节的学习打下了基础。

第三章:多到程序与分时多任务系统

这一章开始有编程作业了,主要改动在于task模块的新增,实现了任务切换机制,通过TaskControlBlock来管理任务的状态和上下文切换,
并实现了简单的调度算法时间片轮转算法调度用户程序。并增加yield系统调用支持程序主动放弃处理器。
ch3的编程作业是实现一个新的系统调用sys_trace,较为简单,主要功能查询系统调用次数通过修改TaskControlBlock结构体然后给
TaskManager加了两个方法就差不多了。

第四章: 地址空间

这一章修改了很多东西,因为启用了分页机制,这涉及到硬件机制,我花费不少的时间才堪堪理解。物理地址,虚拟地址,
PPN,VPN,PTE,以及以他们为基础的很多其他结构,还有内存分配方面的内容,可以说是既有广度又有深度,学到很多。
ch4的编程作业是实现mmap和munmap系统调用并重写sys_get_time和sys_trace,可见地址空间管理在操作系统中的重要性。
我写了500多行代码,但其中很大一部分都没有用到,尝试了好久最后实现后我又觉得似乎实现不太完整,有很多边界情况似乎并
没有考虑到,但测试都通过了,只能说先这样吧,等有时间了再回来完善它(大概没时间咯。。。。

第五章: 进程及进程管理

从这一章开始我从看Tutorial-Book-v3转向看Tutorial-Guide-2025S了,前者的内容详细但是不够简洁,在基本理解了rcore
的整体框架后我就专注与任务的实现了,虽然我大概明白何为操作系统,但在以前根深蒂固的思想里,操作系统就是黑底白字的命令
行。。实际上并不是这样,这一章的应用程序示例中的shell程序颠覆了这个认知,原来命令行工具也是应用程序的一种,它们运行在
操作系统之上,通过系统调用与操作系统交互。通过这一章的学习,我了解了进程的基本概念和管理机制。
编程作业是迁移之前的系统调用以及实现spawn系统调用和stride调度算法,spawn系统调用我本以为会很复杂,
但我只是根据fork和exec的实现思路稍作修改就通过了测试用例,不知道有没有留下什么问题。stride调度算法也并不复杂,
主要是为TCB增加了两个字段stride和priority然后改了run_task函数中获取任务的函数,在函数中直接遍历找最小值就完了。
非常粗糙但够用。。

第六章: 文件系统与I/O重定向

文件系统的诞生确实伟大,教材中将这个版本的操作系统称为霸王龙,很有意思也很能体现它的强大,磁盘这种I/O资源的拓展
大大提升了操作系统的可用性,很早就听说UNIX的一切皆文件的思想,在这里从将stdin和stdout抽象为文件得到了初步的现
实了解,我很喜欢这种抽象的方法和思路,但这个过程是艰辛的,新增文件系统又新增了好多抽象层、结构、系统调用。但这还
只是最简单的,这也让我对现代操作系统大厦多了几分敬畏感。
本章的编程作业实现系统调用sys_linkat、sys_unlinkat、sys_stat。
其中sys_linkat和sys_unlinkat是一对,通过给Inode添加方法然后包装后提供接口给这两个系统调用,其中link的逻辑大概
是新增一个目录项,指向的Inode是需要链接的对象,unlink就是将这个目录项删除然后检查是否链接数为0,是就clear这个inode
sys_stat通过在DiskInode中增加了一个u32的nlink,在此原有方法的基础上增加get_stat的方法然后封装提供给系统调用使用

第七章: 进程间通信

通过管道实现的父子进程间的通信机制,其实并没有太仔细的研读,只做了简单了解…因为当时有点心急了想快点完成第二阶段。

第八章: 并发

终于最后一章了,新增了线程的概念以及由它引出的同步互斥相关问题。有了之前进程的基础理解线程并不困难。至于锁,我之前
一直以为很简单就是看锁上了没呢因为也没有太了解,但是从这章的内容看,在操作系统层面有很复杂的管理机制。有等待队列,释
放锁后还需要对等待的任务进行唤醒。嗯,确实是开了眼见了。另外信号量和条件变量机制,感觉这两个主要是用于实现同步,我对这
两个的使用场景还有些模糊,后面可以多了解一下。

总结

回想两三个月的长期学习时光,不免还是有些惭愧,但也有许多收获。rust语言确实是一门非常好的语言,前景也非常好,这一段学习经历
一定会成为我成长路上难忘且重要的一段时光。前段时间还看到rust结束了linux中的实验阶段,虽然不是很懂这个的概念,但自己还是
莫名有种兴奋的感觉( rust在操作系统编程上也是前途光明啊。目前训练营还没有结束,我会争取在结束前能完成第三阶段的任务,还剩三个任务,最近课不多,应该可以完成。