0%

2025春季开源操作系统训练营前三阶段总结报告

各阶段总结

阶段一

rustling,对rust语言的引入,很不错的一个仓库,很久没用了,边写边复习,如果题目更多一点就更好了

阶段二

lab1

对系统调用的计数,遇到了比较神奇的bug,调用数组设置太大导致获取时间的调用出现异常,卡了挺久,本来是挺简单的,如果遇到类似bug的可以试试限制调用数组的长度

lab2

引入了虚存,工作主要集中在memory_set部分,在实现采用了RAIL机制,加上rust的所有权及drop trait自动实现页表项的释放

lab3

迁移三个函数,主要变化就是taskmanager多分出了一个processor,关于spawn,结合TaskControlBlock的fork和exec方法,从中选出直接spawn应该如何构造TaskContext和TrapContext
值得一提的是stride调度算法在筛选task的时候其实可以用优先级队列筛的,然而没时间了只能用个暴力遍历,对自己手搓的能力感到无奈

lab4

简单的文件系统,主要是理解inode的相关机制吧,首先对于创建硬链接来说,得先在diskinode加一个nlink用于引用计数,创建硬链接就先find_inode_id,然后modify_disk_inode为根增加direntry,name就是链接名,然后就创建完成,在通过目标文件的inode用modify增加引用计数nlink即可

unlinkat类似,先删direntry然后找到对应inode,引用计数-1,加一个判断如果nlink为0了就删文件回收inode和数据块

对sys_fstat来说,在Inode中增加get_inode_id、get_mode、get_nlink等函数,从fd_table中我们能拿到OSInode,OSInode中能拿到Inode,从而可以调用增加的函数获取文件信息

lab5

死锁检测,在每一次 sys_mutex_lock 以及 sys_semaphore_down时判断,会死锁则 return -0xdead;

对于 mutex
遍历一遍有没有别的 thread 正在拿这个 mutex 就行
其实就相当于 semaphore 里面的可用资源只有 1 个
主要思路还是遍历并逐个判断

阶段三

exercise1

没有太多好说的,主要也是偷懒了涉及axhal层的不想修改,直接在axstd层次做一个ANSI转义

exercise2

支持hashmap类型,看exercise文件可以知道要在axstd创建个collections文件夹模块,内部一个hashmap.rs和一个mod.rs把hashmap公布出去,hashmap的具体实现偷懒抄了下hashbrown,拿来简化了一下,再次对自己的手搓能力感到无奈,以后有时间再好好实现一次

exercise3

实现新的内存算法bump,把arceos/modules/bump_allocator/src/lib.rs中的EarlyAllocator类实现即可。

实际上还是偷懒了,对于字节分配,不去记录已分配的字节区域的开始位置及长度,仅仅记录一个分配次数count,alloc时count + 1,dealloc时count - 1,当count为0时才回收所有ByteAllocator的区域(b_pos收到start那里);

exercise4

支持ramfs的rename操作,主要注意一下把cargo里的包换成arceos下面的(不然文件系统的包永远是网上拉下来的)(搞了挺久,恼),找到对traitVfsOpsVfsNodeOps的实现之后,搞清楚记录文件的数据结构,实现rename就可以了。

exercise5

为宏内核支持sys_mmap系统调用,实现对文件的映射,参考 arceos/tour/m_2_0/src/main.rs handle_page_fault() 和 arceos/tour/m_2_0/src/loader.rs,除此之外,注意一下musl-gcc的环境变量

exercise6

实现最简单的Hypervisor,响应VM_EXIT常见情况,感觉像是面向测例的编程,csrr a1, mhartid 和 ld a0, 64(zero) 触发异常后,手动完成其功能

希望后续实习能增强动手能力,还有很多底层细节实现感觉不熟悉,调试代码的能力也不足,经常被一些很基础的问题卡住(笑)