RISC-V Reader 笔记(七)RV64,特权架构,未来可选扩展

news2025/1/13 9:49:50

RV64

比起 RV32,其实扩展不多。

1694541053521

主要是添加了一系列字,双字为单位的操作。

image-20230913083504079

image-20230913083518834

image-20230913083533167

各个 ISA 32 64比较

x86:变量都存在寄存器里,不像 32 存在内存里,因此指令数少很多,但是因此添加了很多新操作码来操作更多的寄存器,因此指令长度变长了(添加前缀来区分),代码体积大很多。

arm:有一系列和 arm32 类似的问题,:分支指令使用的条件码,指令中源和目 标寄存器字段并不固定,条件移动指令,复杂寻址模式,不一致的性能计数器,以及只支持 32 位长度的指令。

mips:需要用 nop 填充分支延迟槽。

比较起来 RV64 程序大小还是算作最小的。因此缓存缺失率比较低,或者可以在差不多缺页率的情况下使用更小的缓存空间。

RV32/64 特权架构

前面都是通用的用户模式介绍。这一章我们引入两个新的模式:机器模式,监管者模式。

多模式的引入支持一些网络数据包处理,多任务处理,虚拟化硬件等。

指令列表

image-20230914161516451

指令数量不多,通过一系列 CSR 寄存器进行管理。

机器模式

支持对硬件的所有访问,因此机器模式 M 模式是所有 RV 实现都必须包含的。

机器模式最重要的功能是拦截,处理异常的能力。RV 中异常主要分为两种:指令执行期间的同步异常(主要包括一些错误,比如访存地址不存在),和中断异常。

同步异常包括:

  • 访问错误异常,当物理内存的地址不支持访问类型时发生(例如尝试写入 ROM)。

  • 断点异常,在执行 ebreak 指令,或者地址或数据与调试触发器匹配时发生。

  • 环境调用异常,在执行 ecall 指令时发生。

  • 非法指令异常,在译码阶段发现无效操作码时发生。

  • 非对齐地址异常,在有效地址不能被访问大小整除时发生,例如地址为 0x12 的 amoadd.w。

虽然前面说了, store load 是可以支持非对齐的访问的。但是可能有一些实现者选择放弃非对齐硬件设计,而且原子操作必须是对齐的。没有这种硬件实现,遇到非对齐的访问时就需要异常进行处理,牺牲一些时间,不过对于上层程序员来说最终实现结果还是一样的。

中断主要分为:软件中断,定时器中断,外部中断。

异常处理

主要由8个异常寄存器来处理。

  • mtvec(Machine Trap Vector)它保存发生异常时处理器需要跳转到的地址。
  • mepc(Machine Exception PC)它指向发生异常的指令。
  • mcause(Machine Exception Cause)它指示发生异常的种类。
  • mie(Machine Interrupt Enable)它指出处理器目前能处理和必须忽略的中断。
  • mip(Machine Interrupt Pending)它列出目前正准备处理的中断。
  • mtval(Machine Trap Value)它保存了陷入(trap)的附加信息:地址例外中出错的地址、发生非法指令例外的指令本身,对于其他异常,它的值为 0。
  • mscratch(Machine Scratch)它暂时存放一个字大小的数据。
  • mstatus(Machine Status)它保存全局中断使能,以及许多其他的状态。
  • wfi(Wait For Interrupt)低功耗延时。

mstatus 被置1的时候才产生中断。mie 中存储了具体是哪个中断的标志位。比如如果 mstatus.MIE = 1,mie[7] = 1,且 mip[7] = 1,则可以处理机器的时钟中断。

异常处理流程如下:

  1. pc 值存入 mepc,pc 值被设置为 mtvec(mepc 是引发异常的指令,或中断的返回处)。
  2. 设置 mcause 标识异常原因,以及 mtval 标识异常附加信息。
  3. mstatus.MIE = 0 来禁止中断处理,之前的 MIE 值存入 MPIE。
  4. 发生异常之前的权限模式保留在 mstatus 的 MPP 域中,再把权限模式更改为 M。
  5. 整数寄存器中的值存入 mscratch 临时保存(软件会让 mscratch 包含指向附加临时内存空 间的指针,处理程序用该指针来保存其主体中将会用到的整数寄存器。)。
  6. 执行完成异常后基本是以上的逆操作。中断程序恢复其保存在内存中的寄存器,mscratch 与整数寄存器再次交换;mret 指令将 mepc 恢复到 pc,MPIE 恢复到 MIE,MPP 恢复权限模式信息。

