查看: 2229|回复: 0
收起左侧

RISC-V Machine Mode 和 User Mode 相互切换

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-3-3 12:32
  • 签到天数: 10 天

    [LV.3]

    发表于 2020-8-24 15:43:53 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 皋陶 于 2020-8-28 10:07 编辑

    RISC-V Machine Mode 和 User Mode 相互切换

    原文出处:https://github.com/nucleisys/Bum ... ob/master/Bumblebee 内核指令架构手册.pdf


    Machine Mode 到 User Mode 的切换

    在 Machine Mode 下可以直接执行 mret 指令。


    Machine Mode 切换到 User Mode 只能通过从执行 mret 指令发生。


    由于如第 2.2.3 节中所述,Machine Mode 可能处于四种不同的状态下,分别介绍如下:


    • 如果是在正常机器模式下,执行 mret 指令的硬件行为与异常处理模式下执行 mret 指令的行为相同,请参见第 3.5 节了解其详情。
      • 因此,如果在正常机器模式下,希望从 Machine Mode 切换到 User Mode,那么需要软件先修改 mstatus 的 MPP 域的值,然后执行 mret 指令达到模式切换的效果。典型的程序代码片段如下所示:

    1. /* Switch Machine sub-mode to User mode */
    2. // MSTATUS_MPP 的值为 0x00001800,即对应 mstatus 的 MPP 位域,请参、
    3. // 见第 7.4.7 节了解 mstatus 的位域详情。
    4. li t0, MSTATUS_MPP

    5. // 将 mstatus 寄存器的 MPP 位域清为 0
    6. csrc mstatus, t0

    7. // 将后面的标签 1 所在的 PC 地址赋值给 t0
    8. la t0, 1f

    9. // 将 t0 的值赋值给 CSR 寄存器 mepc
    10. csrw mepc, t0

    11. // 执行 mret 指令,则会将模式切换到 User Mode,并且从前的标签 1 处开始执行
    12. // 程序(标签 1 即为 mret 的下一条指令的位置)
    13. mret

    14. // 标签 1 的位置
    15. 1:
    复制代码
    • 如果是在异常处理模式下,执行 mret 指令的硬件行为,请参见第 3.5 节了解其详情。


      • 通常来说,mret 指令用于从异常处理模式下退出至进入异常之前的模式。
      • 如果明确希望从 Machine Mode 退出至 User Mode(或者正常机器模式),那么需要软件先修改 mstatus 的 MPP 域的值,然后执行 mret 指令达到模式切换的效果。

    • 如果是在中断处理模式下,执行 mret 指令的硬件行为,请参见第 5.7 节了解其详情。


      • 通常来说,mret 指令用于从中断处理模式下退出至进入中断之前的模式。
      • 如果明确希望从 Machine Mode 退出至 User Mode(或者正常机器模式),那么需要软件先修改 mstatus 的 MPP 域的值,然后执行 mret 指令达到模式切换的效果。

    • 如果是在 NMI 处理模式下,执行 mret 指令的硬件行为,请参见第 4.4 节了解其详情。


      • 通常来说,mret 指令用于从 NMI 处理模式下退出至正常机器模式。
      • 如果明确希望从 Machine Mode 退出至 User Mode(或者正常机器模式),那么需要软件先修改 mstatus 的 MPP 域的值,然后执行 mret 指令达到模式切换的效果。

    注意:


    • 如果在 User Mode 下直接执行 mret 指令会产生非法指令(Illegal Instruction)异常。


    User Mode 到 Machine Mode 的切换

    Bumblebee 内核从 User Mode 切换到 Machine Mode 只能通过异常、响应中断或者 NMI 的方式发生:


    • 响应异常进入异常处理模式。请参见第 3.4 节了解其详情。
      • 注意:软件可以通过调用 ecall 指令强行进入 ecall 异常处理函数。

    • 响应中断进入中断处理模式。请参见第 5.6 节了解其详情。
    • 响应 NMI 进入 NMI 处理模式。请参见第 4.3 节了解其详情。


    本篇完,感谢关注:RISC-V单片机中文网





    上一篇:Linux 5.7 将支持国产 RISC-V 芯片 K210
    下一篇:RISC-V ISA 学习笔记(4)函数调用约定+RV32G列表及对应的汇编
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-11-6 07:56 , Processed in 0.460292 second(s), 45 queries .

    快速回复 返回顶部 返回列表