-
Notifications
You must be signed in to change notification settings - Fork 387
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #176 from ColdRain-Moro/master
2023开源操作系统训练营第二阶段总结报告-ColdRain-Moro
- Loading branch information
Showing
1 changed file
with
35 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
--- | ||
title: 2023开源操作系统训练营第二阶段总结报告-ColdRain-Moro | ||
date: 2023-11-06 11:33:34 | ||
tags: | ||
- author:ColdRain-Moro | ||
- repo:https://github.com/LearningOS/2023a-rcore-ColdRain-Moro | ||
--- | ||
|
||
# 2023rCore训练营二阶段总结 | ||
|
||
## 序言 | ||
|
||
其实去年刚学 Rust 的时候就有看到这个训练营,感觉用 Rust 写操作系统很有意思,可惜当时没有任何操作系统和体系结构基础,有畏难情绪,所以没有参加。(现在看来其实当时就应该参加,rcore并没有想象中的那么难) | ||
|
||
今年正巧在刚做完 xv6 的时候再次看到了这个训练营,想着继续巩固 OS 知识的同时还能重温半年多没写的 Rust,就报名参加了本次训练营。 | ||
|
||
可惜今年参加的时机并不怎么好,我本人已经找到了Android开发的实习,实习每天工作都挺忙的,只能周末抽时间看看录播,做做 lab。也许 Android 开发投入这么多精力学习 OS 算是有点不务正业,但我还是希望能够在本科阶段尽可能多的学习我感兴趣的 CS 知识。 | ||
|
||
## ch3 | ||
|
||
ch3 还是很简单的,实现了一个系统调用计数和 task_info。所以这一个 lab 我的侧重于读实验源码。不得不说 rcore 跟 xv6 还是有很多不一样的地方的: | ||
|
||
- ch3 还没有涉及到进程的概念,只是简单区分了分时任务。在做 xv6 时其实我一直在疑惑多线程应当怎样实现,因为在 xv6 中只有进程,并且也只实现了进程的调度。rcore 中对分时任务的区分使我豁然开朗,其实一个线程就是一个分时任务,而进程并不是分时任务,而只是一个存放资源的结构体罢了。 | ||
|
||
- ch3 的实验代码实现中并没有一个 shell 用户程序,而是直接将程序分段直接加载到物理内存中执行。这个操作我觉得其实就是在裸机程序的基础上做了一些改良,这么看来相比于 xv6,rcore 确实是在教你从零开始实现一个操作系统。 | ||
|
||
## ch4 | ||
|
||
ch4 主要是学习了虚拟内存机制,其实之前学习 xv6 的时候就学得不太明白,这次算是整明白了。不过这个 mmap 相对于 xv6 那个 mmap 就比较简单了。让我比较惊讶的是 rcore 中能使用各种需要基于堆内存实现的容器(Vec,BTreeMap等)。 | ||
|
||
## ch5 | ||
|
||
ch5其实难倒不难,就是需要把前面实验中实现的内容再实现一遍(直接 cherry-pick 代码不行,ch5 实验代码变化较大)感觉有点难受,并且遇到一些比较迷惑的问题时没有方法对源码进行调试(不知道是不是我没有找到,make debug似乎只能调试汇编代码)。 | ||
|
||
spawn 其实就是 fork + exec,并且不需要复制父进程的内存空间,直接 new 一个新进程的内存空间,设置一下父进程然后直接加载 elf ,搞定后再 add_task 即可。 |