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

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.mfbz.cn/a/559391.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue快速入门(三十四)组件data定义方法

注释很详细&#xff0c;直接上代码 上一篇 新增内容 数据绑定方法照常数据定义方法需要作为函数返回值 源码 MyTest.vue <template><div><h1>我的功德&#xff1a;{{merits}} </h1><button click"meritsnum1">功德加一</button>…

C++实战——日期类的实现

日期类的实现 前言一、日期类概念实现运用场景 二、日期类的具体实现代码构造函数拷贝构造函数获取日期&#xff08;内联函数&#xff09;赋值加等减等加减小于小于等于大于大于等于相等不相等前置后置前置- -后置- -关于类里重载的比较运算符为什么要加外部const示例 Date.hDa…

常见UI组件(二)

一、文本输入 1.1 概述 TextInput为文本输入组件&#xff0c;用于接收用户输入的文本内容 1.2 参数 Entry Component struct Index {build() {Column({space : 50}) {TextInput({placeholder:请输入用户名}).width(70%)TextInput({text:当前内容}).width(70%)}.width(100%).…

90天精通Psim仿真--经典实战教程--第10天 Simcode DSP28335 LED控制

PSIM (Power Simulation) 是一款电力电子和电机控制仿真软件,而DSP28335是德州仪器(TI)的一款数字信号处理器(DSP)。如果你想要在PSIM的SimCoder环境中为DSP28335生成LED闪烁的代码,遵循以下步骤: 打开PSIM并创建模型: 首先,在PSIM中创建一个电路模型,该模型应包括DS…

Bootstrap 5 保姆级教程(十一):模态框 提示框

一、模态框 1.1 创建模态框 以下实例创建了一个简单的模态框效果 &#xff1a; <div class"container mt-3"><h3>模态框实例</h3><p>点击按钮打开模态框</p><button type"button" class"btn btn-primary" d…

Scikit-Learn 支持向量机分类

Scikit-Learn 支持向量机分类 1、支持向量机&#xff08;SVM&#xff09;1.1、SVM概述1.2、SVM原理1.3、SVM的损失函数 1、支持向量机&#xff08;SVM&#xff09; 1.1、SVM概述 在机器学习中&#xff0c;支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#x…

C++入门5.内联函数,auto关键字,基于范围的for循环(C++11),指针空值nullptr(C++11)

本篇是C过度C初始的最后一篇&#xff0c;快快对入门须知的知识有个印象后&#xff0c;就可以顺顺利利的学习C的类了。 目录 内联函数&#xff1a; 内联函数的特性&#xff1a; auto关键字(C11)&#xff1a; auto简介&#xff1a; 使用细则&#xff1a; auto不能推导的场…

【Linux】帮助类命令

在Linux中&#xff0c;man用于查看系统手册页&#xff08;manual pages&#xff09;。它用于查阅关于特定命令、函数、工具或文件格式的详细信息。要使用man命令&#xff0c;只需在终端中输入man&#xff0c;后跟您要查看的命令或主题的名称。 例如&#xff0c;如果查看ls命令…

【Linux C | 多线程编程】线程同步 | 信号量(无名信号量) 及其使用例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

018Node.js安装淘宝镜像(cnpm命令)

http://www.npmjs.org npm包官网 https://npm.taobao.org 淘宝npm镜像官网 淘宝NPM镜像是一个完整npmjs.org镜像&#xff0c;你可以用此替代官方版本&#xff08;只读&#xff09;&#xff0c;同步频率目前为10分钟一次&#xff0c;保证尽量与官方服务同步。 可以定制的cnpm(…

若依前后端部署到一起

引用&#xff1a;https://blog.csdn.net/qq_42341853/article/details/129127553 前端改造&#xff1a; 配置打包前缀 修改router.js 编程hash模式&#xff1a; 前端打包&#xff1a;npm run build:prod 后端修改&#xff1a; 添加thymeleaf包&#xff0c;和配置文件 spri…

Three.js加载glb / gltf模型,Vue加载glb / gltf模型(如何在vue中使用three.js,vue使用threejs加载glb模型)

简介&#xff1a;Three.js 是一个用于在 Web 上创建和显示 3D 图形的 JavaScript 库。它提供了丰富的功能和灵活的 API&#xff0c;使开发者可以轻松地在网页中创建各种 3D 场景、模型和动画效果。可以用来展示产品模型、建立交互式场景、游戏开发、数据可视化、教育和培训等等…

Jenkins用maven风格build报错解决过程记录

1、Jenkins2.453新建项目&#xff0c;构建风格选的maven 2、自由风格构建部署没有任何问题&#xff0c;但是maven风格build一直失败&#xff0c;报错如下图 3、解决方案&#xff1a;在系统管理–系统配置–Maven项目配置&#xff0c;删除全局MAVEN_OPT的路径信息&#xff0c;…

OpenCV基本图像处理操作(四)——傅立叶变换

傅里叶变换的作用 高频&#xff1a;变化剧烈的灰度分量&#xff0c;例如边界 低频&#xff1a;变化缓慢的灰度分量&#xff0c;例如一片大海 滤波 低通滤波器&#xff1a;只保留低频&#xff0c;会使得图像模糊 高通滤波器&#xff1a;只保留高频&#xff0c;会使得图像细节…

事务的传播行为介绍和事务失效

常用的就下图介绍的这两种&#xff0c;REQUIRED 支持当前事务&#xff0c;如果不存在&#xff0c;就新建一个&#xff0c;EQUIRES_NEW 如果有事务存在&#xff0c;挂起当前事务&#xff0c;创建一个新的事务 同一个service中必须用代理对象调用&#xff0c;否则失效

ubuntu22.04下编译ffmpeg和ffplay

Ubuntu22.04 下编译安装 ffmpeg 和 ffplay 一、下载源码包 1.1 官方下载链接&#xff1a;Download FFmpeg 可以手动下载&#xff0c;也可以命令行下载&#xff1a; wget http://www.ffmpeg.org/releases/ffmpeg-7.0.tar.xz 1.2 下载完解压 tar -xvf ffmpeg-7.0.tar.xz…

3.SpringCloud版本

1.SpringCloud与SpringBoot之间版本对应 2.服务拆分的注意事项 1.不同微服务&#xff0c;不要重复开发相同业务。 2.微服务的数据独立&#xff0c;每个微服务都有自己独立的数据库&#xff0c;不要访问其他微服务的数据库。 3.微服务可以将自己的的业务暴露为接口&#xff…

如何选择适用于Mac的iPhone数据恢复软件?

以下是全球无数 Mac 用户每天遇到的场景&#xff1a; 用户丢失了重要文件。用户在搜索中输入术语“iPhone数据恢复软件”。出现了数百个可能合适的软件应用程序&#xff0c;使用户很难决定其中哪一个是最好的。 这并不好&#xff0c;因为iOS数据恢复是一个时间敏感的过程&…

Spring、SpringMVC、SpringBoot核心知识点(持续更新中)

Spring、SpringMVC、SpringBoot核心知识点&#xff08;持续更新中&#xff09; Spring Bean 的生命周期Spring 的 IOC 与 AOPSpring Bean 循环依赖Spring MVC 处理请求的过程Spring Boot 自动装配原理Spring Boot 启动流程 Spring Bean 的生命周期 参考文章&#xff1a;一文读…

提取点云-------PCL

提取点云 /// <summary> /// VoxelGrid滤波下采样 /// </summary> /// <param name"cloud">需要滤波的点云</param> /// <param name"lx">三维体素栅格的x</param> /// <param name"ly">三维体素栅格…