diff --git "a/source/_posts/2023\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\350\256\255\347\273\203\350\220\245\347\254\254\344\272\214\351\230\266\346\256\265\346\200\273\347\273\223-\345\217\266\351\222\247\345\226\206.md" "b/source/_posts/2023\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\350\256\255\347\273\203\350\220\245\347\254\254\344\272\214\351\230\266\346\256\265\346\200\273\347\273\223-\345\217\266\351\222\247\345\226\206.md" new file mode 100644 index 00000000000..60201237431 --- /dev/null +++ "b/source/_posts/2023\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\350\256\255\347\273\203\350\220\245\347\254\254\344\272\214\351\230\266\346\256\265\346\200\273\347\273\223-\345\217\266\351\222\247\345\226\206.md" @@ -0,0 +1,75 @@ +--- +title: 2022开源操作系统训练营第二阶段总结-叶钧喆 +date: 2023-11-02 18:39:42 +categories: + - report +tags: + - author:ye-junzhe + - rcore-lab +--- + +# 第二阶段总结 + +## 学习感受 + +- 在参加rCore训练营之前,对于操作系统的相关知识我是比较模糊的,在平时的编程中往往只是简单用到一些比如协程、多线程、原子计数、互斥锁等等编程语言提供的编程模型,对于其内在实现基本一知半解,而在这次阅读了rCore相关教材之后,对这些函数背后所隐藏的机制有了更深的了解。在训练营的过程中,因为之前有用Rust经验,所以第一阶段Rustlings能够比较快速的解决,但是到了第二阶段,因为对于相关知识比较陌生所以做的比较慢一些,unsafe Rust、risc-v汇编这些平时接触非常少,所以在阅读相关代码的时候要查阅较多资料。目前虽然完成了第二阶段晋级的目标,但是感觉前方未知的领域更加宽广。 +- rCore依托于Github的授课方式也让我大开眼界,第一次知道Gihub Classroom这个服务,老师们围绕OS的学习建立的这一整套学习方式(Github Actions、排行榜、直播课网站),不仅仅局限于书本,把计算机专业和教学的完美结合到一起。同时rCore的社区感觉也已经很庞大了,已经有许多人做出了自己的贡献,虽然我目前还没有厉害到可以给rCore提PR,但是希望以后可以。 + +## 学习总结 + +- 其实我学习Rust的开端比较早,就是看到各大视频网站有很多关于Rust如何安全的宣传视频,当时也没有适用场景和刚需,单纯出于好奇就开始了自学,在学完之后也就仅限于用来做一些比如Advent of Code的编程题,但是其间经常由于Rust严格的检查而被Rust折磨🤣。rCore把Rust用到了系统级的编程领域,难度更是加大了,因为要理解这些代码,首先要理解其背后隐含的OS设计思想,这些就是我对于Rust学习的感受。 + +## Lab总结 + +### Ch3 Lab + +第一次做OS相关Lab,在起步时熟悉整个代码框架是比较重要的,这样在做题时才能找到相关的接口,Ch3 lab主要关于task info的获取,需要编写函数来获取每个task的相关信息。 + +- 为TaskControlBlock增加field + - start_time: usize + - syscall_count: [u32: MAX_SYSCALL_NUM] + +- os/src/task/mod.rs +1. 为TaskManager实现syscall_count_increment() + 主要逻辑: + - 使用match来匹配syscall id,从而决定增加conut的对象。 + - 并在trap_handler中调用。 +2. 在run_first_task()中使用get_time_ms()获取当前时间 + +- os/src/syscall/mod.rs +1. 为TaskInfo实现reveal() + 主要逻辑: + - 计算运行时间 + - 从Task Control Block中获取task info + 在sys_task_info()调用 + +### Ch4 Lab + +在初读关于内存空间的内容时经常一头雾水,各种术语经常忘了意思,需要经常翻速查表、文档和笔记。 +因为地址空间的跳转,所以之前的trap的实现也要修改。 + +- os/mm/memory_set.rs + - mmap + - 将vpn与ppn关联,从遍历整个VirtualPageNum,若已存在对应pte,则返回失败,若不存在则分配ppn + - munmap + - 将vpn从page table移除 + + +- os/syscall/process.rs + - sys_get_time() + - 用 translated_byte_buffer 将用户地址转换为对应的物理地址,然后读取TimeVal大小的内存 + - sys_task_info() + - 同理先转化为对应物理地址,然后读取TaskInfo大小的内存,就可以获取task_info + +### Ch5 Lab + +Lab 5实现spawn和stride调度算法,spawn一个子线程需要创建一个新的TaskControlBlock,然后再push到当前任务下 + +- os/syscall/process.rs + - sys_spawn() + - 首先获取app data(get_app_data_by_name), 再根据data生成新的task + - sys_get_priority() + +- os/task/manager.rs + - 实现stride算法 + - 对TaskManager的ready_queue进行迭代,使用min_by_key()找到当前最优先的TaskControlBlock