制作一个RISC-V的操作系统九-上下文切换和协作式多任务(任务 任务上下文 多任务 多任务系统分类 协作式多任务 代码实现 )

文章目录

  • 任务
  • 任务上下文
  • 多任务
  • 多任务系统分类
  • 协作式多任务
  • 代码实现
    • `asm volatile("csrw mscratch, %0" : : "r" (x));`
    • lw和sw
    • p tp 和 zero寄存器
  • 待实现

任务

理解为一个段要执行的指令

任务上下文

理解为执行该任务时对应的CPU的寄存器各个状态

多任务

当执行的核数小于要执行的任务时,此时任务会轮流运转到CPU上,以保证各个任务在宏观上被执行着

多任务系统分类

协作式多任务:任务中的代码来实现放弃CPU并切换到下一个任务
抢占式多任务:操作系统来决定放弃CPU并且还到下一个
在这里插入图片描述

协作式多任务

初始化就是设置各个任务的上下文(各个任务的上下文保存到内存中),如设置上下文的ra(返回地址)为任务的第一条指令

在这里插入图片描述
当切换到某个任务时(switch_to函数)

  1. 首先保存当前CPU的寄存器状态到原任务的上下文中
  2. mscratch寄存器修改为指向下一个任务的上下文(mscratch寄存器是一个特殊的控制和状态寄存器(CSR),其存放任务的上下文的地址)
  3. 将下一个任务的上下文加载到当前CPU
  4. ret指令后开始指向下一个任务
    在这里插入图片描述

代码实现

主要分为进程切换和任务设置两方面
进程切换即switch函数,任务设置即任务的管理

代码链接
https://github.com/FULLK/risllkos/tree/main/Fullkenerl4

asm volatile("csrw mscratch, %0" : : "r" (x));

这段汇编代码是在RISC-V架构中使用的一条特殊指令,它的作用是将寄存器 x 的值写入 mscratch 寄存器。

让我们来逐步解释这条指令:

  1. asm volatile("csrw mscratch, %0" : : "r" (x));
    • asm: 这是一条内嵌汇编指令,用于在C/C++代码中直接插入汇编代码。
    • volatile: 这个关键字告诉编译器不要对这条汇编指令进行任何优化或重排序。
    • "csrw mscratch, %0": 这是汇编指令的模板,其中:
      • csrw: 是RISC-V的一条特殊指令,用于将寄存器的值写入控制和状态寄存器(CSR)。
      • mscratch: 是要写入的目标CSR寄存器,即前面提到的 mscratch 寄存器。
      • %0: 这是一个占位符,用于引用下面的输入操作数。
    • : : "r" (x): 这是输入操作数的定义,其中:
      • "r": 表示这是一个只读的输入操作数。(就是执行过程中该操作数不会被修改)
      • (x): 表示使用寄存器 x 的值作为输入。

总的来说,这条指令的作用是将寄存器 x 的值写入 mscratch 寄存器。这种操作通常用于在异常、中断或陷入处理程序中保存和恢复寄存器状态。

lw和sw

SW 和 LW 是 RISC-V 指令集中的两个重要指令,分别代表 Store Word 和 Load Word。它们用于在内存和寄存器之间传输数据。

  1. SW (Store Word) 指令:

    • 作用是将寄存器中的数据存储到内存中指定的地址。
    • 指令格式为 sw rd, offset(rs1),其中 rd 是要存储的寄存器,offset 是内存地址的偏移量,rs1 是基地址寄存器。
    • 例如 sw x10, 8(x11) 会将寄存器 x10 中的数据存储到内存地址 x11 + 8 处。
  2. LW (Load Word) 指令:

    • 作用是从内存中加载数据到寄存器。
    • 指令格式为 lw rd, offset(rs1),其中 rd 是要加载数据的目标寄存器,offset 是内存地址的偏移量,rs1 是基地址寄存器。
    • 例如 lw x12, 4(x13) 会将内存地址 x13 + 4 处的数据加载到寄存器 x12 中。

