From 731a536bc795420ad6a77c0b3ebbb3fcede81e17 Mon Sep 17 00:00:00 2001 From: Dynamic_Pigeon <3040313336@qq.com> Date: Sat, 21 Dec 2024 12:42:55 +0800 Subject: [PATCH] =?UTF-8?q?2024=E7=A7=8B=E5=86=AC=E5=BC=80=E6=BA=90?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E7=B3=BB=E7=BB=9F=E8=AE=AD=E7=BB=83=E8=90=A5?= =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E9=98=B6=E6=AE=B5=E6=80=BB=E7=BB=93-chy66908?= =?UTF-8?q?6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\265\346\200\273\347\273\223-chy669086.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 "source/_posts/2024\347\247\213\345\206\254\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\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223-chy669086.md" diff --git "a/source/_posts/2024\347\247\213\345\206\254\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\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223-chy669086.md" "b/source/_posts/2024\347\247\213\345\206\254\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\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223-chy669086.md" new file mode 100644 index 0000000000..819154fd51 --- /dev/null +++ "b/source/_posts/2024\347\247\213\345\206\254\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\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223-chy669086.md" @@ -0,0 +1,45 @@ +--- +title: 2024秋冬开源操作系统训练营第四阶段总结-chy669086 +date: 2024-12-19 17:32:46 +categories: + - 第四阶段总结报告 +tags: + - author:chy669086 +--- + + +参与方向:宏内核,posix 接口相关。 + +我在四阶段中编写的是 futex 有关的代码。 + +## 设计思路 + +暂时请求了五个 os 需要实现的接口,分别是 + +- `sched_yield` 退出当前的任务,不放回调度队列。 +- `translate_vaddr` 将当前任务的虚拟地址转换成操作系统可以访问的地址 +- `current_task` 取得当前任务 +- `current_prosess_id` 取得进程 id +- `wake` 传入一个 `FutexQ` 类型,唤醒任务(提供了 `get_task` 函数取得任务) + +`FutexQ` 是存放任务的重要类型,内有 `key` `bitset` `task` 三个字段,其中 `key` 和 `bitset` 是用来唤醒任务的重要字段。 + +`FutexKey` 是一个枚举,现在只实现了一个 `Private`,`Shared` 暂时没有开发的思路。 + +任务等待队列存储在 `FutexQueues` 中,通过一个 `futex` 的唯一 key 通过哈希变换后放入或唤醒。 + +现在实现的调用有:`FUTEX_WAIT` `FUTEX_WAKE` `FUTEX_REQUEUE` `FUTEX_CMP_REQUEUE` `FUTEX_WAKE_OP` 以及对应的 bitset 版本 + +因为三阶段提供的宏内核中没有合适的线程实现,二阶短的项目不知道什么原因不能编译 `link-me` 的代码,所以我直接把整个模块移植到了阶段二的仓库,并编写测试通过。 + +## 收获 + +说实话还是不是很擅长编写 no_std 的代码,所以我还是依赖了很多外部库。 + +虽然没有通过最初的设想去适配到任何一个系统里去(直接移植还是太不松耦合了),但是我也花了很多时间去尝试适配,其中阶段二的项目仓库是最接近完成的一个,结果编译错误了,经过测试发现把 `futex::syscall::sys_futex` 函数调用去掉就可以通过编译,一时间不知道从何改起。转到 `arceos` 适配的时候,在被迫阅读了大量源码之后,发现提供的宏内核示例压根没有创建线程的系统调用,自己写了半天并没有写出来,所以又放弃了。 + +虽然写的挺差的,而且最近也到学校的期末周了,确实有没有太多时间写这个项目了,但是通过这次 posix 接口的编写,我还是学会了不少东西。 + +## 总结 + +从训练营开始到现在也过去 12 周了,看着自己从对操作系统毫无概念一步步到现在还是很感慨的。感谢老师的辛勤付出,感谢训练营能给我一个这样的平台。