RISC-V 指令架构 -- 模式切换

术语

缩写 介绍
CSR Control and status register
ISA Instruction Set Architecture

RISC-V 特权模式

  • 处理器支持三种特权模式,机器模式,监督模式,用户模式。

    1. 机器模式: 拥有最高的特权,处理器上电就处于此模式,特权模式编码为0x03。
    2. 监督模式: 一般运行OS kernel,特权模式编码为0x01。
    3. 用户模式: 运行用户APP,特权模式编码为0x00。
  • 机器子模式(芯来 core)

    1. 正常的机器模式,Machine Sub-Mode为0x00

    2. 中断处理模式,Machine Sub-Mode为0x01

    3. 异常处理模式,Machine Sub-Mode为0x02

    4. NMI处理模式,Machine Sub-Mode为0x03

      注:msubm 寄存器保存sub-Mode值

  • 模式转换

    通过指令和系统寄存medeleg.bit[8]的配合,使得机器模式,监督模式和用户模式之间转换。

    RISC-V 指令架构 -- 模式切换_第1张图片

    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;
}

你可能感兴趣的:(risc-v,c++,c语言)