SW 和 LW 指令是 RISC-V 指令集中最基本和最常用的两个指令,它们为 RISC-V 提供了在内存和寄存器之间高效传输数据的能力,是构建复杂计算系统的基础。

p tp 和 zero寄存器

  1. gp (Global Pointer) 寄存器:

    • gp 寄存器用于存储全局数据段的基地址。
    • 在大型程序中,全局变量和静态变量通常会被放置在全局数据段中。
    • 通过 gp 寄存器,可以快速访问这些全局变量,而不需要计算复杂的地址偏移。
    • gp 寄存器可以减少指令数量,提高程序性能。
  2. tp (Thread Pointer) 寄存器:

    • tp 寄存器用于存储当前线程/任务的局部存储区域的基地址。
    • 在多线程/多任务系统中,每个线程/任务都有自己的局部存储区域,tp 寄存器用于快速访问这些区域。
    • tp 寄存器可以简化线程/任务切换时的内存访问,提高性能。
  3. zero 寄存器:

    • zero 寄存器是一个特殊的寄存器,它的值永远为 0。
    • 将数据写入 zero 寄存器相当于丢弃该数据。
    • 从 zero 寄存器读取数据总是返回 0。
    • zero 寄存器在需要执行 NOP (No Operation) 指令或清零操作时非常有用。

这三个寄存器在 RISC-V 体系结构中扮演着重要的角色,为 RISC-V 系统提供了高效的全局数据访问、线程管理和基本操作支持。

待实现

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Java并发编程基础面试题详细总结

1. 什么是线程和进程? 1.1 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。 在 Java 中,当我们启动 main 函数时其实就是启动了一个…

【重学C语言】四、运算符和表达式

【重学C语言】四、运算符和表达式 概念左值与右值运算符一元运算符二元运算符三元运算符 优先级结合性 基本运算符赋值运算符算术运算符复合赋值运算符位运算符应用条件和逻辑运算符条件运算符逻辑运算符逻辑短路逻辑与(&&)的短路行为逻辑或&…

git版本控制工具

一、git工具介绍 1. 版本控制的概念与分类 版本控制是一种管理文件变更的技术,允许开发者记录文件或一组文件随时间的变化,以便能够恢复到先前的状态、查看历史更改、对比不同版本之间的差异,以及协同工作。版本控制系统主要有两种分…

jsp中使用session实现一个简单的购物车案例

1、需求分析 相信大家都有网上购物的经历,当用户选定某件商品时,只要选择“购买”,便可将商品添加到购物车中,购物车中包含了用户所有要购买的商品。接下来,以购买图书为例,使用Session模拟实现购物车功能…

vscode开发ESP32问题记录

vscode 开发ESP32问题记录 1. 解决vscode中的波浪线警告 1. 解决vscode中的波浪线警告 参考链接:https://blog.csdn.net/fucingman/article/details/134404485 首先可以通过vscode 中的IDF插件生成模板工程,这样会自动创建.vscode文件夹中的一些json配…

illustrator编组后透明图形也能挡住后面的图形的物体

今日学习使用illustrator,使用3D中的突出和斜角生成了一个圆柱体之后,扩展图形,修改之后发现一个奇怪的问题,编组中的透明物体挡住了后面的图形(后面的图形是有颜色的) 后面发现,原来是扩展生成…

Redis 事务 与 管道

redis事务 谈到事务大家可能就会想起mysql中的事务 注意这里的事务不是指的是事务的四大特性acid 持久性 原子性 隔离性 一致性 事务的概念就是 一组命令,串行化执行而不被打断 这里redis的事务和mysql的事务就不太一样 传统关系型数据库的事务主要强调的是一个没有执行完成就…

如何查询网站是否被搜索引擎收录

怎么看网站有没有被百度收录 对于网站所有者来说,了解自己的网站是否被百度搜索引擎收录是非常重要的。只有被收录,网站才能在百度搜索结果中展现,从而获取流量和曝光。下面介绍几种方法,让您快速了解自己的网站是否被百度收录。…

