文章目录
- 任务
- 任务上下文
- 多任务
- 多任务系统分类
- 协作式多任务
- 代码实现
- `asm volatile("csrw mscratch, %0" : : "r" (x));`
- lw和sw
- p tp 和 zero寄存器
- 待实现
任务
理解为一个段要执行的指令
任务上下文
理解为执行该任务时对应的CPU的寄存器各个状态
多任务
当执行的核数小于要执行的任务时,此时任务会轮流运转到CPU上,以保证各个任务在宏观上被执行着
多任务系统分类
协作式多任务:任务中的代码来实现放弃CPU并切换到下一个任务
抢占式多任务:操作系统来决定放弃CPU并且还到下一个
协作式多任务
初始化就是设置各个任务的上下文(各个任务的上下文保存到内存中),如设置上下文的ra(返回地址)为任务的第一条指令
当切换到某个任务时(switch_to函数)
- 首先保存当前CPU的寄存器状态到原任务的上下文中
- mscratch寄存器修改为指向下一个任务的上下文(mscratch寄存器是一个特殊的控制和状态寄存器(CSR),其存放任务的上下文的地址)
- 将下一个任务的上下文加载到当前CPU
- ret指令后开始指向下一个任务
代码实现
主要分为进程切换和任务设置两方面
进程切换即switch函数,任务设置即任务的管理
代码链接
https://github.com/FULLK/risllkos/tree/main/Fullkenerl4
asm volatile("csrw mscratch, %0" : : "r" (x));
这段汇编代码是在RISC-V架构中使用的一条特殊指令,它的作用是将寄存器 x
的值写入 mscratch
寄存器。
让我们来逐步解释这条指令:
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。它们用于在内存和寄存器之间传输数据。
-
SW (Store Word) 指令:
- 作用是将寄存器中的数据存储到内存中指定的地址。
- 指令格式为
sw rd, offset(rs1)
,其中rd
是要存储的寄存器,offset
是内存地址的偏移量,rs1
是基地址寄存器。 - 例如
sw x10, 8(x11)
会将寄存器 x10 中的数据存储到内存地址x11 + 8
处。
-
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寄存器
-
gp (Global Pointer) 寄存器:
- gp 寄存器用于存储全局数据段的基地址。
- 在大型程序中,全局变量和静态变量通常会被放置在全局数据段中。
- 通过 gp 寄存器,可以快速访问这些全局变量,而不需要计算复杂的地址偏移。
- gp 寄存器可以减少指令数量,提高程序性能。
-
tp (Thread Pointer) 寄存器:
- tp 寄存器用于存储当前线程/任务的局部存储区域的基地址。
- 在多线程/多任务系统中,每个线程/任务都有自己的局部存储区域,tp 寄存器用于快速访问这些区域。
- tp 寄存器可以简化线程/任务切换时的内存访问,提高性能。
-
zero 寄存器:
- zero 寄存器是一个特殊的寄存器,它的值永远为 0。
- 将数据写入 zero 寄存器相当于丢弃该数据。
- 从 zero 寄存器读取数据总是返回 0。
- zero 寄存器在需要执行 NOP (No Operation) 指令或清零操作时非常有用。
这三个寄存器在 RISC-V 体系结构中扮演着重要的角色,为 RISC-V 系统提供了高效的全局数据访问、线程管理和基本操作支持。
待实现