一个完全用rust写的开源操作系统-Starry

news2025/1/12 15:53:23

1. Starry

Starry是2023年全国大学生计算机系统能力大赛操作系统设计赛-内核实现赛的二等奖作品。Starry是在组件化OS的arceos的基础上,进行二次开发的操作系统内核,使用宏内核架构,能够运行Linux应用的内核。

原始的操作系统大赛的仓库为
https://gitlab.eduxiji.net/202310003101649/starry

目前的宏内核的arceos的开发仓库
https://github.com/Arceos-monolithic (推荐)
(目前仅仅建议使用较为稳定的riscv64架构)

2. Starry 宏内核实现

2.1 axmem 内存管理

宏内核相比于unikernel主要差别在于多进程和多个地址空间。axmem模块负责进程地址空间的管理更确切的说是虚拟地址空间的管理。

在这里插入图片描述
axmem模块依赖于例如page_table和page_table_entry,slab_allocator等其他crate。先回顾一下基本的页表相关的内容页表相当于一棵树Satp是作为页表的根。
在这里插入图片描述
然后是具体sv39模式下的分页

在这里插入图片描述

总而言之,从页表中,可以获取到对应的一个具体虚拟地址页到一个物理地址页的映射但是,对于一个进程来说,同样需要知道他拥有了哪些虚拟地址空间。

首先,操作系统不会把所有空间都分配给某个进程,而是把该进程用到的空间都分配给他。其次,举个例子,在结束进程的时候,需要清理该进程所拥有的进程地址空间,所以必须进行一个记录和维护。

进程虚拟地址空间的特点:拥有多个不一定连续的段(并不是实际意义上的代码段啥的,只是类比,类比)每个段具有多个虚拟空间的页。
在这里插入图片描述
因此Starry用了两个数据结构来表示这个MapArea用于表示一段空间,其中维护了起始地址,对应的物理页面信息等等。分别放在 axmem/src/lib.rs 和axmem/src/area.rs中。

在这里插入图片描述
在这里插入图片描述
当数据结构确定了之后,相应的操作其实都很好理解了,无非就是增删查改。(请注意这两个数据结构的调用关系,比如下图中上层memoryset需要增加一个area的时候,就要调用下层的一个接口)当然还有剩下两个文件,分别是用于描述shared mem和文件系统映射到内存的问题。但是这两个对于理解地址空间这件事情并没有太大影响。

在这里插入图片描述
除此之外,值得关注的还有更改pagetable的satp寄存器内容来切换页表的操作值得留意,和前面介绍的内容不同,这部分并没有放在axmem中,而是具体到不同架构中,放在axhal/src/arch里面对应架构的mod中。
在这里插入图片描述

2.2 axtask 任务管理

Axtask是在之前arceos里面就有的一个模块,但是为了能够适应多进程多地址空间,做了很多的更改。

在这里插入图片描述

从启动开始看一个新的task是怎么生成的最开始是汇编代码,在axhal/platform对应的platform文件夹下面的platform下面,进入rust_entry函数。

在这里插入图片描述
在处理了一大堆前置的东西之后,在rust_entry里面终于进入了rust_main函数。

在这里插入图片描述
在rust_main函数里面,终于开始了喜闻乐见的往屏幕上打印一些基础信息的阶段,在之后,终于开始了一大堆东西的初始化。

在这里插入图片描述

在这里,我们可以看到这么一段代码这段代码的含义是,如果是多进程的内核,就启动多进程,而如果是有多线程的要求,那么启动多线程的。

在这里插入图片描述

但是多进程也会有多线程的呀,那么不要灰心,进入init_kernel_processer函数仍然需要调用axtask的init_scheduler,至于其他的内容则是初始化一个内核进程的内容罢了。

在这里插入图片描述
来看看init_scheduler做了什么实质性的内容,只有run_queue的init(虽然timer也很重要,但是跟我们的多进程多线程没啥关系)

在这里插入图片描述

在这里,你可以看到一个idle的task以及一个main_task。并且在最后,把current task设置为了main task请注意idle和main的差别,当前的代码执行流应当归属于main task,因此idle是一个新建的,然后继续运行main。

在这里插入图片描述
除此之外,和一个task相关的数据结构则放在task.rs文件中。

在这里插入图片描述

2.3 axprocess 进程管理

axprocess是增加的一个模块。该模块实现了进程这个概念。核心主模块在process.rs文件中。

