OS Training Camp Daily Documents
每日笔记 借鉴yunwei37姐姐的日志安排
七月
Mon | Tues | Wed | Thur | Fri | Sat | Sun |
---|---|---|---|---|---|---|
30 (D0) |
1 (D1) |
2 (D2) |
3 (D3) |
|||
4 (D4) |
5 (D5) |
6 (D6) |
7 (D7) |
8 (D8) |
9 (D9) |
10 (D10-11-12) |
11 (D10-11-12) |
12 (D10-11-12) |
13 (D13) |
14 (D14-15) |
15 (D14-15) |
16 (D16) |
17 (D17-18) |
18 (D17-18) |
19 (D19-20) |
20 (D19-20) |
21 (D21-22) |
22 (D21-22) |
23 (D23-31) |
24 (D23-31) |
25 (D23-31) |
26 (D23-31) |
27 (D23-31) |
28 (D23-31) |
29 (D23-31) |
30 (D23-31) |
31 (D23-31) |
八月
Mon | Tues | Wed | Thur | Fri | Sat | Sun |
---|---|---|---|---|---|---|
-
学习 rust 圣经,写这里的时候才到看这里,菜菜
-
完成变量绑定与解构(Variables)的练习
-
体验一下,完成 intro 部分
- 开心
- 看到yunwei37姐姐的日志安排,orz,厉害捏(顺便加了姐姐 QQ,开心!不过不知道聊啥,,,呆)
- 学习效率和进度好慢呀,不知道能不能完成第一阶段,呜呜呜
- 赶紧入门 rust 呀
-
学习 rust 圣经+rust-by-prctice 提交到rust-begin ;完成练习如下:
- char-bool-unit
- functions
- numbers
- ownership
- statement-exprissions
-
rust-begin-rustlings 完成练习如下:
- variables
- functions
这两天中午都吃的肯德基,好饱呀。。。哈哈哈哈
收到了春季清华 OS 课程的链接,还没来得及看呢(现在点开看一眼
- 这周赶紧看完基础入门
- 学习 rust 圣经+rust-by-prctice 提交到rust-begin ;完成练习如下:
- String
- slice
- tuple
- struct
- rust-begin-rustlings 还没来得及做呢,,,rust 圣经的变量看完了,明天开搞
- 稍微看了一点点基础(虽然自己之前知道这些,不过巩固一下基础也好,要重新开始看了
- go-begin 放仓库了 🐳
- 学习 rust 时没理解不可变引用与原变量为啥可以都在
println!()
中引用,,,万能群友解释是println!()
宏展开是用了不可变引用(还没看到宏,,, - rust 引用切片与 golang 切片类似,rust 引用底层是切片的第一个字是指向数据的指针,第二个字是切片的长度,golang 还多了一个 cap。所以 rust 引用切片大小为 2 个字,golang 切片估计是 3 个字。这些数据的类型大小均与 cpu 相关(联系到了 golang 到了 ╰(°▽°)╯
- 今天做一个简单的链表题(原谅我算法太差了,开始从基础做),顺便把 cpp
delete
和析构函数复习了一下 👍 - 讲道理,我很想把 go,rust,cpp,java,javascript,python 都好好看看,不过没有那么多时间呀,而且学习 rust 效率也没那么高,看完章节配合 rust-by-practice 练习,花时间挺长的(┬┬﹏┬┬),,,希望这个暑假至少把 golang 和 rust,还有操作系统基础打好把,,,,太菜了 ಥ_ಥ
-
今日配置麻了,没有做什么事,呜呜呜 实验0之前生成早了,与最新的不一样了,,,不过大概了解了怎么连接远程仓库
git remote add upstream 远程仓库链接 git fetch upstream git checkout -b foo git branch -D main git checkout -t origin/main git reset --hard upstream/main git push -f
-
新的要求来了:rustlings用github codespace的形式了(「・ω・)「 虽然之前我自己fork了一份然后在本地做了,不过反正我也没做多少,也还好
-
总感觉自己过不了第一阶段了,呜呜呜
-
学习 rust 圣经,基础部分才看到一半,看到
method
了(而且后面的一半更难ಥ_ಥ -
枚举和
match
花了点时间理解- ps: rust-course,rust圣经居然没讲
ref
只是在练习里面出现了,我在rust-by-prctice里面看的ref
- rust枚举也太神奇了,在rust-by-prctice里面看见使用枚举实现链表,震惊(见识短浅,见谅见谅(●'◡'●)
- ps: rust-course,rust圣经居然没讲
-
rustlings 大概做到
mod
部分了,但是我还没看到mod
呢
-
lab 0
的实验终于过了,原因就是git action+private;不太理解git action(只知道好像是有什么CI,云原生??? -
果然是立flag了,rust-course基础部分还是没看完,害😢😢
今天是摸鱼的一天呢(┬┬﹏┬┬)
晚上开营直播,老师说基本上一半同学会止步于第一阶段,我觉得我有可能止步于第一阶段,,不过没啥担心的,我还是挺喜欢rust的,如果这次没过,以后也会坚持学习哈哈哈哈,有时间继续参加哈(说的我真的过不了第一阶段。。。害,还是有希望的,加油加油(❁´◡`❁)🎏🎢
遇见一个不明白的问题,放笔记了(关于rust的@
绑定)
可以看看前两届大佬留下的博客笔记,对之后的学习,做实验有帮助
另外,快点把基本语法看完把,得基本有个印象(o-ωq)).oO
特征Trait基本看完了,估计明天就可以看完rust圣经基础部分。今天看完特征了,看地似懂非懂的,哈哈哈哈🎢🐳
随便看了看操作系统和计网的一点点知识,复习了一点点go知识。
明天开始搞剩下了rustlings,不过我看rustlngs除了基础部分还有多线程编程,明天看完Rust圣经基础部分后,把能做的rustlings都完成了,剩下的不明白的再看Rust圣经高级部分.
基础部分基本看完了,但是rustlings今天还没怎么做(指今天摸鱼了(ノへ ̄、)
类型转换,那部分属实有点看不懂(┬┬﹏┬┬)
明天开始搞剩下了rustlings。。。
可以把lab看起来了(每日1h?)
rv任务:阅读《计算机组成与设计(RISC-V版)》第一、二章;自学RISC-V手册:一本开源指令集的指南(重点是第10章)
rustlings
- 错误处理6,挺难的
- 做到智能指针了(standard_library_types)
学习智能指针,有点复杂。。。今天rustlings还未开动,,哎呀哎呀,感觉吃枣药丸哇哇哇哇இ௰இ
前两天基本上在摸鱼,没做什么关于本项目的事情,现在开始好好学习(x
实验部分还没看,rustlings还没做完(rust进阶部分理解有点耗时。。
ricv-32是我们计组课指令系统与控制器学习的指令集,虽然不是面面俱到,但是把基本的指令都介绍,复习也可以看我们计组课件
- 明天把rustlings弄完
- 开始渐渐看实验吧
- RISC-V手册:一本开源指令集的指南
- 简单看看
事件1
- 只是简单看了看,其中第二、三章与我们计组课相关,但内容上各有不同:
- 第二章简单介绍了rv32,并没有我们上课的课件详细,另外还将rv32与其他指令集进行了对比,不过我没仔细看,感觉rv吸收了之前指令集的经验教训,与rust类似,比较优秀
事件1
rustlings终于完成啦😂😁
rust进阶其实还有部分没看完;
感觉自己写一个稍微规范一点点的rust程序还是有点困难的,之前学的也还有一定的印象,遇到具体情况还是要复习。。。
- 文档:
- 应用程序与基本执行环境
- rust:生命周期
事件1:文档阅读--应用程序与基本执行环境
之前只是配置了实验环境(lab0-0)但实际上对此实验细节还不是很了解;这篇文章讲解的就是该实验的具体细节部分;我很难记录一些笔记,感觉涉及的内容对于我来说比较晦涩,只能大致了解实验的流程。
事件2:rust生命周期学习
感觉还是不太明白,特别是生命周期的消除规则,以及提到的例子
事件3:阅读《行者无疆》、《网络是怎样连接的》
其实很久没有看文学书了,,,最近有点郁闷烦躁,看看文学书静静心,看书的时候,感觉余秋雨老师写的散文很有逻辑,而且通过序章明白了写这本书的目的——寻找文化对比坐标,更加清晰地理解中华文化;另外是关于网络的书籍,感觉讲的很有趣,第一章就给我讲明白了浏览器收发信息的过程,特别是DNS服务器部分,之前一直不理解,看了第一章恍然大悟,受益匪浅呀~
day 15可以说在摸鱼哈哈哈,所以这合并了
接下来要好好看实验了
事件 通过rcore-tutorial文档复习第一章
阅读rcore-tutorial,感觉对编译原理和计组有了更深入的理解
事件1 阅读rcore-tutorial文档——批处理系统
感觉阅读难度好高,只能大概看懂在做什么;看完后,回到引言部分:
- 首先改进应用程序,让它能够在用户态执行,并能发出系统调用
- 调整程序的内存布局,让操作系统能够把应用加载到指定内存地址,然后顺利启动并运行应用程序
- 在应用程序的运行过程中,操作系统要支持应用程序的输出功能,并还能支持应用程序退出
- 这需要实现跨特权级的系统调用接口,以及
sys_write
和sys_exit
等具体的系统调用功能 - 应用与操作系统内核之间系统调用的参数传递的约定
- 这需要实现跨特权级的系统调用接口,以及
- 写完应用程序后,还需实现支持多个应用程序轮流启动运行的操作系统
- 首先能把本来相对松散的应用程序执行代码和操作系统执行代码连接在一起,加载至内存,让操作系统能够找到应用程序的位置
- 应用程序执行文件格式转换,便于操作系统能够找到应用的位置
- 让Binary应用能够启动和运行,需要分配好对应执行环境所需一系列的资源
- 设置好用户栈和内核栈(在用户态的应用程序与在内核态的操作系统内核需要有各自的栈,避免应用程序破坏内核的执行)
- 实现Trap上下文的保存与恢复(让应用能够在发出系统调用到内核态后,还能回到用户态继续执行)
- 完成Trap分发与处理等工作
这里记录也并非完整,只是对引言的提炼;本章看完只能大概了解实验过程
事件2 跟着os-comp2022第二章文档做实验
- 本实验不需要做任何操作,只用完成
- 接收 第二个实验练习的github classroom在线邀请
make codespaces_setenv
make setupclassroom_test2
即可,关键应该是了解(最好做到理解做了什么)
事件 阅读lab-1文档:多道程序与分时多任务
事件1 阅读lab-1文档:多道程序与分时多任务
事件2 完成lab-1实验
实验感悟
通过阅读文档,大概对本章操作系统的内容理解50%,通过实验对内容再次加深理解,大概有70%
作为rust初学者,在写实验的时候会很谨慎地考虑如何写rust,担心编译失败;其实lab-1要求比较简单,难点是理解以提供的代码,以及如何使用已经提供的代码,哪些是需要用的等等(感觉实验普遍都是这样)
实验要求中,统计任务的相关系统调用的次数
我一开始是想通过寻找函数syscall
的调用位置来进行补充,但发现仅在函数trap_handler
中使用过系统调用,而后者实际是与嵌入的汇编代码进行交互的,不知从何处下手,故陷入僵局
补充:系统调用-特权级机制
- 内核和 U 模式的应用程序之间的接口被称为 应用程序二进制接口 (Application Binary Interface, ABI) —— 系统调用
- 系统调用的本质是一种异常 —— 陷入异常控制流,在该过程中会切换 CPU 特权级
- 当调用一个系统调用时会触发 CPU 异常,CPU 进入异常处理流程
所以系统调用是用
trap_handler
控制的
- 与 Trap 切换不同,它不涉及特权级切换
- 与 Trap 切换不同,它的一部分是由编译器帮忙完成的
- 与 Trap 切换相同,它对应用是透明的
任务切换是来自两个不同应用在内核中的 Trap 控制流之间的切换 —— 换栈
所以仍然使用
trap_handler
控制系统调用handle an interrupt, exception, or system call from user space
于是考虑到从系统调用函数syscall
中寻找答案;实际上该函数也是由各种系统调用函数组成,在深入部分函数,如 sys_yield
,明白该函数是通过 TaskManager
调用的,而我们维护了一个全局的任务管理器;结合任务提示 —— 系统调用次数可以考虑在进入内核态系统调用异常处理函数之后,进入具体系统调用函数之前维护
—— 我们可以在进入具体函数调用之前,通过任务管理器,获取当前任务,对应的syscall_times[syscall_id] += 1
即可(当然需要修改TaskControlBlock) —— 补充函数 pub fn update_syscall_record(syscall_id: usize)
pub struct TaskControlBlock {
pub task_status: TaskStatus,
pub task_cx: TaskContext,
pub syscall_times: [u32; MAX_SYSCALL_NUM],
pub first_run: bool,
pub time_begin: usize,
pub time_end: usize,
}
虽然对 多道程序与分时多任务 系统调用 等等,并非完全理解(初始操作系统,懵懵懂懂,主要是还没有理清思路)但感觉获得了很大的收获
Rust 中有许多我第一次听说的概念(比如所有权、借用、模式匹配、生命周期等等),以及感到奇妙的用法(比如枚举、宏编程、迭代器、闭包等等)。
Rust 拥有出色的文档(rustwiki、以及官方推出的一系列教程等等)、强大的编译器(可以给出清晰的错误提示信息)等等,这些都是我其他语言不具有的;虽然使用上确实有难度,但是 Rust 确实很强大。
很遗憾,到目前为止,我只完成了lab1。没完成的原因有很多,不过我参与 rCore 学习的目的也是想学习操作系统与rust,而且接下来也可以继续一边系统地学习操作系统,一边通过 rCore 加深对操作系统的理解。其实7月我浪费了很多时间,希望8月好好学习,争取参加之后9月的rCore camp。