Axsl666-2023秋季OS训练营第二阶段总结
首先感谢learningOS社区的所有贡献者。前几次训练营因为错过报名时间而未能参加,终于在2023秋季参与到了本次训练营活动。
实验一内容总结
多任务系统的简单实现
- 扩展
TaskControlBlock
:start_time
started
syscall_times
- 设计
TaskManager
的公共接口add_syscall_times
get_current_task_info
- 在相应函数中更新 TCB 数据, 记录开始时间:
run_first_task
run_next_task
- 在系统调用处理函数中调用
add_syscall_times
更新 TCB 中的记录 - 完成
sys_task_info
系统调用- 主要是调用
get_current_task_info
并返回TaskInfo
。
- 主要是调用
实验二内容总结
系统开启虚拟地址空间
重写 sys_get_time 和 sys_task_info
- 在内存管理中增加 translated_mut_ptr 函数,实现进程用户地址空间中的指针到可变引用的转换
- 其余类似 ch3 中的操作
mmap 和 munmap 匿名映射
- 内存管理接口
- delete_frame_area
- 任务管理接口
- mmap:调用insert_framed_area增加映射区域
- munmap:调用delete_frame_area删除映射区域
- 系统调用的实现
- 合法性检验
- 调用任务管理接口 mmap 和 munmap
实验三内容总结
实现进程管理相关系统调用
实现系统调用 spawn
- 扩展 Task 公共接口
- spawn
- MemorySet::from_elf 新建地址空间,用户栈,程序入口点
- 分配 pid 与内核栈
- 建立 TCB
- 加入父进程的子进程链表
- 准备 TrapContext
- 返回新子进程的TCB
- spawn
- 完成系统调用功能
- sys_spawn
实现 stride 调度算法
- 扩展 TCB
- stride
- priority
- 扩展 Task 公共接口
- set_priority
- 修改 TaskManager 调度算法
- fetch 修改为 stride 调度算法
- 完成系统调用功能
- sys_set_priority 调用 set_priority
实验四内容总结
实现几个文件系统相关系统调用
sys_linkat
- 给 File trait 增加 fstat 接口
- 扩展 efs 中 DiskInode 接口
- get_inode_id: get_disk_inode_pos的逆过程
- 在 vfs 中 Inode 增加接口
- create_link
- 新建目录项,(new_name, old_inode_id)
- create_link
- 完成系统调用 sys_linkat
sys_unlinkat
- 给 File trait 增加 fstat 接口
- 扩展 efs 中 DiskInode 接口
- get_inode_id: get_disk_inode_pos的逆过程
- 在 vfs 中 Inode 增加接口
- delete_link
- 遍历目录下所有目录项,找到与对应文件名相同的inode
- 删除(清空)对应目录项
- delete_link
- 完成系统调用 sys_unlinkat
sys_stat
- 给 File trait 增加 fstat 接口
- 扩展 efs 中 DiskInode 接口
- get_inode_id: get_disk_inode_pos的逆过程
- 在 vfs 中 Inode 增加接口
- inode_id: 实现获取自身 inode id
- isdir:判读是 inode 否为目录
- linknum: 获取 root inode 下的某一个 inode id 对应的硬链接数量
- 完成系统调用 sys_stat
实验五内容总结
本节主要几种同步原语与及其内核实现。
- 加入死锁检测机制,实现银行家算法。
- 扩展 PCB 和 TCB
- 可利用资源向量 分配矩阵 需求矩阵
- 数据更新
- 相关系统调用时进行更新数据
- 检测算法
- 获取资源前进行死锁检测