ctf_show笔记篇(web入门---SSRF)

ssrf简介 ssrf产生原理: 服务端存在网络请求功能/函数,例如:file_get_contens()这一类类似于curl这种函数传入的参数用户是可控的没有对用户输入做过滤导致的ssrf漏洞 ssrf利用: 用于探测内网服务以及端口探针存活主机以及开放服务探针是否存…

Java多线程三种实现方式

一、继承Thread方法 public class MyThread extends Thread{Overridepublic void run() {for (int i 0; i < 10; i) {System.out.println(getName() "输出内容");}}public static void main(String[] args) {MyThread thread1 new MyThread();MyThread thread…

2024年清明节安装matlab 2024a

下载安装离线支持包SupportSoftwareDownloader_R2024a_win64&#xff0c;地址https://ww2.mathworks.cn/support/install/support-software-downloader.html&#xff0c;运行软件&#xff08;自解压运行&#xff09;&#xff0c;登录账号&#xff08;需要提前在官网注册&#x…

Java数据结构-队列

目录 1. 队列概念2. 模拟实现队列2.1 链式队列2.2 循环队列 3. 双端队列4. 队列的应用4.1 用队列实现栈4.2 用栈实现队列 1. 队列概念 队列是一种只能在一端进行插入数据操作&#xff0c;另一端进行删除数据操作的数据结构&#xff0c;插入数据的叫队尾&#xff0c;删除数据的…

Vulnhub:BOSSPLAYERSCTF: 1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap 命令执行漏洞 反弹shell 提权 系统信息收集 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:2f:dd:9…

我与C++的爱恋:内联函数,auto

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 一、内联函数 1.内联函数的概念 内联函数目的是减少函数调用的开销&#xff0c;通过将每个调用点将函数展开来实现。这种方法仅适用于那些函数体小、调用频繁的函数。 …

探索大数据时代下与云计算技术融合:实现企业级数据处理与分析的灵活性和效率性

引言&#xff1a; 关联阅读博客文章&#xff1a;深度剖析&#xff1a;计算机集群在大数据体系中的关键角色和技术要点 随着信息时代的到来&#xff0c;数据量的爆炸性增长已成为一种常态。企业、政府、科研机构等各个领域都面临着海量数据的收集、存储、处理和分析的挑战。在…

2024年福建三支一扶报名指南—照片<100kb

2024年福建三支一扶报名指南—照片<100kb

大日志精选案例四:某省级大数据集团日志审计优化实战解析

“在集团日常运营中&#xff0c;数据安全始终是我们关注的重点。过去&#xff0c;数据量大、处理速度慢&#xff0c;导致日志数据难以迅速获取和分析&#xff0c;影响业务决策。但自从引入聚铭大日志解决方案后&#xff0c;系统日志和用户行为数据都得到了高效处理与存储。该方…

C易错注意之分支循环,悬空else,短路表达式,static

接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 前言&#xff1a; c语言中一些关于分支循环中continue常混淆&#xff0c;悬空esle问题&#xff0c;短路表达式&#xff0c;static ,extern在使用时稍不注意就会出错的点,接下来我们将介绍…

数据结构:排序

排序的概念 1.概念 就我当前所认识的排序来说。排序是把一串相同类型的数据&#xff0c;按照升序或者降序排列起来的操作。 以下介绍的排序大多可以排列不限于整型和文件&#xff0c;但也有一些算法有较明显的局限性。 2.稳定性 如果在排列之前&#xff0c;一组数据中&…

Airtable、pyairtable

文章目录 一、关于 AirtableAirtable 公司历史诞生发展 产品方向产品层级国内模仿者竞争对手关于 API Key价格 二、关于 pyairtable安装快速使用 一、关于 Airtable 官网&#xff1a;https://www.airtable.comgithub : https://github.com/AirtableAirtable AI &#xff1a; h…