Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2024秋冬季开源操作系统训练营第四阶段总结报告-chy669086 #693

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
title: 2024秋冬开源操作系统训练营第三阶段总结-chy669086
date: 2024-11-29 20:08:07
categories:
- 第三阶段总结报告
tags:
- author:chy669086
---

也是很高兴能进入三阶段学习。三阶段让我对操作系统的理解更进一步,通过课后的作业,我也学到了不少知识。

## 个人收获

- 学会了操作系统对设备的挂载
- 了解了 unikernel 到宏内核的转化
- 对操作系统内存分配的了解更进一步
- 通过查漏补缺对上一阶段掌握不熟的知识进行了复习

通过阅读 arceos 的源代码和课后练习,我的程序编写能力也得到了锻炼,让我对操作系统有了全新的认识。

## 未来展望

通过这个阶段的学习,我有以下打算:

- 四阶段希望进行宏内核的学习
- 在寒假时间自己实现一个轻量级的 unikernel 内核,并通过组件化的形式将他变成宏内核

最后,感谢老师的悉心教导,也感谢平台提供的学习机会,让我有了深入学习操作系统的机会。
Original file line number Diff line number Diff line change
@@ -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` 的代码,所以我直接把整个模块删除 `linkme` 后移植到了阶段二的仓库,并编写测试通过。

## 收获

说实话还是不是很擅长编写 no_std 的代码,所以我还是依赖了很多外部库。

虽然没有通过最初的设想去适配到任何一个系统里去(直接移植还是太不松耦合了),但是我也花了很多时间去尝试适配,其中阶段二的项目仓库是最接近完成的一个,结果编译错误了,经过测试发现把 `futex::syscall::sys_futex` 函数调用去掉就可以通过编译,一时间不知道从何改起。转到 `arceos` 适配的时候,在被迫阅读了大量源码之后,发现提供的宏内核示例压根没有创建线程的系统调用,自己写了半天并没有写出来,所以又放弃了。

虽然写的挺差的,而且最近也到学校的期末周了,确实有没有太多时间写这个项目了,但是通过这次 posix 接口的编写,我还是学会了不少东西。

## 总结

从训练营开始到现在也过去 12 周了,看着自己从对操作系统毫无概念一步步到现在还是很感慨的。感谢老师的辛勤付出,感谢训练营能给我一个这样的平台。