8.2 自制操作系统: risc-v Machine寄存器说明mstatus和mstatush
机器模式下的CSRs
寄存器名字 |
全称 |
权限 |
功能 |
描述 |
misa |
Machine ISA Register misa |
WARL read-write |
描述支持ISA |
|
mvendorid |
Machine Vendor ID Register |
32-bit read-only |
描述JEDEC制造商ID |
|
marchid |
Machine Architecture ID Register |
MXLEN-bit read-only |
用于描述微架构ID |
|
mipid |
Machine Implementation ID Register |
处理器实现的唯一编码 |
||
mhartid |
Hart ID Register |
MXLEN-bit read-only register |
硬件处理器线程ID |
Machine Status Registers (mstatus and mstatush)
mstatues寄存器是一个MAXLEN-bit 读写寄存器。mstatus寄存器用于跟踪和控制当前hart操作的状态。
mstatus各个字段含义
作用:mstatus 寄存器跟踪和控制 hart 的当前操作状态。
在S-level ISA的status寄存器看来mstatus是受限制的。
字段名称 |
bit |
含义 |
功能 |
模式 |
RV |
其他 |
SIE |
1 |
Global interrupt-enable bits |
开关全局中断比特位, 可以使用csr指令set/cleared。 当高特权级的中断位被禁止时,低特权级的中断位无论是否开启,都将会被禁止 |
S-mode |
RV32/64 |
|
MIE |
3 |
Global interrupt-enable bits |
开关全局中断比特位, 可以使用csr指令set/cleared |
M |
RV32/64 |
|
SPIE |
5 |
the interrupt-enable bit active prior to the trap |
在当前trap之前,中断的状态 |
S |
RV32/64 |
用于中断嵌套 |
MPIE |
7 |
M |
RV32/64 |
|||
SPP |
8 |
previous privilege mode |
之前的特权模式。 xPP字段是WARL字段,只能包含特权模式x和小于x的任何实现的特权模式。如果没有实现特权模式x,则xPP必须是只读0。 |
S |
RV32/64 |
|
MPP |
[12:11] |
M |
RV32/64 |
|||
SXL |
[35:34] |
控制XLEN的值, 对于RV64系统,如果不支持S模式,则SXL值为0,如果不支持U模式,UXL为0 |
S |
RV64 |
对于RV32系统,SXL和UXL不存在,但是SXLEN=32和UXLEN=32 |
|
UXL |
[33:32] |
U |
RV64 |
|||
MPRV |
17 |
Modify PRiVilege |
1.用来修改有效的特权模式。 2.当MPRV=0, loads和stores行为是正常的,用当前的特权模式来做translation和protection。 3.当PMRV=1, load和store内存地址是被翻译和保护,当前的特权模式被设置到MPP中。 如果 U模式不支持的话,MPRV是只读为0. 4.当使用MRET或SRET指令来改变特权模式时,修改后的模式的权限低于M模式时,MPRV被设置为0 |
RV32/64 |
||
MXR |
19 |
Make eXecutable Readable |
1.加载访问虚拟内存的特权 2.当MXR=0时,只能从标记为可读的页面加载( R=1) 3.当MXR=1时,从标记为可读或可执行(R=1或X=1)的页面加载将成功。当基于页的虚拟内存无效时,MXR没有作用. 如果S模式没有实现, MXR为0,并且只读 |
RV32/64 |
MXR 和 SUM 机制只影响在页表条目中编码的权限的解释。 特别是,它们对是否由于 PMA 或 PMP 引发访问错误异常没有影响 |
|
SUM |
18 |
permit Supervisor User Memory access |
1.修改S模式下loads和stores虚拟内存权限 2.当SUM=0,U模式(U=1)下访问S模式下内存页面将发送fault 3.当SUM=1,访问是被允许的 4.当基于虚拟内存不生效时,SUM没有用 5.当不执行在S模式下时,SUM将被忽略。 6.SUM生效条件是MPVR=1且MPP=S。如果S模式不支持或satp.MODE是只读位0,那么SUM也将是只读为0. |
RV32/64 |
||
MBE |
37或5 |
mstatus寄存器第37bit mstaush寄存器第5bit MBE 控制从 M 模式(假设 mstatus.MPRV=0)进行的非指令取指内存访问是 little-endian (MBE=0) 还是 big-endian (MBE=1)。 |
RV32/64 |
控制除指令取指之外的内存访问的字节顺序。 取指令总是小端的。 对于管理器级内存管理数据结构(如页表)的隐式访问,字节顺序总是由SBE控制。 由于SBE的改变会改变实现对这些数据结构的解释,如果任何这样的数据结构在SBE改变时仍在使用,m模式软件必须在SBE改变后执行SFENCE rs1=x0和rs2=x0的VMA指令。 |
||
SBE |
36或4 |
mstatus寄存器第36bit mstaush寄存器第4bit 如果不支持s模式,则SBE为只读0。否则,SBE控制从s模式进行的显式加载和存储内存访问是小端(SBE=0)还是大端(SBE=1)。 |
RV32/64 |
|||
UBE |
6 |
如果不支持 U-mode,则 UBE 为只读 0。否则,UBE 控制从 U-mode 进行的显式加载和存储内存访问是 little-endian (UBE=0) 还是 big-endian (UBE=1)。 |
RV32/64 |
|||
TVM |
20 |
Trap Virtual Memory |
1.支持拦截管理器虚拟内存管理操作 2.当TVM=1,试图读取或写satp CSR或执行SFENCE.VMA或SINVAL.VMA指令在s模式下,将引发非法指令异常 3.当TVM=0,这些操作是允许的 4.当s模式不支持时,TVM是只读0 |
RV32/64 |
||
TW |
21 |
Timeout Wait |
1.支持WFI指令 2.当TW=0时,WFI指令在没有被其他原因阻止的情况下,可能会在低特权模式下执行 3.当TW=1时,如果WFI以任何低特权模式执行,并且它没有在特定实现的有限时间内完成,WFI指令会导致一个非法的指令异常。 4.当s模式被实现时,在u模式下执行WFI会导致一个非法的指令异常,除非它在实现特定的,有限制的时间内完成。该规范的未来修订可能会增加一个特性,允许s模式有选择地允许u模式下的WFI。 |
RV32/64 |
||
TSR |
22 |
Trap SRET |
1.支持supervisor 异常返回的指令 SRET 2.当TSR=1时,尝试在s模式下执行SRET将引发非法的指令异常 3.当TSR=0时,在s模式下允许此操作。当不支持s模式时,TSR为只读0 |
S |
RV32/64 |
|
FS |
[14:13] |
1.FS域描述浮点数单元状态,包括浮点数寄存器f0-f31和CSRs fcsr,frm和fflags |
RV32/64 |
FS、VS的 WARL域 和XS只读域是用作降低context保存和恢复的成本,通过设置和跟踪当前浮点数单元和别的u模式扩展。 这些域可以快速的决定是否保存或恢复状态。如果保存或恢复是必须的,通常需要额外的指令和CSRs是需要和优化流程 |
||
VS |
[10:9] |
1.VS域描述向量扩展状态,包括向量寄存器v0-v31和CSRs vcsr, vxrm, vxsat, vstart, vl, vtype, 和vlenb |
RV32/64 |
|||
XS |
[16:15] |
1.XS字段编码其他U模式扩展和相关状态的状态 |
RV32/64 |
|||
SD |
31或63 |
1.SD 位是一个只读位,它总结了 FS、VS 或 XS 字段是否表示存在一些需要将扩展用户上下文保存到内存的脏状态。 如果 FS、XS 和 VS 都为只读零,则 SD 也始终为零 |
RV32/64 |
MRET和SRET指令分别用作从M-mode和S-mode的trap返回。
当执行xRET指令时,假设xPP保存的值为y,
1.xIE设置到xPIE
2.特权模式改为y
3.xPIE设置为1
4.xPP设置为最小权限的模式(如果实现了U模式,则设置U模式,否则设置为M模式)
5.如果xPP不等于M模式,xRET也要设置MPRV=0
FS[1:0]和VS[1:0] WARL字段和XS[1:0]只读字段的作用:
分别通过设置和跟踪浮点单元和任何其他用户模式扩展的当前状态来降低上下文保存和恢复的成本。
FS: 浮点数单元的编码状态,包括浮点数寄存器f0-f31,和CSRs fcsr/frm/fflags。
VS: 向量扩展的编码状态,包括向量寄存器v0-v31,和CSRs vcsr/vxrm/vxstat/v1/vtype/vlenb。
XS: 额外u模式扩展和相关状态的扩展。
上下文切换例程可以检查这些字段,以快速确定是否需要状态保存或恢复。如果保存或恢复,通常需要需要额外的指令和CSRs来处理和优化流程。
该设计预计大多数上下文切换不需要在浮点单元或其他扩展中的一个或两个中保存/恢复状态,因此通过 SD 位提供快速检查。
FS/VS/XS字段用相同的状态编码:
SD位是一个只读位,它总结FS、VS或XS字段是否表明存在一些脏状态,需要将扩展的用户上下文保存到内存中。如果FS, XS和VS都是只读零,那么SD也总是零。
在上下文保存期间,负责的特权代码只需要在其状态为脏时写出相应的状态,然后可以将扩展的状态重置为clean。 在上下文恢复期间,如果状态为 Clean(在恢复时绝不应该是 Dirty),则只需要从内存中加载上下文。 如果状态为 Initial,则必须在上下文恢复时将上下文设置为初始常量值以避免安全漏洞,但这可以在不访问内存的情况下完成。 例如,浮点寄存器可以全部初始化为立即数 0.
FS和XS字段在保存上下文之前由特权代码读取。FS字段是在恢复用户上下文时由特权代码直接设置的,而XS字段是通过写入单个扩展的状态寄存器来间接设置的。无论特权模式如何,状态字段也将在执行指令期间更新。
下图显示了 FS、VS 或 XS 状态位的所有可能状态转换。 请注意,标准浮点和向量扩展不支持用户模式取消配置或禁用/启用指令。
8.2 自制操作系统: risc-v Machine寄存器说明mstatus和mstatush相关推荐
- 《30天自制操作系统》从入门到放弃
前言 以下均是废话,大部分来自摘抄,只是记录本人放弃的过程!!!切记是摘抄!!! 相关资料在:https://download.csdn.net/download/wxkhturfun/2253304 ...
- 如何读emmc里的引导程序_自制操作系统学习1 引导程序
本系列学习有前面的汇编学习基础最好,如果没有影响也不大本系列学习主要资源来自<[30天自制操作系统].(川合秀实)>,<自己动手写操作系统>两本书 一.准备工作 bochs v ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的 ...
- x86从实模式到保护模式 pdf_【自制操作系统04】从实模式到保护模式
通过前三章的努力,我们成功将控制权转交给了 loader.asm 这个程序.具体说就是 bios 通过加载并跳转到 0x7c00(IMB大叔们定的) 把控制权转交给了我们操作系统的第一个汇编程序 mb ...
- 操作系统源代码_计算机自制操作系统(八):仿生DOS操作系统源代码
一.真机运行 我们已经完成了仿生DOS操作系统的制作,并在上一章的末尾给大家在虚拟机上做了演示.今天,我们要将该操作系统在真机上启动运行,是不是非常期待自己做出的第一款比较有意义的操作系统? 在&qu ...
- RISC V (RV32+RV64) 架构 整体介绍
文章目录 riscv 市场 芯片介绍 软件介绍 开发板介绍 PC介绍 riscv 架构 编程模型(指令集/寄存器/ABI/SBI) 运行状态 指令集 寄存器 riscv32和riscv64两者的区别 ...
- 索骥馆-DIY操作系统之《30天自制操作系统》扫描版[PDF]
内容简介: <30天自制操作系统>是一本兼具趣味性.实用性与学习性的操作系统图书.作者从计算机的构造.汇编语言.C语言开始解说,让读者在实践中掌握算法.在这本书的指导下,从零编写所有代码, ...
- 30天自制操作系统——第五天
第五天 参考<30天自制操作系统>GDT&IDT - 谷月轩 - 博客 梳理一下文件 现在我们拥有这么9个文件: ipl10.nas InitialProgramLoader, 占 ...
- 30天自制操作系统第三天
操作系统实验日志3 学号 201708010402 姓名 徐冰娜 专业年级班级 实验日期 2019.9.28 实验项目 第3天:进入32位模式并导入C语言 智能1701 30天自制操作系统第三天 操作 ...
- 计组学习笔记2(RISC v版)
指令集解释 (规定:R[r]表示通用寄存器r的内容,M[addr]表示存储单元addr的内容,SEXT[imm]表示对imm进行符号扩展,ZEXT[imm]表示对imm进行零扩展) 整数运算类 -U型 ...
最新文章
- ubuntu 串口转usb使用
- 开源大数据周刊-第15期
- 算法与数据结构_数据结构与算法专题--算法基本概念
- 牛客题霸 [删除有序链表中重复的元素] C++题解/答案
- HIVE攻略 JFK_Hive安装及使用攻略
- Linux内存显示错误,使用mmap读取内存的内容,出现“Segmentation fault”错误,请
- 没有富士康?外媒称苹果新款iPhone SE由和硕独家组装
- linux简单命令3---帮助命令
- 感谢所有常来我博客的朋友
- Python Cookbook(第3版)pdf
- 编译的html帮助文件(.chm)打不开,chm文件无法打开怎么办
- 2020年内蒙古自治区第十五届大学生程序设计竞赛榜单
- 统计网站页面的访问量
- 24个最新创意进度条设计,分分钟让你灵感爆表!!!
- 外研在线:如何用云技术优化教育服务
- 孩子不听话家长怎么办
- lucene in ation 第三章(1) sear…
- 这个macOS神器,让爱怀旧的人直呼:“爷青回!”
- 计算机如何快速返回桌面,打游戏怎么快速返回桌面
- python读取配置文件 分段_python分割文件的常用方法