一阶段 Rust
Rust程序设计+Rust圣经+Gpt 看任意一本书基本题几乎都能做出来,个别疑难杂症问ai让它讲清楚当前的问题是什么。
二阶段 Rcore
这一部分内容重点在文档阅读,了解每一部分的数据结构设计以及底层接口实现,实验大都有类似的已经实现的功能函数作为参考。
Lab1
sys_trace:
当前所有任务均由任务管理器管理,每个任务均对应一个任务控制块。修改任务控制块数据结构新增系统调用记录数组,系统调用时修改对应任务控制块的系统调用数组。
Lab2
sys_get_time和sys_trace: :
这里引入了虚拟地址空间,存在地址空间隔离。该系统调用接收的地址是虚拟地址,需要通过访问当前任务页表获得真实的物理地址才能实现数据的有效写回和读取。
mmap 和 munmap 匿名映射:
map和umap的下一层接口均有实现,只需要找到然后调用。
踩坑点:这里的传入地址使用是start上取整end下取整形成一个range,这里看似下取整时多取了一页但是其实这是一个左开右闭的区间看起来多取的一页不会被使用。
Lab3
spawn 系统调用定义:
仔细观察fork和exec的实现可知道exec修改的东西很有限将这一部分修改直接替换到fork中就能实现spawn要求的功能。
stride 调度算法:
同样是修改任务控制块维护优先级stride等数据,优先级调度逻辑的具体实现在fetch函数中,当需要从任务队列中去出一个任务时先遍历一遍任务的stride,选取其中最小的来执行。
Lab4
sys_stat:
通过文件描述符获取对应的Osinde,然后向下访问获取信息。
sys_linkat:
在根目录下根据oldname找到对应的inode,复制一份inode并于newname构成新的目录项。
坑:这里维护链接计数是通过遍历根目录查找相同inode实现的,另一种方法是在磁盘的inode里面维护一个链接计数,但是没有找到相应的方法实现也没有实现思路遂没有采用。
unlinkat:
在根目录下直接删除对应项
Lab5
死锁检测机制:
感觉没法避免死锁只能避免进入死所的状态(可能理解有误)。
三阶段 Arceos
有roce的基础三阶段感觉还是比较轻松的
exercise print_with_color
使用 ANSI 转义序列即可
exerxise support_hashmap
这里是使用拉链法实现的一个hashmap
exersise alt_alloc
比较简单按照算法描述实现即可
坑:这里维护内存块的时候不要用Vec,使用数组或者链表即可
exercise ramfs_rename
在axfs_ramfs下作修改为DirNode 实现rename方法。实际上就是根据名字remove对应的inode,然后合并新名字再插入回去。
坑:这里首先要到根目录去patch一下axfs_ramfs依赖,修改依赖成功后报错仍然会是unsupport,实现rename方不报错。
exercise sys_map
先开一个缓存数组把文件内容读进来,然后在userspace中查找尚未分配的area,为该部分area的虚拟地址建立物理映射。然后调用函数将缓存区的文件内容写入到完成映射的虚拟地址空间。
exercise simple_hv
为sepc添加对应的指令偏移然后修改寄存器
坑:不知道为什么需要在两个trap下的代码完成后提前return false而不能等match结束返回false,不然就会卡死。