制作一个RISC-V的操作系统十三-抢占式多任务和兼容协作式多任务

文章目录

  • 强占式多任务
  • 流程
  • 代码具体流程
  • 兼容协作式多任务(软中断)
  • 寄存器 msip
  • 流程
  • 代码
  • 结果

强占式多任务

在这里插入图片描述

流程

抢占式多任务由计时器中断触发,最后在处理程序中切换到下一个进程
在这里插入图片描述

代码具体流程

上下文中增加pc寄存器
在这里插入图片描述
寄存器保留上下文和切换,做调整

将mepc存到当前上下文的pc寄存器位置处
切换时将向下一个上下文的pc位置处的寄存器给mepc
在这里插入图片描述

兼容协作式多任务(软中断)

实现主动放弃CPU

依旧是由CLINT实现

寄存器 msip


RISC-V 规范定义了多种处理器模式,其中之一是 Machine 模式,这是一种最高权限模式,用于实现操作系统内核或 hypervisor 等核心功能。在 Machine 模式下,处理器提供了一系列 Memory-Mapped Control and Status Registers (CSRs),这些寄存器可以通过内存地址直接访问,就像普通的内存区域一样。

mip 即 Machine Interrupt Pending 寄存器,它是一个 CSR,用于指示哪些中断事件当前处于pending(待处理)状态。其中 mip.MSIP 是 Machine Software Interrupt Pending 位,专门用来表示机器级别的软件中断请求是否正在等待处理。

在RISC-V体系结构中,当一个hart(硬件线程)需要向另一个hart发送软件中断时,可以通过向另一个hart的MSIP位写入1来发起中断请求。MSIP映射到寄存器MSIP上的一个位,这个寄存器映射到内存上,即MSIP是memory-mapped的,这意味着可以通过内存访问指令(如load/store指令)来读写这个位,进而触发或清除中断。

具体而言,当mip.MSIP = 1时,表示有机器级别的软件中断待处理;当mip.MSIP = 0时,则表示没有此类中断待处理。通过这种方式,处理器能够在硬件级别支持高效的中断通信和管理。

流程

  1. 写入MSIP触发软中断,中断号为3
    在这里插入图片描述

  2. 进入中断处理程序,然后切换上下文流程和抢占式多任务一样,就是触发切换的方式不同
    在这里插入图片描述

代码

注意由于第一次切换上下文直接使用mret,此时mret会进行如下操作

  1. 通过mstatus的MPP恢复到当前的权限
  2. 通过mstatus中的pmie恢复mstatus中的pie

所以需要提前对mstatus做相应的设置

相关代码注意事项在代码注释中
https://github.com/FULLK/risllkos/tree/main/Fullkenerl8

结果

在这里插入图片描述

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

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

相关文章

A39 STM32_HAL库函数 之 Rcc通用驱动 所有函数的介绍及使用

A39 STM32_HAL库函数 之 Rcc通用驱动 所有函数的介绍及使用 1 该驱动函数预览1.1 HAL_RCC_DeInit1.2 HAL_RCC_OscConfig1.3 HAL_RCC_ClockConfig1.4 HAL_RCC_MCOConfig1.5 HAL_RCC_EnableCSS1.6 HAL_RCC_DisableCSS1.7 HAL_RCC_GetSysClockFreq1.8 HAL_RCC_GetHCLKFreq1.9 HAL_…

C++笔记打卡第23天(STL常用算法)

1.常用排序算法 sort&#xff1a;对容器内元素进行排序 class Myprint { public:void operator()(int val){cout << val << " ";} };// 查自定义数据类型 void test01() {vector<int> v;v.push_back(10);v.push_back(20);v.push_back(15);v.push_b…

Qt :Ordered Map

在项目中&#xff0c;有时候对数据结构有这样的需求&#xff0c;既需要具备Map的高效读写&#xff0c;又要兼具插入数据成员的有序性&#xff0c;这时候你就需要使用Ordered Map了。 关于Ordered Map,相关资源比较多&#xff0c;实现思路比较简单&#xff0c;基本上都是通过lis…

使用零拷贝技术加速视频图像操作

不使用cv::cuda::HostMem的情况 当直接创建cv::cuda::GpuMat并从CPU内存拷贝数据到GPU时&#xff0c;如果没有共享内存机制&#xff0c;数据传输是通过常规的内存拷贝完成的&#xff0c;例如&#xff1a; uchar* nv12Data; // CPU内存中的NV12数据 cv::Mat hostImage(height …

C# 获取一个字符串中数字部分?

要在 C# 中将一个字符串中只保留数字字符&#xff0c;以下是两种实现方法&#xff1a; 方法一&#xff1a;使用正则表达式 正则表达式是一种强大的文本模式匹配工具&#xff0c;可以轻松地提取字符串中符合特定规则的部分。 在这种情况下&#xff0c;我们可以使用一个匹配数…

数据挖掘实验一

一、实验环境及背景 使用软件&#xff1a; Anaconda3 Jupyter Notebook 实验内容&#xff1a; 1.使用Tushare或者其他手段获取任意两支股票近三个月的交易数据。做出收盘价的变动图像。2.使用Pandas_datareader获取世界银行数据库中美国&#xff08;USA&#xff09;、瑞典&…

【中级软件设计师】上午题12-软件工程(2):单元测试、黑盒测试、白盒测试、软件运行与维护

