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

任务

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

任务上下文

理解为执行该任务时对应的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 系统提供了高效的全局数据访问、线程管理和基本操作支持。

待实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看星猩的柴狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值