一个很大的不同点在于:axtask和axprocess分别相当于线程和进程,因此,与很多只能看到内核进程的操作系统不同,在Starry中,是能够同时看到进程和进程中的线程的。

在这里插入图片描述

在这里插入图片描述

对于一个进程而言需要管理的资源如下图所示:

  • 子进程
  • 所拥有的线程
  • 文件描述符

在这里插入图片描述
还是回到前面的分支,多任务和多进程的区分之处,这回,来看看除了init_scheduler生成了idle和main的任务之外,还做了什么。
他初始化了一个process结构体,并且把对应的IDLE的task塞进去了。

思考一下:main task咋办?他没被塞到任何进程里面去

在这里插入图片描述
在rust_main里面process或者task init之后,再经过了其他的init,最后会运行到main。

在这里插入图片描述
而这部分,会最终运行到apps里面的用户态函数入口。

在之前我们讲到测例的这个run testcase的这个loop的时候,来注意一下这里面代码的main_task。
在这里插入图片描述

最后来考虑一下进程的切换。在这里他调用了一个yield now task。

在axprocess/api.rs中借用了axtask的yield_now。这又调用了run_queue的yield_current,最终调用runqueue的一个resched

在这里插入图片描述

随后是run_queue的switch_to函数,他在这里,对于切换不同的进程地址空间,使用了如下的代码(又回到了熟悉的函数),来切换不同的页表基地址寄存器。

在这里插入图片描述
最后会运行到context_switch,从而使用汇编,保存旧的任务的寄存器值,加载新的寄存器的值。

在这里插入图片描述

3. Starry 代码流程

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1609459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 基础命令docker及防火墙iptables详解

应用场景: web应用自动打包和发布 自动化测试,持续集成、发布 在服务环境中部署后台应用 搭建paaS平台 安装应用 apt install docker.io#kali中 配置docker源,文件位置/etc/docker/daemon.json { "registry-mirrors": [ "h…

原牛角源码(修罗bbs)全站程序打包带数据库备份

原牛角源码(修罗bbs)全站程序打包带数据库备份,牛角源码全站数据全站文件、插件打包分享给大家,有兴趣的可以搭建玩玩! conf文件夹中自己配置conf.php里面的数据库链接文件,默认管理账号:admin,密码&#…

【大数据】bigtable,分布式数据库的鼻祖

目录 1.概述 2.数据模型 3.API 4.架构 5.一个完整的读写过程 6.如何查找到要的tablet 7.LSM树 1.概述 本文是作者阅读完bigtable论文后对bigtable进行的一个梳理,只涉及核心概念不涉及具体实操,具体实操会在后续的文章中推出。 GFS的出现虽然解…

上位机图像处理和嵌入式模块部署(树莓派4b实现xmlrpc通信)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面,我们也用纯API实现过上位机和开发板之间的通信。当时使用的方法,就是用windows自带的网络sdk和linux自带的api函数来完…

分享4张亚马逊云科技AWS免费云开发和AI证书(有答案)

今天给大家带来特别福利,一口气带来亚马逊云科技AWS4张免费云开发/AI证书(有Credly徽章,有答案),这四门都是云开发相关的硬核知识,含金量极高。 主要考察如何用AWS AI服务进行开发、以及当下热门的云原生改造,16道题80…

葡萄书--关系图卷积神经网络

异质图和知识图谱 同质图与异质图 同质图指的是图中的节点类型和关系类型都仅有一种 异质图是指图中的节点类型或关系类型多于一种 知识图谱 知识图谱包含实体和实体之间的关系&#xff0c;并以三元组的形式存储&#xff08;<头实体, 关系, 尾实体>&#xff0c;即异…

IP地址定位:揭秘精准定位的技术与应用

在数字化时代&#xff0c;IP地址已成为连接互联网世界的关键标识之一。但是&#xff0c;很多人对于IP地址的精准定位能力存在疑虑。本文将深入探讨IP地址定位的技术原理以及其在实际应用中的精确度。 IP地址查询&#xff1a;IP数据云 - 免费IP地址查询 - 全球IP地址定位平台 …

Python中的设计模式与最佳实践

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的设计模式与最佳实践 在软件开发中&#xff0c;设计模式是一种解决常见问题的经过…

怎么把网页上的文字变小?

