医药网站建设的需求分析,推广软件一键发送,小程序注册邮箱被占用,推荐一下网站谢谢ECALL ecall 指令以前叫做 scall#xff0c;用于执行环境的变更#xff0c;它会根据当前所处模式触发不同的执行环境切换异常, 用来执行需要更高权限才能执行的功能;简单来说#xff0c;ecall 指令将权限提升到内核模式并将程序跳转到指定的地址。操作系统内核和应用程序其实…ECALL ecall 指令以前叫做 scall用于执行环境的变更它会根据当前所处模式触发不同的执行环境切换异常, 用来执行需要更高权限才能执行的功能;简单来说ecall 指令将权限提升到内核模式并将程序跳转到指定的地址。操作系统内核和应用程序其实都是相同格式的文件最关键的区别就是程序执行的特权级别不同。所以 Syscall 的本质其实就是提升特权权限到内核模式并跳转到操作系统指定的用于处理 Syscall 的代码地址。Syscall 场景下是在 U-mode用户模式下执行 ecall 指令主要会触发如下变更 处理器特权级别由 User-mode用户模式提升为 Supervisor-mode内核模式当前指令地址保存到 sepc 特权寄存器设置 scause 特权寄存器跳转到 stvec 特权寄存器指向的指令地址 EBREAK 环境操作指令会导致自陷self trapPC会跳转到mtvec寄存器里的地址处。用来中断程序的运作让系统可以把使用权转交给 Debugger;其实 Debugger 的 Break Point 就是用这个指令实现的只是偷偷把指定位置的指令换掉了不跟使用者讲而已;在RISC-V中MRET、SRET和URET分别用于从Machine、Supervisor和User模式中的trap返回返回之后的特权等级即分别为MPP、SPP和UPP中记录的值;MRET 当异常程序处理完成后最终要从异常服务程序中退出并返回主程序。riscv中定义了一组退出指令mretsret和uret对于机器模式对应mret。注意高等级的特权模式可以执行低等级的xRET指令即M模式可以执行MRETSRET和URET;在机器模式下退出异常时候软件必须使用mret。riscv架构规定处理器执行完mret指令后硬件行为如下 停止执行当前程序流转而从csr寄存器mepc定义的pc地址开始执行。硬件更新csr寄存器机器模式状态寄存器mstatus。mstatus寄存器MIE域被更新为当前MPIE的值。MPIE 域的值则更新为1。 SRET S模式下使用sret指令返回原先指令的下一条指令;在执行sret之前需要准备好sepcsstatus寄存器这一部分寄存器应当在恢复上下文时完成需要特别关注sstatus的SPIE位以及SPP位这为初始化PCB时的设计给出了提示。具体实现可通过阅读手册中对于sret指令的说明得到一些提示。URET 指令 URET 用于从用户态陷入状态中返回。URET 将 UPIE 复制回 UIE然后将 UPIE 置位最后将 uepc 拷贝至 pc。在 UPIE/UIE 栈弹出后置位 UPIE 是为了启用中断以及帮助发现代码中的错误。WFI WFI (Wait For Interrupt指令是 RISC-V 架构定义的专门用于休眠的指令。当处理器执行到 WFI 指令之后将会停止执行当前的指令流进入一种空闲状态。这种空闲状态可以被称为“休眠”状态直到处理器接收到中断中断局部开关必须被打开由 mie 寄存器控制处理器便被唤醒 。处理器被唤醒后如果中断被全局打开 mstatus 寄存器的MIE域控制则进入中断异常服务程序开始执行如果中断被全局关闭则继续顺序执行之前停止的指令流。wfi 通知处理器目前没有任何有用的工作所有它应该进入低功耗模式 直到任何使能有效的中断等待处理即miemip ≠ 0。RISC-V 处理器以多种方式实现 该指令包括到中断待处理之前都停止时钟。有的时候只把这条指令当作 nop 来执 行。因此wfi 通常在循环内使用。补充说明wfi 不论全局中断使能有效与否都有用 如果在全局中断使能有效mstatus.MIE 1时执行 wfi然后有一个使能有效的中断等 待执行则处理器跳转到异常处理程序。另一方面如果在全局禁用中断时执行 wfi接着 一个使能有效的中断等待执行那么处理器继续执行 wfi 之后的代码。这些代码通常会检 查控制状态寄存器 mip以决定下一步该做什么。与跳转到异常处理程序相比这个策略可 以减少中断延迟因为不需要保存和恢复整数寄存器;SFENCE.VMA 处理器用地址转换缓存通常称为 TLB全称为 Translation Lookaside Buffer来提高虚拟地址与物理地址转换性能。为了 降低 TLB 缓存本身的开销大多数处理器不会让它时刻与页表保持一致。这意味着如果操作系统修改了页表那么这个缓存会变得陈旧而不可用。RISC-V 的 S 模式添加了另一条 sfence.vma 指令来解决这个问题。这条指令会通知处理器软件可能已经修改了页表于是处理器可以相应地刷新 TLB 缓存。它需要两个可选的参数这样可以缩小缓存刷新的范围。一个位于 rs1它指示了页表哪个虚址对应的转换被修改了另一个位于 rs2它给出了被修改页表的进程的地址空间标识符ASID。如果两者都是 x0便会刷新整个转换缓存。补充说明 多处理器中的地址转换缓存一致性 sfence.vma 仅影响执行当前指令的 hart 的地址转换硬件。当 hart 更改了另一个 hart 正在使 用的页表时前一个 hart 必须用处理器间中断来通知后一个 hart他应该执行 sfence.vma 指令。这个过程通常被称为 TLB 击落 FENCE RISC-V采用的是 RISC-V Weak Memory Ordering (RVWMO)模型对存储操作的执行顺序限制较少为了保证一致性需要特殊的指令来规范存储操作的执行顺序。FENCE指令犹如一道屏障把前面的Store 操作和后面的store 操作隔离开来前面的决不能到后面再执行后面的决不能先于FENCE前的指令执行。FENCE指令带参数标志隔开前后何种类型的store操作;FENCE指令是和RISC-V采用RVWMO存储模型息息相关的。 假如RISC-V使用Sequential存储模型那么也没必要有FENCE指令了但是Sequential存储模型会严重制约系统的性能。而使用RVWMO模型则对于硬件实现提出了更高的要求对软件开发者其实是很友好的.对于简单的单hart理器来说FENCE指令可以当做NOP来处理。FENCEI FENCE.I是条扩展指令处理的是指令存取一致性的问题。如果系统有了分离的I$和D$或者有了prefetch buffer我们就有可能面临这样的问题指令所在的地址的内容被修改了但是最新的值存在D$里而I$或prefetch buffer还有旧的值此时如果不加处理就会得到不想要的结果。这个scenario存在于self-modifying的程序中也存在于software breakpoint的调试过程中。x86体系结构对于此类问题有着不同的解决方案它通过snoop的方式监视I$和D$从而保证coherence。但这种实现方式的硬件实现代价较大RISC-V引入FENCE.I指令解放了硬件实现从软件层面来保证instruction coherence。对于有I$的CPU来说FENCE.I一般可以采用invalidate I$来解决当然这不是唯一的途径prefetch一并clear掉。如果只有prefetch buffer的就可以像处理跳转指令一样把prefetch buffer clear掉就像Ibex的处理方式一样。但是也不能对FENCE.I指令期望过高它解决的仅仅是单hart上的code coherence问题。 其他hart上的code改动并不能保证一定被当前的hart及时取到。这