Skip to content

leonardodalinky/DailySche

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DailySche

用于日常打卡 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

任务1:完成rustling练习(100%)

前几天和今天大体阅读完Rust官方Tutorial手册,并且完成Rustlings的初学者练习。代码位于项目/rust-exercise下。一连学了10个小时,有一点吃不消了。

明日预定任务:完成Learn C The Hard Way中15道习题


Day 2

任务1:完成Learn C The Hard Way中15道习题(8/15)

用rust模拟c的行为,容易遭到各种操作上的困难,不过再参考了std库中的linked_list的实现后,同时自己实际实现了链表、循环缓冲区和二叉搜索树后,感到自己对rust的unsafe块的理解更进一步。不过这个过程耗费了我许多时间来理解,预定任务也只能完成一半。

明日预定任务:继续完成Learn C The Hard Way中剩下的习题


Day 3

任务1:完成LCTHW的习题(15/15)

由于LCTHW中有些东西实现起来过于麻烦且无意义,故其中3、4道题换成了自定义的习题。

任务2:阅读COAD Risc-V前两章(70%)

因为大部分和已有知识重合,故阅读速度较快。

明日预定任务:完成COAD前两章阅读,并阅读RISC-V指令集。


Day 4

任务1:阅读完COAD Risc-V前两章(100%)

完成COAD的阅读,对已有知识巩固。

任务2:阅读Risc-V中文手册(50%)

阅读完普通部分,准备阅读Privilege部分。

明日预定任务:完成Risc-V中文手册


Day 5

任务1:Risc-V中文手册

大致过了一遍Risc-V中文手册,发现其中的Privilege部分属于重点,这部分在之后用到的时候更需要深入看一看。

任务2:看B站上Thu的Risc-V相关(40%)

有在Bilibili网站上发现前几个月贵系关于Risc-V操作系统和rCore的课程,于是打算先搁置手头上的任务,并看完。之后再打算进行Lab。视频网址

明日预定任务:学习Thu的Risc-V相关课程

预计视频剩余时长为8小时,需要在两天内完成。


Day 6

任务1:Thu的Risc-V相关视频(90%)

剩下内存分配和页面置换算法部分未看。打算之后在Tutorial遇到的时候再补上。

任务2:搭设环境

忘记上次重装系统后,Vmware直接没了,就把剩下的时间重新搭了Ubuntu虚拟机。

明日预定任务:搭建环境+Lab0

明天搭完环境后,就准备开始Lab了。


Day 7

任务1:搭建环境

原生的ubuntu 18.04系统几乎什么库都没有,修修补补装了起来。编译rCore-Tutorial时发现失败,绕了很久的圈子,才知道要先按照Lab 0来写一会,才能慢慢搭建完,感觉到浪费了人生。

任务2: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文档+Lab1

准备补读之前的Privilege部分的文档,在进入异常机制前需要仔细研读CSR相关部分。


Day 8

任务1:阅读Privilege文档

花了一个下午,大致明白了其中的关系。不过硬知识太多,用的时候需要频繁查阅。

任务2:Lab1+Lab2

Lab 1跟着教程走,很快就复现了。

问题在于Lab 2。因为我没找到Lab 2对应的源码,估计要git换一下commit号,但我懒惰了。而现有的rCore-Tutorial中的物理内存源码部分已经和虚拟内存部分糅合在一起,所以这部分还需要等明天完成Lab 3后才能正常工作。

明日预定任务:Lab2+Lab3

明天搞完Lab2和Lab3后,要整理一下整个内存模块。顺便深入一下线段树和SLAB分配算法。可能还得看一看页置换算法了。这就是个大坑了。


Day 9

任务1:Lab 3

这一章完全理清关系,耗了一天。一半原因是IDE的智能类型判断出了问题,而且代码跳转功能不完善,使得我在TUtorial中看了很久才理清了各个文件中的关键所在。

这一章实现了最基础的页表,并且完成了内核重映射。不过也因此里面没有缺页错误的处理,也没有页置换,只能算是实现了最基本的功能,前路漫漫。

没有时间看内存的各种分配算法。决定先建立起对Tutorial内核的整体理解后,再深入到细枝层面钻研。

明日预定任务:Lab 4

嗯,准备看线程调度,这也是个大坑。


Day 10