【中级软件设计师】上午题12-软件工程&#xff08;2&#xff09; 1 系统测试1.1 单元测试1.2 集成测试1.2.1 自顶向下1.2.2 自顶向上1.2.3 回归测试 2 测试方法2.1 黑盒测试2.1.1 McCabe度量法 2.2 白盒测试2.2.1 语句覆盖-“每个流程”执行一次2.2.2 判定覆盖2.2.3 条件覆盖-A…

资源、死锁、如何监测死锁

资源&#xff1a;变量、对象、网络资源、文件、内存、cpu等等 &#xff08;应用层或者会话层 资源&#xff09; 统一资源限定符&#xff1a;[scheme:][//authority][path][?query][#fragment] authority 可以表示&#xff1a; [user-info]host[:port] 比如&#xff1a; fi…

vue+springboot项目的登录验证码(JAVA自带)

后台springboot CaptureController package com.example.controller;import com.example.common.Result; import com.example.service.AuthCodeService; import com.example.utils.CodeUtils; import lombok.SneakyThrows; import org.apache.ibatis.annotations.Param; impo…

Java openrasp记录-01

例子1 https://github.com/anbai-inc/javaweb-expression 一个hook ognl、spel、MVEL表达式注入的例子 用的是asm5进行字节码修改 采用premain进行插桩&#xff0c;重写transform方法 expClassList是要hook的类&#xff0c;这里定义在MethodHookDesc 这里判断hook点通过类名…

Java并发编程:ThreadPoolExecutor详细源码解析与应用

Thread直接创建线程的弊端 在开始解析ThreadPoolExecutor类之前&#xff0c;让我们先来了解直接创建线程所带来的弊端。在Java中&#xff0c;线程是资源密集型对象&#xff0c;每当需要并发执行任务时&#xff0c;直接创建新线程会带来以下问题&#xff1a; 资源消耗 每个线…

贪吃蛇身子改进加贪吃蛇向右移动

1. 蛇移动的思想&#xff1a; 其实就是删除头节点 &#xff0c;增加尾节点&#xff1b;一句代码搞定 struct Snake *p; p head; head head -> next; free(p) 防止造成多的空间节点 2.增加尾节点代码思想&#xff1a; 2.1 .开辟new 节点的空间 struct Snake *new (stru…

解决Android studio更换sdk地址后flutter项目显示no device selected

问题描述 因为之前sdk的路径在c盘上&#xff0c;经常在更新或下在sdk后c盘饱满&#xff0c;于是就更换了sdk的路径&#xff0c;更换sdk路径后就导致flutter项目在选择设备的时候出现no device selected 找不到设备&#xff0c;但是在device Manager可以看到物理设备或者是虚拟…

深入了解Eureka:微服务架构中的服务发现与注册中心

引言 微服务架构的兴起使得应用程序变得更加模块化和可扩展。在这种架构下&#xff0c;服务发现与注册中心扮演着至关重要的角色。本文将深入探讨Eureka作为服务发现与注册中心的作用、优缺点、重要性以及其服务架构。 一、Eureka的作用 Eureka是Netflix开源的一款用于构建分…

【Quartz】quartz集群模式下数据库表设计原则(详细版)

目录 引言 1. 数据共享性 2. 锁管理 3. 持久性和一致性 4. 状态追踪 5. 元数据管理 6. 优化和索引 主要的Quartz表包括 引言 Quartz 是一个流行的开源作业调度库&#xff0c;广泛用于在Java应用程序中安排作业。在Quartz的集群模式中&#xff0c;多个Quartz实例共享一个…

Java设计模式:使用责任链模式和状态模式优化‘审批流程‘

Java设计模式&#xff1a;使用责任链模式和状态模式优化审批流程 摘要引言 需求流程图正文内容&#x1f4d0; 基本概念介绍 功能实现示例1:设计模式&#xff1a;责任链模式方法&#xff1a;好处&#xff1a; 示例2:设计模式&#xff1a;责任链模式方法和操作流程&#xff1a;好…

【canvas】前端创造的图片粒子动画效果:HTML5 Canvas 技术详解

前端创造的图片粒子动画效果&#xff1a;HTML5 Canvas 技术详解 我们将深入探讨如何通过 HTML5 的 Canvas 功能&#xff0c;将上传的图片转换成引人入胜的粒子动画效果。这种效果将图片分解成小粒子&#xff0c;并在用户与它们交互时产生动态变化。我们将分步骤详细解析代码&a…

EasyRecovery数据恢复软件2025永久免费电脑版下载

EasyRecovery数据恢复软件是一款业界知名的数据恢复工具&#xff0c;它凭借强大的恢复能力和广泛的数据兼容性&#xff0c;帮助用户从各种存储设备中恢复丢失或删除的数据。以下是关于EasyRecovery数据恢复软件的详细介绍。 EasyRecovery绿色破解下载网盘链接: https://pan.ba…

自动驾驶行业源代码防泄漏解决方案

行业背景&#xff1a; 随着新一代信息通信及人工智能技术的快速发展&#xff0c;汽车作为这些新技术应用的重要载体&#xff0c;正在加速向智能化和网联化转型&#xff0c;以自动驾驶研发为主业的企业也越来越多&#xff0c;如何保障自己研发的算法、模型、系统不被研发人员离…

Linux入门攻坚——20、systemd、(sysvinit、upstart重温)

再一次讲到Linux系统启动流程&#xff1a; POST --> Boot Sequence --> Bootloader(grub) --> kernel initramfs(initrd) --> rootfs --> /sbin/init 对于init&#xff0c;即系统内核加载完毕后&#xff08;加载kernel和切换根文件系统&#xff09;运行…