1694951678364

上图是一个定时器中断时钟自增(+1000时钟周期)代码示例。MIE mtvec 默认设置好了。

用户模式

机器模式可以操作所有硬件,是必须实现的模式。但是这种模式对用户来说不安全。

用户模式则封装那些我们不希望用户修改的系统信息,并且为不受信任的进程提供隔离保护。

mstatus.MPP 设置为 U 模式即为用户模式。当用户模式下想要使用机器模式指令(如 mret)或者访问机器模式寄存器时就会发生非法指令异常,控制权移交给 M 模式处理异常。

MU 两种模式能读,写,执行的内存空间是不同的。实现了 MU 模式的处理器会有一个 PMP 功能,其中有如下几段:地址寄存器,A 域(标识此 PMP 是否开启),L 域(锁定此 PMP 和对应的地址寄存器),XWR(与地址寄存器相对应的配置寄存器,标识执行,读,写权限)。

1694953180080

监管者模式

委托

PMP 有很多缺点,比如他只支持固定连续空间的内存权限管理,容易造成存储碎片化;且无法对辅存分页。

RISC-V 采用基于分页的虚拟内存解决以上问题。这也是 S 监管者模式的核心。这种模式旨在支持一些现代操作系统(如 Unix)。

S 模式优先级介于 M 模式和 U 模式之间,不能直接操作 PMP,机器模式下的一些 CSR,指令。

默认情况下所有异常都会被交给 M 模式处理,但是一些现代操作系统可能更期望把部分系统异常交给 S 模式处理。一种解决办法是 M 模式重新把这些异常导向给 S 模式处理,不过这样比较浪费资源。RV 的解决办法是异常委托机制,可以把部分中断或异常导向给 S 模式而不给 M 模式处理。

mideleg(Machine Interrupt Delegation,机器中断委托)CSR 控制将哪些中断委托给 S 模式。mideleg 和 mip mie 一样,每几位对应一个中断,比如 mideleg[5] 是 S 模式的时钟中断,置位后时钟中断就优先交给 S 模式处理。

sip sie 是 mip mie 的子集,但是只有 mideleg 中委托对应位给 S 模式的中断才能交给他们处理。

medeleg 是委托异常。

中断异常处理

整体流程和 M 模式差不多,不过用了一套自己的 CSR & 寄存器。

  1. pc 值存入 sepc,pc 值被设置为 stvec(sepc 是引发异常的指令,或中断的返回处)。
  2. 设置 scause 标识异常原因,以及 stval 标识异常附加信息。
  3. sstatus.SIE = 0 来禁止中断处理,之前的 SIE 值存入 SPIE。
  4. 发生异常之前的权限模式保留在 sstatus 的 SPP 域中,再把权限模式更改为 S。

基于页面的虚拟内存

S 模式采用一种传统的虚拟内存技术,把内存划分为固定大小的页来进行地址转换和内存保护。load 和 store 访问的虚拟逻辑地址需要被转化为内存中真正的物理地址,这一操作通过 页表 来实现。

1695279000387

RISC-V 的分页方案以 SvX 的模式命名,X 是每个虚拟地址的长度(单位 bit)。比如 Sv32 Sv39. 比如,RV32 的 Sv32 支持 4GiB 虚拟空间,划分为 2^10 4MiB 巨页,每个巨页分为 2^10 个 4KiB 基页。因此 Sv32 是 2^10 基数的二级树结构。

上图中包含页表项的详细展开。

  • V:是否启用此页表项,如果=0那么访问这个页表项进行虚拟空间和物理地址的转化会造成页错误。
  • RWX:读写执行。如果都是0,说明这个结点是树路径结点而不是叶子结点。
  • U:=1 表示用户模式可以访问这个页表项,S 模式不行;=0相反。
  • G:这个映射是否对所有虚拟空间都有效。通常用于 OS 的页面。
  • A:自从上次 A 位被清除后,该映射是否被访问过。
  • D:自从上次 D 位被清除后,该映射是否被弄脏(如被写过)。
  • RSW:留给 OS 使用。
  • PPN:部分物理地址的映射(如果当前页表项是叶子结点),或者下一个页表的位置。

