-
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 #186 from 201430098137/master
feat:finished blog
- Loading branch information
Showing
1 changed file
with
66 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,66 @@ | ||
--- | ||
title: 2023开源操作系统训练营第二阶段总结报告-庄广 | ||
date: 2023-11-11 22:02:24 | ||
tags: | ||
- author:201430098137 | ||
- repo:https://github.com/LearningOS/2023a-rcore-201430098137 | ||
--- | ||
## 前言 | ||
我是一名工作了五年的社畜,先后用过php、go语言开发应用端的程序,尽管接触过一些操作系统的知识,但都是二手资料,只了解个大概。 | ||
|
||
我对问题都会追本溯源,想了解得更深一点,这样才能更好的总结归纳。 | ||
|
||
工作中用的很多工具以及知识底层都涉及到操作系统,只有了解了操作系统内核才能更好的理解整个计算机体系结构。 | ||
|
||
国庆节前在网上冲浪时,无意中看到Rust语言中文社区有关于开展开源操作系统训练营的公告,了解后,竟然是免费教程,太让人惊喜。 | ||
|
||
机不可失失不再来就立马报名参加了。 | ||
|
||
## 第一阶段rustlings 100道题 | ||
这一阶段的题相对比较简单,我花了一周的时间就刷完了。但也发现了自己的盲点,比如高级生命周期这块,是从没了解过。 | ||
|
||
顺带一提,我承接了队长的工作,解答队员不懂的知识点,队员都很争气,基本都没这么问我,都能完成rustlings100道题,到第一阶段截至,8名队员有7名晋级, | ||
还有一名太忙了,没时间做,也不参加后续的了。 | ||
|
||
## 第二阶段 r-Core内核 | ||
|
||
### 第零周 | ||
|
||
也就是完成rustling之后,我开始摸索搭建实验环境的搭建和看第零章的内容,到第一周开始,环境已经搭好和看到第一章 | ||
|
||
### 第一周 | ||
|
||
发现第三章才是第一个实验,奋起直追,主要的时间都发在阅读文档中,我看的是详情书,看到周六才到第三章末。 | ||
|
||
周六才是完成实验,实验不是很难,主要在于理解两个异常控制流的转换,__all_trap和__switch,理解特权级切换硬件都干了什么,软件如何衔接。 | ||
|
||
最终在周日完成了第一个实验。 | ||
|
||
### 第二周 | ||
|
||
第四章比前面三章要理解的东西都多,而且也很难。可能对于我来说,操作系统这块内容比较陌生,没有一个概念,做起来就有点畏手畏脚。 | ||
|
||
如何将用户态的一个变量赋值,这个变量还可能分散到两个实际不相连的物理页,实在想不到如何下手。群里的大佬支招,让我把结构体的字段拆开分别赋值, | ||
这个方法可行,但不通用,每个结构体字段都不一样,每个都要根据它的字段分别赋值,很麻烦。 | ||
|
||
最终我想到的方法是,写一个通用的方法,根据用户态的指针查到对应物理页面,在内核态实例化一个和用户态一样对象,转化成字节数组,将字节数组拷贝到物理页面中。 | ||
这个方法收到拷贝应用数据的方法的启示,我不用管对象是什么,只需要当成字节数组来看,逐页拷贝就行。 | ||
|
||
只要理解了虚拟地址空间和物业页帧之间的关系,mmap和munmap都是比较好实现。 | ||
|
||
### 第三周 | ||
|
||
前面两周只做到了实验2,接下来的一周虽然很快看完了第五章,但是完全没有时间完成实验,只能到周末完成。 | ||
|
||
实验3相对于实验2算比较简单的,前面抽象的概念都已经展开,实验3只不过增加了fork、exec之类的系统调用,用于生成新的进程。 | ||
|
||
spawn只需要获取pid和从elf中获取堆栈等信息,组装成一个taskControlBlock,并加入到任务队列即可。 | ||
|
||
stride算法的实现需要扩充两个字段stride和priority,并在每次进程切换时stride加上pass,pass= big_stride/priority。之后是修改任务管理器的fetch方法, | ||
实现fetch能获取最小stride进程,我将VecQueue改成LinkedList,为了好从中间去掉某个节点。 | ||
|
||
## 总结 | ||
|
||
- 在这5周内,学习到很多知识,以前很模糊的点现在已经清晰了,感谢训练营给了这个机会 | ||
- 因为是打工人,上班完全没法摸鱼,学习的时间不是很多,很多时候都是在地铁上,休闲时间里来完成实验。但这五周都过得很充实,尽管也很忙 | ||
- 接下来就要进入第三阶段,希望能学到更多的知识 |