术语

缩写介绍
CSRControl and status register
ISAInstruction 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 模式转换图

机器模式切换到用户模式

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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