任务1:Lab4

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次,也加深了我对这一块的印象。

任务2:Rust代码练习

最近手都有点生疏了,敲了一道Leetcode中等题练练手。顺便现在的评价标准中,好像对Rust代码实现挺严格的。趁这个期间补几道题吧。

明日预定任务:Lab 5

明天准备进入设备树部分了,可以感受一下IO到底是怎么实现的,不过看到有一小节有关于文件系统,感觉很不友好。


Day 11

任务1:Lab 5

设备树这一章节,跟着教程走比较容易理解。但是关于设备树和virtio那些概念的规范,完全没看。代码中又都是各种调包和封装,内部细节完全看不到,以后再补一补。

明日预定任务:Lab 6

看完这一章,就应该回到Lab 0开始重新写文档了。之前搁置的内存分配等东西准备实现了。


Day 12

任务1:Lab 1文档

Lab 6基本都是调库,搁置了。于是写Lab 1的文档吧,不知道写什么,就把自己对各个关键步骤的理解写了下来,并且回答了一下问答题。

除此之外,调整了一下myRcore的文档结构,准备分章节来写。

明日预定任务:Lab 2文档

写Lab 2,感觉最近有点累,可能要gap一下。


Day 13

今日我gap一天,搞一些其他东西。和dotnet、docker斗智斗勇一整天,心力憔悴。dotnet所谓的跨平台,难道真的不是跨windows和windows-server吗(笑

明日预定任务:Lab 2文档

回到rCore上,认真起来了。


Day 14

任务1:Lab 2文档(65%)

完成了Lab 2文档的大部分。打算看一下线段树的物理页分配算法,就这样加进明天的日程里。

明日预定任务:内存分配器

看看明天能不能做出一个自己的动态内存分配器出来。


Day 15

任务1:Lab 2 内存分配器

遇到了未知的问题,gdb排查两个小时后发现,是内核栈爆栈了,也算理解了为什么 VectorBitmapAllocator 中要指定 4096K 的大小,应该就是为了防止爆栈。

明日预定任务:Lab 1实验题

今天突然发现Lab 1和Lab 2有了实验题,该好好整一整了。


Day 16

任务1:Lab 1实验题

完成了。这一章的实验题相对简单。

任务2:Lab 2实验题(50%)

做了基础的概念性实验题,实践类型的实验题明天再整。今天也顺便补齐了一下昨天自己写的内存分配器的文档记录,血的教训。

明日预定任务:Lab 2实验题

明天学习并实现线段树的物理页面分配算法。


Day 17

任务1:Lab 2实验题(95%)

完成了实验题中的线段树分配,同时写完了对应的文档。不过挑战实验可能没时间了,后半个月的事情就很多了,只能留着以后再说了。

Lab 2的文档位于 myRcore/lab2/doc

不得不发表一下对 rust 的感想。它的运行时编译真的事情多多,有些时候我都想替他编译了。不过这样严格的规范确实能够减少大部分的低级错误,只能说有利有弊。我这也算是在付出学习成本了,虽然这个过程很痛苦。不过当编译成功后,直接就 AC 了,属实快乐。

唯一卡到我的一点,就是 lazy_static! 部分。因为 lazy_static! 需要创建的对象实现了 Send 特性,而我所使用的 NonNull 类型和 *mut T 类型,都是不允许跨线程移动的。因此,需要在我定义的线段树上,手动实现一个 unsafeSend 特性,才能继续使用。

明日预定任务:Lab 3文档

明天把Lab 3中的非实验性文档解决。准备和好兄弟去温泉一日游了。


Day 18

任务1:Lab 3文档(50%)

完成了基本的文档叙述,虽然感觉大部分都是在抄文档。不过现在还看不到Lab 3的实验题。

明日预定任务:玩

明后两天约好兄弟出去玩了,爽。


Day 19

玩。


Day 20

继续玩。

晚上回到家了,累了。

明日预定任务:Lab 4基础文档

7月下旬就没多少时间搞rCore了,现在要赶快把一些边边角角的东西写完了。


Day 21

任务1:Lab 4基础文档

重新过了一边Lab 4的流程。基本文档也写了,剩下思考题和实验题的部分。

不过目前都是从 Tutorial 自己提取 Lab 4 相关代码,感觉和文档中有些许区别。

明日预定任务:实现一种线程调度算法

明天实现一种线程调度算法。现在Lab 4里面有 FIFO 和 HRRN 算法,如果找不到新的好算法,那就自己重新实现一次。

如果可以的话,最好还能整理一下文档。

7月20号开始要学习英语了,每天花在这里的时间要大幅减少了。


Day 22

任务1:实现一种线程调度算法

由于调度器的 Schedule 特性的限制,因此无法实现完整的多级反馈队列算法,只能对其部分修改,以适配接口。

任务2:Lab 3 + 4 的实验题

发现实验题终于发了出来。但是明天开始学英语,能花在这一方面上的时间就减少了。

Lab 3的实验题框架还没出来,只能先整Lab 4。

明日预定任务:Lab 3 + 4 的实验题

累。


Day 23

任务1:完成Lab 4(上)实验题 + 文档

文档写的七七八八,之后再修补。

明日预定任务:Lab 4(下)实验题

把Lab 4解决,然后恶补一下设备树和文件系统。


Day 24

任务1:完成Lab 4(下)实验题

实现 Stride Scheduling 调度算法,比较轻松。

明日预定任务:Lab 5文档

Lab 5的内容还需要进一步加深理解。


Day 25

任务1:学习设备树和文件系统

看了看linux文档,还看了一些csdn。基本理解了设备树和文件系统的原理,补回了这两个方面上的缺漏。

明天预定任务:Lab 5+6 大体文档

这两章的文档由于基本都基于现有的工具,对现有的规范进行实现,所以基本上都以 Tutorial 上的文档为主。先把大体文档和流程过一遍,然后准备做实验题。


Day 26

任务1:Lab 5+6 大体文档

复制黏贴复制黏贴复制黏贴......

明日预定任务:实验六

一边学托一边实验,有点难顶。


Day 27

任务1:实验六

除了实验六的挑战实验以及实验三的页表置换实验,其他都做了。下阶段还是整理整理文档吧。

明日预定任务:整理文档

快到ddl了,要准备整理文档了。


Day 28

任务1:整理文档

补充了一下文档,加了一下运行结果。

明日预定任务:整理文档

整理一下文档,然后提交了。


Day 29

任务1:整理文档

最后添加了一个总结性的文档。不过也没写什么有用的。暂时休工一会。


Day 30

emmmm,今天忙着学英语,只把 zCore 环境搭好了,然后通过了编译,用了 busybox 。


Day 31

学英语。然后今天剩余时间把王润基学长的zCore论文看了。


Day 32

学英语。看了一下 hal 层和其 bare 的代码实现,linux 的实现没看。


Day 33

由于半年前的一份代码出了问题,被人催着改了一整天,很困,没心情看 zCore。


Day 34

任务1:阅览完 Fuchsia 的 Kernel-Object 文档部分

感觉非常不好意思。过了这么久才看完 Fuchsia 的 Kernel-Object 文档,还是因为最近事情有点多,不过开始能够将部分时间匀回来了。

任务2:阅读 zircon-object 源代码

由于个人打算处理 Signal 部分,所以不可避免地需要先将前面的内容全部看一遍,困难++。

目前今天看完了 zircon-object/object 部分的代码,同时看了 zircon-object/task/thread 的代码。

thread 部分的内容,可以看见论文中的 Future 机制的使用,现在大致能够理解。

明日预定任务:继续阅读 zircon-object 源代码

需要将 zircon-object/task 部分全部看完。因为这一块和 Signal 的部分非常的紧密。

考虑到 thread 部分已经看完了,估计剩余的部分应该不会太耗时。

之后打算再看 zircon-object/ipc 部分,才能够开始进军 Signal 的部分。

不过明天下午需要模拟考,可能时间不太够。加油吧,希望能在返校前(08/25/2020)至少做出一点文档注释来。


Day 35

英语考试。鸽了。


Day 36

任务1:阅读 zircon-object 源代码

今天大致看完了 zircon-object/task/thread 的代码。

其实很多部分都是互相嵌在一起的。下一步正是要想办法一步一步解开这些步骤。

明日预定任务:继续阅读 zircon-object 源代码

需要将 zircon-object/ipc 部分全部看完。这一块和 Signal 的部分更是非常的紧密。

About

日常打卡 rcore 2020夏

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published