diff --git "a/source/_posts/axsl666-2023\347\247\213\347\254\254\344\272\214\351\230\266\346\256\265\346\200\273\347\273\223.md" "b/source/_posts/axsl666-2023\347\247\213\347\254\254\344\272\214\351\230\266\346\256\265\346\200\273\347\273\223.md" new file mode 100644 index 00000000000..29622b8c69f --- /dev/null +++ "b/source/_posts/axsl666-2023\347\247\213\347\254\254\344\272\214\351\230\266\346\256\265\346\200\273\347\273\223.md" @@ -0,0 +1,119 @@ +# 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 +- 完成系统调用功能 + - 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) +- 完成系统调用 sys_linkat + +### sys_unlinkat + +- 给 File trait 增加 fstat 接口 +- 扩展 efs 中 DiskInode 接口 + - get_inode_id: get_disk_inode_pos的逆过程 +- 在 vfs 中 Inode 增加接口 + - delete_link + - 遍历目录下所有目录项,找到与对应文件名相同的inode + - 删除(清空)对应目录项 +- 完成系统调用 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 + - 可利用资源向量 分配矩阵 需求矩阵 +- 数据更新 + - 相关系统调用时进行更新数据 +- 检测算法 + - 获取资源前进行死锁检测