以下是针对常见浏览器的说明&#xff1a; ### Google Chrome&#xff1a; 1. 打开 Chrome 浏览器并导航到您想要调整文字大小的网页。 2. 在页面上右键单击空白处&#xff0c;然后选择 "检查" 或按下 CtrlShiftI&#xff08;在 Windows 或 Linux 上&#xff09;或 Co…

【剪映专业版】14为视频添加炫酷特效

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 1.特效 画面特效&#xff1a;用于整个画面 人物特效&#xff1a;仅用于画面中的人物&#xff0c;如画面中无人&#xff0c;则不起作用 2.添加特效 按号添加 可通过鼠标推动实现特效时间调节 可叠加使用特效 3.特效修…

关于ERA5气压和温度垂直补偿公式的对比情况

1. 气压和温度垂直补偿对比 「谨代表给个人观点&#xff0c;杠精请自测&#xff0c;对对对&#xff0c;好好好&#xff0c;你说啥都对」。 使用2020-2022陆态网GNSS与探空站并址的48个站点实验&#xff0c;以探空站为真值&#xff0c;验证ERA5精度。怎么确定并址请看前面文章…

平衡二叉树(后序遍历,力扣110)

解题思路&#xff1a;采取后序遍历的好处是先遍历节点得到高度&#xff0c;然后再判断高度差是否大于一&#xff0c;如果是的话就返回-1&#xff0c;不是就返回两高度中较大的高度加一就是父节点的高度 具体代码如下&#xff1a; class Solution { public: int travel(TreeN…

Numpy重修系列(一) --- 初识Numpy

一、为什么使用Numpy&#xff1f; 1.1、简介 Python科学计算基础包&#xff0c;提供 多维数组对象 、派生对象&#xff08;掩码数组、矩阵&#xff09; 数组的快速操作&#xff08;数学计算、逻辑、形状变化、排序、选择、输入输出、离散傅里叶变换、基本线性代数、基本统计运…

利用Python进行大规模数据处理

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用Python进行大规模数据处理&#xff1a;Hadoop与Spark的对比 随着数据量的不断增长&…

Pytorch 学习路程

目录 下载Pytorch 入门尝试 几种常见的Tensor Scalar Vector Matrix AutoGrad机制 线性回归尝试 使用hub模块 Pytorch是重要的人工智能深度学习框架。既然已经点进来&#xff0c;我们就详细的介绍一下啥是Pytorch PyTorch 希望将其代替 Numpy 来利用 GPUs 的威力&…

23年新算法,SAO-SVM,基于SAO雪消融算法优化SVM支持向量机回归预测(多输入单输出)-附代码

SAO-SVM是一种基于SAO雪消融算法优化的支持向量机&#xff08;SVM&#xff09;回归预测方法&#xff0c;适用于多输入单输出的情况。下面是一个简要的概述&#xff0c;包括如何使用SAO-SVM进行回归预测的步骤&#xff1a; 步骤&#xff1a; 1. 数据准备&#xff1a; 收集并准…

Python获取上市公司报告,AI分析助力投资决策

折腾了几天&#xff0c;通过从巨潮信息网上获取上市公司的报告&#xff0c;然后实现调用大语言模型的API去分析报告内容&#xff0c;下面把相应的代码和过程分享给对这个感兴趣的兄弟姐妹们&#xff0c;希望能帮到大家。 1&#xff0c;首先去巨潮信息网首页&#xff0c;右上角…

ProgressFlowmon的confluence接口存在任意命令执行漏洞(CVE-2024-2389)

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 ProgressFlowmon是一整套用于网络映射、应用程序性能…

2024年学浪的缓存怎么导出来

在自我成长的道路上&#xff0c;越来越多的朋友选择通过精选课程来提升自己。然而&#xff0c;面对那些服务期限有限的课程&#xff0c;怎样才能把握住知识的光芒&#xff0c;让它照亮未来的每一个角落&#xff1f;本文就教大家如何利用工具下载学浪app平台的课程 工具我已经打…

Java对象克隆-浅拷贝与深拷贝

目录 1、对象的克隆 1.1 对象的浅拷贝 1.2 对象深拷贝 1、对象的克隆 1.1 对象的浅拷贝 在实际编程过程中&#xff0c;我们常常要遇到这种情况&#xff1a;有一个对象A&#xff0c;在某一时刻A中已经包含了一些有效值&#xff0c;此时可能会需要一个和A完全相同新对象B&am…