第一阶段报告
首先感谢活动主办方给了我们学习的机会和学习的资源,感谢助教一个月来的解答疑惑和帮助建立学习环境
Rust的学习
rust语言学习起来十分困难,难度比较高,自学是通过《Rust语言圣经》这本书和Rustlings符合学的边学边看,遇到不会的看书再者看Rust沙龙的视频边看边学,(实际上写OS的时候也在翻书看学和练习)。Rust虽然难度高但是从性能上和从安全性上来讲都是很好,优势也很突出!
RISC-V学习
《RISC-V手册一本开源指令集的指南》里面的第一、二、三、九章节,两天就可以看完,基本了解 RISC-V 的相关概念。而且RISC-V十分简洁化和模块化
OS实验学习
lab0
这两节课主要搭建了环境,熟悉了如何使用和了解了批处理操作系统
lab1 多道程序与分时多任务
- 增加 start_time 和 syscall_times,并对其进行初始化,不然会报错
- 修改run_first_task 和 run_next_task
- 在sys_task_info 函数中将当前进程的 TaskInfo 赋给 ti.这样就可以完成和实现功能
lab2 地址空间
- sys_get_time 和 sys_task_info 需要向用户程序传递指针,我们引入虚拟地址对应用户的地址空间,因为处于内核空间所以不能直接修改指针所指内容。
- 将程序对应的页表,将虚拟地址转化为物理地址,改变物理地址的内容
- mmap与munmap 实现,这两个都要判断传入参数是否合法。在判断已经被映射的页和无效的表项
- PageTable.unmap() 函数销毁地址的映射.
lab3 进程及进程管理
- 将之前写的sys_get_time、sys_task_info、sys_mmap、sys_munmap copy进来,在实现spawn 函数时需要用到fork()函数,这时候我们还要注意spawn 函数中进程基地址的问题
- 实现 stride 算法,需要对TaskControlBlockInner进行添加stride、pass、priority。在对sys_set_priority函数进行设置
lab4 文件系统
- sys_linkat: 遍历寻找旧路径 inode number,再通过新路径,创建Direntry,写入到根
- sys unlinkat: 在root inode中设置 Direntry: empty,这样就完成了删除操作
- sys stat:需要进行地址交换,分析disk_node.type对stat中变量赋值
lab5 并发
- 使用银行家算法实现检测死锁的功能。
感想
- rust语言博大精深,我一直抱着一个初学者的心态去学习,去探索其未知的知识
- 实验文档很完善(rcore-tutorial-2022S)需要学习的地方的写的地方很多
- 一步一步实现功能,在实验中改写之前的,不断添加功能的一步步学习的感觉很棒
- 希望一年多设置几次训练营,让更多的朋友加入进来
- 因为本身不是学习计算机的,在这一次机会中也尝试了写OS,尝试了做自己喜欢的事情,虽然过程很漫长!但是第一阶段完美结束我已经十分开心了
- 希望在结束考研时候也能加入到rCore和zCore社区中来,为社区尽一份力,在rust大家庭中相互学习相互进步!