RV64 比较常用的虚拟内存映射方式是 Sv39,3层 2^9 的树。PPN 长度页扩展了,支持更长的物理地址。

satp(Supervisor Address Translation and Protection,监管者地址转换和保护)用于控制分页系统。模式表示是否开启分页以及分页级别;ASID 是减少上下文切换开销的可选内容;PPD 是物理地址的根页表(基址?)。

1695280047084

查找映射流程:

  1. VPN 虚拟地址。
  2. 其页号和 satp 页表基址找到对应页表页。
  3. 找到其中物理地址值。

1695280331920

不过每次物理地址都用页表去查找转换效率还是比较低的,因此一般使用 TLB 来缓存部分地址映射。S 模式通过 sfence.vma 指令通知处理器有新缓存地址更新了,处理器根据一些算法更新 TLB。

RV 未来的可选扩展

  • B 扩展:位操作

主要是一些对位的操作,比如计算前导后置0,插入 提取 测试位等。

  • E 扩展:嵌入式

为了减少对低端核心的开销,削减了16个寄存器。

  • H 扩展:特权态

Hypervisor,加入了管理程序模式和二级地址翻译,一般用于管理多个 OS.

  • J 扩展:动态翻译

比如 java 和 js 的动态检查和垃圾回收。

  • L 扩展:十进制小数

支持一些十进制小数表示运算。

  • N 扩展:用户态中断

用户态中断不触发外界环境响应,直接进入用户态处理程序。

  • P 扩展:单指令多数据

主要用于小资源并行运算,不过如果计算资源足够还是建议用 V 扩展解决。

  • Q 扩展:四精度浮点

前提要求:已经实现了 RV64IFD。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ctfshow web入门(2)

web11 打开这个网站,到网站诊断分析模块 搜索域名 web12 提示 有时候网站上的公开信息,就是管理员常用密码 打开,就是个购物网站 因为昨天刚做robots.txt 我就搜了一下 真的有,提示admin这个页面 访问一下,userna…

PTE阅读写作讲解

目录 FIB-R和FIB-R想要拿到65分以上的正确率要达到百分之75以上 1.通过因果关系猜词 2.通过同义词和反义词的关系猜词 3.通过定义或释义关系来推测词义 WE 只需要背一个万能模版就可以了(160) 只需要保证语法正确就可以了 文本中的实词不能出现第…

阿里云视频点播服务视频地址浏览器打开失效问题记录

我这边的视频都是存储到阿里云视频点播服务中,访问方式都是移动端通过api接口访问视频.现在需要从浏览器直接访问,上传视频成功之后,可以正常打开,但是过段时间地址就显示无法访问,具体显示内容为: 很明显,是视频地址失效了,以下是处理方式: 1.修改视频关联的存储桶读取权限,修…

1334. 阈值距离内邻居最少的城市

1334. 阈值距离内邻居最少的城市 原题链接:完成情况:解题思路:参考代码:DijkstraDijkstra_小顶堆Floyd_martix方法 原题链接: 1334. 阈值距离内邻居最少的城市 https://leetcode.cn/problems/find-the-city-with-th…

排序算法的奥秘:JAVA中的揭秘与实现

