RISC-V 指令架构 -- 模式切换
·
术语
| 缩写 | 介绍 |
|---|---|
| CSR | Control and status register |
| ISA | Instruction Set Architecture |
RISC-V 特权模式
-
处理器支持三种特权模式,机器模式,监督模式,用户模式。
- 机器模式: 拥有最高的特权,处理器上电就处于此模式,特权模式编码为0x03。
- 监督模式: 一般运行OS kernel,特权模式编码为0x01。
- 用户模式: 运行用户APP,特权模式编码为0x00。
-
机器子模式(芯来 core)
-
正常的机器模式,Machine Sub-Mode为0x00
-
中断处理模式,Machine Sub-Mode为0x01
-
异常处理模式,Machine Sub-Mode为0x02
-
NMI处理模式,Machine Sub-Mode为0x03
注:msubm 寄存器保存sub-Mode值
-
-
模式转换
通过指令和系统寄存medeleg.bit[8]的配合,使得机器模式,监督模式和用户模式之间转换。

RISC-V 模式转换图
机器模式切换到用户模式
void user_mode_entry()
{
printf("RISC-V user mode say hello\n");
while(1);
}
void switch_mode()
{
unsigned int pmp_config = 0x1f;//NAPOT|R|W|X
unsigned int mepc_addr = (unsigned int)user_mode_entry;
asm volatile (
"csrw pmpcfg0, %0\n\t"
"csrw pmpaddr0, %1\n\t"
"csrc mstatus, %2\n\t"
"csrw mepc, %3\n\t"
"mret"
: : "r" (pmp_config), "r" (-1UL), "r" (0x1800), "r" (mepc_addr) : "memory");
}
用户模式切换到机器模式
struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
unsigned long arg1, unsigned long arg2,
unsigned long arg3, unsigned long arg4,
unsigned long arg5)
{
struct sbiret ret;
register uintptr_t a0 asm ("a0") = (uintptr_t)(arg0);
register uintptr_t a1 asm ("a1") = (uintptr_t)(arg1);
register uintptr_t a2 asm ("a2") = (uintptr_t)(arg2);
register uintptr_t a3 asm ("a3") = (uintptr_t)(arg3);
register uintptr_t a4 asm ("a4") = (uintptr_t)(arg4);
register uintptr_t a5 asm ("a5") = (uintptr_t)(arg5);
register uintptr_t a6 asm ("a6") = (uintptr_t)(fid);
register uintptr_t a7 asm ("a7") = (uintptr_t)(ext);
asm volatile ("ecall"
: "+r" (a0), "+r" (a1)
: "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6), "r" (a7)
: "memory");
ret.error = a0;
ret.value = a1;
return ret;
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)