WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
---
title: 2025秋冬季开源操作系统训练营一二阶段总结-史喆元
date: 2025-12-15 16:20:37
categories:
- report
tags:
- author: Sasuke0723
---
## 前言

这是我第二次报名这个训练营但是相当于是第一次参加了,因为第一次报名是在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在操作系统编程上也是前途光明啊。目前训练营还没有结束,我会争取在结束前能完成第三阶段的任务,还剩三个任务,最近课不多,应该可以完成。