用于日常打卡 rcore 2020 夏
七月
Sun | Mon | Tues | Wed | Thu | Fri | Sat |
---|---|---|---|---|---|---|
28 (D1) |
29 (D2) |
30 (D3) |
1 (D4) |
2 (D5) |
3 (D6) |
4 (D7) |
5 (D8) |
6 (D9) |
7 (D10) |
8 (D11) |
9 (D12) |
10 (D13) |
11 (D14) |
12 (D15) |
13 (D16) |
14 (D17) |
15 (D18) |
16 (D19) |
17 (D20) |
18 (D21) |
19 (D22) |
20 (D23) |
21 (D24) |
22 (D25) |
23 (D26) |
24 (D27) |
25 (D28) |
26 (D29) |
27 | 28 | 29 | 30 | 31 |
八月
Sun | Mon | Tues | Wed | Thu | Fri | Sat |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 (D30) |
5 (D31) |
6 (D32) |
7 (D33) |
8 |
9 | 10 | 11 | 12 | 13 (D34) |
14 (D35) |
15 (D36) |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
31 |
- Day 1(2020/06/28)
- Day 2(2020/06/29)
- Day 3(2020/06/30)
- Day 4(2020/07/01)
- Day 5(2020/07/02)
- Day 6(2020/07/03)
- Day 7(2020/07/04)
- Day 8(2020/07/05)
- Day 9(2020/07/06)
- Day 10(2020/07/07)
- Day 11(2020/07/08)
- Day 12(2020/07/09)
- Day 13(2020/07/10)
- Day 14(2020/07/11)
- Day 15(2020/07/12)
- Day 16(2020/07/13)
- Day 17(2020/07/14)
- Day 18(2020/07/15)
- Day 19(2020/07/16)
- Day 20(2020/07/17)
- Day 21(2020/07/18)
- Day 22(2020/07/19)
- Day 23(2020/07/20)
- Day 24(2020/07/21)
- Day 25(2020/07/22)
- Day 26(2020/07/23)
- Day 27(2020/07/24)
- Day 28(2020/07/25)
- Day 29(2020/07/26)
- Day 30(2020/08/04)
- Day 31(2020/08/05)
- Day 32(2020/08/06)
- Day 33(2020/08/07)
- Day 34(2020/08/13)
- Day 35(2020/08/14)
- Day 36(2020/08/15)
前几天和今天大体阅读完Rust官方Tutorial手册,并且完成Rustlings的初学者练习。代码位于项目/rust-exercise
下。一连学了10个小时,有一点吃不消了。
用rust模拟c的行为,容易遭到各种操作上的困难,不过再参考了std库中的linked_list的实现后,同时自己实际实现了链表、循环缓冲区和二叉搜索树后,感到自己对rust的unsafe块的理解更进一步。不过这个过程耗费了我许多时间来理解,预定任务也只能完成一半。
由于LCTHW中有些东西实现起来过于麻烦且无意义,故其中3、4道题换成了自定义的习题。
因为大部分和已有知识重合,故阅读速度较快。
完成COAD的阅读,对已有知识巩固。
阅读完普通部分,准备阅读Privilege部分。
大致过了一遍Risc-V中文手册,发现其中的Privilege部分属于重点,这部分在之后用到的时候更需要深入看一看。
有在Bilibili网站上发现前几个月贵系关于Risc-V操作系统和rCore的课程,于是打算先搁置手头上的任务,并看完。之后再打算进行Lab。视频网址
预计视频剩余时长为8小时,需要在两天内完成。
剩下内存分配和页面置换算法部分未看。打算之后在Tutorial遇到的时候再补上。
忘记上次重装系统后,Vmware直接没了,就把剩下的时间重新搭了Ubuntu虚拟机。
明天搭完环境后,就准备开始Lab了。
原生的ubuntu 18.04系统几乎什么库都没有,修修补补装了起来。编译rCore-Tutorial时发现失败,绕了很久的圈子,才知道要先按照Lab 0来写一会,才能慢慢搭建完,感觉到浪费了人生。
完成了Lab 0。
由于在risc-v的asm手册上没有发现.space
标记,于是使用.size
实现了相同的初始化栈功能。
.section .bss.stack
.global boot_stack
boot_stack:
# 16K 启动栈大小
.zero 1024 * 16
.global boot_stack_top
boot_stack_top:
# 栈结尾
教程中的llvm_asm!
宏在现在的rust版本中,已经逐渐逐渐被新式asm!
宏取代,于是自己将Lab 0中的相关的内嵌汇编代码修正了。例如,
/// SBI 调用
#[inline(always)]
fn sbi_call(which: usize, arg0: usize, arg1: usize, arg2: usize) -> usize {
let ret;
unsafe {
asm!("ecall",
inout("x10") arg0 => ret,
in("x11") arg1,
in("x12") arg2,
in("x17") which);
}
ret
}
准备补读之前的Privilege部分的文档,在进入异常机制前需要仔细研读CSR相关部分。
花了一个下午,大致明白了其中的关系。不过硬知识太多,用的时候需要频繁查阅。
Lab 1跟着教程走,很快就复现了。
问题在于Lab 2。因为我没找到Lab 2对应的源码,估计要git换一下commit号,但我懒惰了。而现有的rCore-Tutorial中的物理内存源码部分已经和虚拟内存部分糅合在一起,所以这部分还需要等明天完成Lab 3后才能正常工作。
明天搞完Lab2和Lab3后,要整理一下整个内存模块。顺便深入一下线段树和SLAB分配算法。可能还得看一看页置换算法了。这就是个大坑了。
这一章完全理清关系,耗了一天。一半原因是IDE的智能类型判断出了问题,而且代码跳转功能不完善,使得我在TUtorial中看了很久才理清了各个文件中的关键所在。
这一章实现了最基础的页表,并且完成了内核重映射。不过也因此里面没有缺页错误的处理,也没有页置换,只能算是实现了最基本的功能,前路漫漫。
没有时间看内存的各种分配算法。决定先建立起对Tutorial内核的整体理解后,再深入到细枝层面钻研。
嗯,准备看线程调度,这也是个大坑。
Lab 4里面把调度器封装好了,那我就先跳过调度器吧。
这一章节有关于基本线程的运行方式,我基本上理解透彻了。
不过中间有一点卡了我很久,现在想来,问题出现在对RISC V的汇编语法和指令集不熟悉。
我之前认为RISC V中的JAL rd, offset
跳转语句是需要指定返回地址的寄存器的,而asm源码中出现的是
.globl __interrupt
__interrupt:
... ...
jal handle_interrupt # 不含rd的JAL语句
.globl __restore
__restore:
... ...
所以我在Context
的__interrupt
和__restore
环节卡了很久,我怎么也想不透为什么进入了handle_interrupt
函数后,最后还能返回到__restore
部分。
直到我查了指令集才发现,原来JAL rd, offset
语句默认指定x1
,也就是ra
(返回地址寄存器)作为返回地址的寄存器,我人直接傻了。也就是相当于源码中jal handle_interrupt
这一句,默认以下面一句指令的地址,存入ra
中,相当于调用了一个函数的过程。
虽说上面那个失误卡了我很久,不过得亏这个问题,让我把这部分源码起码翻阅了5次,也加深了我对这一块的印象。
最近手都有点生疏了,敲了一道Leetcode中等题练练手。顺便现在的评价标准中,好像对Rust代码实现挺严格的。趁这个期间补几道题吧。
明天准备进入设备树部分了,可以感受一下IO到底是怎么实现的,不过看到有一小节有关于文件系统,感觉很不友好。
设备树这一章节,跟着教程走比较容易理解。但是关于设备树和virtio那些概念的规范,完全没看。代码中又都是各种调包和封装,内部细节完全看不到,以后再补一补。
看完这一章,就应该回到Lab 0开始重新写文档了。之前搁置的内存分配等东西准备实现了。
Lab 6基本都是调库,搁置了。于是写Lab 1的文档吧,不知道写什么,就把自己对各个关键步骤的理解写了下来,并且回答了一下问答题。
除此之外,调整了一下myRcore的文档结构,准备分章节来写。
写Lab 2,感觉最近有点累,可能要gap一下。
今日我gap一天,搞一些其他东西。和dotnet、docker斗智斗勇一整天,心力憔悴。dotnet所谓的跨平台,难道真的不是跨windows和windows-server吗(笑
回到rCore上,认真起来了。
完成了Lab 2文档的大部分。打算看一下线段树的物理页分配算法,就这样加进明天的日程里。
看看明天能不能做出一个自己的动态内存分配器出来。
遇到了未知的问题,gdb排查两个小时后发现,是内核栈爆栈了,也算理解了为什么 VectorBitmapAllocator
中要指定 4096K
的大小,应该就是为了防止爆栈。
今天突然发现Lab 1和Lab 2有了实验题,该好好整一整了。
完成了。这一章的实验题相对简单。
做了基础的概念性实验题,实践类型的实验题明天再整。今天也顺便补齐了一下昨天自己写的内存分配器的文档记录,血的教训。
明天学习并实现线段树的物理页面分配算法。
完成了实验题中的线段树分配,同时写完了对应的文档。不过挑战实验可能没时间了,后半个月的事情就很多了,只能留着以后再说了。
Lab 2的文档位于 myRcore/lab2/doc
。
不得不发表一下对 rust 的感想。它的运行时编译真的事情多多,有些时候我都想替他编译了。不过这样严格的规范确实能够减少大部分的低级错误,只能说有利有弊。我这也算是在付出学习成本了,虽然这个过程很痛苦。不过当编译成功后,直接就 AC 了,属实快乐。
唯一卡到我的一点,就是 lazy_static!
部分。因为 lazy_static!
需要创建的对象实现了 Send
特性,而我所使用的 NonNull
类型和 *mut T
类型,都是不允许跨线程移动的。因此,需要在我定义的线段树上,手动实现一个 unsafe
的 Send
特性,才能继续使用。
明天把Lab 3中的非实验性文档解决。准备和好兄弟去温泉一日游了。
完成了基本的文档叙述,虽然感觉大部分都是在抄文档。不过现在还看不到Lab 3的实验题。
明后两天约好兄弟出去玩了,爽。
玩。
继续玩。
晚上回到家了,累了。
7月下旬就没多少时间搞rCore了,现在要赶快把一些边边角角的东西写完了。
重新过了一边Lab 4的流程。基本文档也写了,剩下思考题和实验题的部分。
不过目前都是从 Tutorial 自己提取 Lab 4 相关代码,感觉和文档中有些许区别。
明天实现一种线程调度算法。现在Lab 4里面有 FIFO 和 HRRN 算法,如果找不到新的好算法,那就自己重新实现一次。
如果可以的话,最好还能整理一下文档。
7月20号开始要学习英语了,每天花在这里的时间要大幅减少了。
由于调度器的 Schedule
特性的限制,因此无法实现完整的多级反馈队列算法,只能对其部分修改,以适配接口。
发现实验题终于发了出来。但是明天开始学英语,能花在这一方面上的时间就减少了。
Lab 3的实验题框架还没出来,只能先整Lab 4。
累。
文档写的七七八八,之后再修补。
把Lab 4解决,然后恶补一下设备树和文件系统。
实现 Stride Scheduling 调度算法,比较轻松。
Lab 5的内容还需要进一步加深理解。
看了看linux文档,还看了一些csdn。基本理解了设备树和文件系统的原理,补回了这两个方面上的缺漏。
这两章的文档由于基本都基于现有的工具,对现有的规范进行实现,所以基本上都以 Tutorial 上的文档为主。先把大体文档和流程过一遍,然后准备做实验题。
复制黏贴复制黏贴复制黏贴......
一边学托一边实验,有点难顶。
除了实验六的挑战实验以及实验三的页表置换实验,其他都做了。下阶段还是整理整理文档吧。
快到ddl了,要准备整理文档了。
补充了一下文档,加了一下运行结果。
整理一下文档,然后提交了。
最后添加了一个总结性的文档。不过也没写什么有用的。暂时休工一会。
emmmm,今天忙着学英语,只把 zCore 环境搭好了,然后通过了编译,用了 busybox 。
学英语。然后今天剩余时间把王润基学长的zCore论文看了。
学英语。看了一下 hal 层和其 bare 的代码实现,linux 的实现没看。
由于半年前的一份代码出了问题,被人催着改了一整天,很困,没心情看 zCore。
感觉非常不好意思。过了这么久才看完 Fuchsia 的 Kernel-Object 文档,还是因为最近事情有点多,不过开始能够将部分时间匀回来了。
由于个人打算处理 Signal 部分,所以不可避免地需要先将前面的内容全部看一遍,困难++。
目前今天看完了 zircon-object/object
部分的代码,同时看了 zircon-object/task/thread
的代码。
thread
部分的内容,可以看见论文中的 Future
机制的使用,现在大致能够理解。
需要将 zircon-object/task
部分全部看完。因为这一块和 Signal 的部分非常的紧密。
考虑到 thread
部分已经看完了,估计剩余的部分应该不会太耗时。
之后打算再看 zircon-object/ipc
部分,才能够开始进军 Signal 的部分。
不过明天下午需要模拟考,可能时间不太够。加油吧,希望能在返校前(08/25/2020)至少做出一点文档注释来。
英语考试。鸽了。
今天大致看完了 zircon-object/task/thread
的代码。
其实很多部分都是互相嵌在一起的。下一步正是要想办法一步一步解开这些步骤。
需要将 zircon-object/ipc
部分全部看完。这一块和 Signal 的部分更是非常的紧密。