0%

2023开源操作系统训练营第三阶段ArceOS总结报告-ftq

ArceOS Unikernel 总结报告

回顾学习ArceOS Unikernel的这两周,我学到了很多相关知识。通过石磊老师的教导,我先是从第一个星期的组件化教程开始,实现了彩色输出,然后完成了对HashMap的移植,在用early算法实现了内存分配器后又完成了 dtb 文件的解析和输出,最后修改原有的协作式调度算法fifo为抢占式调度。这一步步的任务让我逐渐掌握了 Unikernel 的用法,对 ArceOS 的整体架构、内存分配及调度算法有了更深入的了解。
然后是第二周的基础任务,分别是:从外部加载应用、将应用拷贝到执行区域并执行、通过 ABI 调用 ArceOS 功能、在 App 中正式调用 ABI 以及支持内核和应用分离的地址空间及切换,基本都是更着做就可以了,通过这些练习,我们也更加深入地了解 ArceOS 系统的运行机制和应用开发技巧。下面本别讲解以下各练习的具体做法及思路。

练习题思路总结

练习 1 和 2

本实验实现加载器 loader ,从外部加载 bin 应用到 ArceOS 地址空间,对头结构的设计要让loader可以读取应用信息。
头结构的设计:
App总数 App1大小 App1 内容 App2 大小 App2 内容 … AppN 大小 AppN 内容
这样就可以很好地管理各个应用程序,从而实现应用程序的加载。

练习 3

在之前实验的基础上修改汇编指令以及 loader 改用批处理的方式加载外部应用即可。

练习 4

本实验只需要添加 SYS_TERMINATE 系统调用,然后让 SYS_TERMINATE 直接调用 axstd::process::exit 即可。

练习 5

这个练习的前两个要求都不难,难的是第三个要求,每一次ABI调用返回到loader的时候都需要返回到应用上一条指令的状态,所以ABI调用的时候需要保存上下文。但在实现时发现a7会一直变化,所以需要使用clobber_abi(“C”) 并额外用临时寄存器存放和加载 abi_table 。最终实现上下文的保存。

练习 6

基于之前的 hello_app 应用,仅保留 putchar 函数。先将 _start 函数的返回值为 (),为 APP 建立独立的页表,实现初始化和切换函数,然后将练习5中等待中断的wfi指令去除再加上独立的页表就可以了。