冒泡排序(Bubble Sort)是一种简单的排序算法,它通过多次迭代比较和交换相邻的元素来排序一个数组。每次迭代,较大的元素会逐渐"冒泡"到数组的末尾。以下是Java中实现冒泡排序的示例代码: public class BubbleSort { public sta…

【数据结构】链表的学习和介绍

前言 今天,我们来学习,数据结构中的链表 链表是什么 链表,就是多个结构体变量之间,通过结构体指针连接在一起的一种数据结构 提示: 本篇文章主要讲解动态链表,对于静态链表不做过多介绍 链表的分类 链…

ESP8266 WiFi物联网智能插座—硬件功能

目录 1、控制器板 2、采集器板 2.1、电源设计 2.2、控制器设计 2.3、电量采集电路设计 2.4、按键和LED指示灯设计 ESP8266 WiFi物联网智能插座的硬件功能主要包括两部分:控制器板和采集器板。 焊接成品效果如下图所示: 1、控制器板 控制器板是ES…

PAT 1029 旧键盘

PAT 1029 旧键盘 题目描述思路讲解代码展示 题目描述 思路讲解 分析:用string的find函数~遍历字符串s1,当当前字符s1[i]不在s2中,它的大写也不在ans中时,将当前字符的大写放入ans中,最后输出ans字符串即可…

阿里巴巴商品详情接口

阿里巴巴商品详情接口是阿里巴巴API接口的一种,可获取到商品链接、商品ID、商品标题、商品价格、品牌名称、店铺昵称、sku规格、sku属性、发货地、详情属性、店铺信息等参数,接口对接可适用于选品上架、数据分析、代购商城建站、erp系统商品数据选品、价…

怒刷LeetCode的第10天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:两次拓扑排序 第二题 题目来源 题目内容 解决方法 方法一:分治法 方法二:优先队列(Priority Queue) 方法三:迭代 第三题 题目来源 题目内容…

浙江大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许

浙江大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许

Vulnhub系列靶机-Infosec_Warrior1

文章目录 Vulnhub系列靶机-Infosec_Warrior11. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测3. 漏洞利用4. 权限提升 Vulnhub系列靶机-Infosec_Warrior1 1. 信息收集 1.1 主机扫描 arp-scan -l1.2 端口扫描 nmap -A -p- 192.168.188.191发现22端口和80端口是…

数据结构和算法(8):搜索树(二叉搜索树和AVL树)

查找 所谓的查找或搜索,指从一组数据对象中找出符合特定条件者,这是构建算法的一种基本而重要的操作。其中的数据对象,统一地表示和实现为 词条(entry) 的形式;不同词条之间,依照各自的 关键码…

C++之类和函数权限访问总结(二百二十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

软件的开发步骤,需求分析,开发环境搭建,接口文档 ---苍穹外卖1

目录 项目总览 开发准备 开发步骤 角色分工 软件环境 项目介绍 产品原型 技术选型 开发环境搭建 前端:默认已有 后端 使用Git版本控制 数据库环境搭建 前后端联调 ​登录功能完善 导入接口文档 使用swagger​ 和yapi的区别 常用注解 项目总览 开发准备 开发步骤…

用tkinter+selenium做一个CSDN热榜爬虫

文章目录 UI设计函数封装功能实现 自从学会了分析热榜,就是CSDN热榜分析,每天都要爬下来分析一下热榜都在干什么。但脚本运行到底还是不方便,所以接下来就想办法将其做成一个带有界面的热榜爬虫 UI设计 做一个热榜爬虫的交互式界面&#xf…

IOS版微信8.0.42正式版已推出:新增多语言“翻译”!

微信最近的更新的真的很快,包括Mac、iPhone、PC端以及安卓版本都进行了更新推送。 微信iOS 8.0.42正式版已经向公众开放,这个新版本在原有功能的基础上,对群管理界面、翻译功能、小程序等方面进行了优化和改进,让用户的使用体验更…

嵌入式Linux--进程间通信--共享内存

1. 回顾之前的通信内容: 进程间通信主要有5种通信方式 1、无名管道(只能单向发送或接收) 2、命名管道(同上) 3、消息队列(可以发送,也能接收消息) 4、共享内存(有一块公…

呼叫中心系统角色功能的应用

呼叫中心系统拥有强大的功能,根据角色不同能够使用的功能也是不同的,按规则是角色权限越大,可以使用的功能也越多。如普通坐席最重要的工作就是接打电话,没必要使用全部功能,只需有几个话务相关功能就足够了&#xff0…

phpstudy RCE脚本编写(Python)

文章目录 编写过程脚本优化 编写过程 关于phpstudy 2016-2018 RCE漏洞的验证,请移步我的这篇博客 phpstudy2016 RCE漏洞验证。 将之前漏洞验证的数据包复制下来,编写脚本时需要使用: GET /phpinfo.php HTTP/1.1 Host: 10.9.75.164 Upgrade…