参与方向:宏内核,posix 接口相关。
我在四阶段中编写的是 futex 有关的代码。
设计思路
暂时请求了五个 os 需要实现的接口,分别是
sched_yield
退出当前的任务,不放回调度队列。translate_vaddr
将当前任务的虚拟地址转换成操作系统可以访问的地址current_task
取得当前任务current_prosess_id
取得进程 idwake
传入一个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 周了,看着自己从对操作系统毫无概念一步步到现在还是很感慨的。感谢老师的辛勤付出,感谢训练营能给我一个这样的平台。