From 3365f3b0aaa08864acac89e67cc853cb1f369963 Mon Sep 17 00:00:00 2001 From: ZhaoSQ <1044239768@qq.com> Date: Mon, 27 Jun 2022 14:25:26 +0000 Subject: [PATCH 01/15] =?UTF-8?q?=E5=AF=B9=20QEMU=20Support=20for=20the=20?= =?UTF-8?q?RISC-V=20Instruction=20Set=20Architecture=20by=20Sagar=20Karand?= =?UTF-8?q?ikar=20=E7=9A=84=E7=BF=BB=E8=AF=91=20=E6=9C=AC=E6=96=87?= =?UTF-8?q?=E4=B8=BB=E8=A6=81=E6=98=AF=E6=A0=B9=E6=8D=AE=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=8F=91=E8=A8=80=E8=BF=9B=E8=A1=8C=E7=9A=84=E8=AF=91=E6=96=87?= =?UTF-8?q?=EF=BC=8C=E5=86=85=E5=AE=B9=E6=98=AF=E7=BB=8F=E8=BF=87=E6=88=91?= =?UTF-8?q?=E5=A4=84=E7=90=86=E7=BF=BB=E8=AF=91=EF=BC=8C=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E6=9C=89=E5=9C=B0=E6=96=B9=E4=B8=8D=E5=87=86=E7=A1=AE=EF=BC=8C?= =?UTF-8?q?=E5=B8=8C=E6=9C=9B=E6=94=B6=E5=88=B0=E4=BD=A0=E5=8F=8D=E9=A6=88?= =?UTF-8?q?=EF=BC=8C=E6=88=91=E4=BC=9A=E5=8F=8A=E6=97=B6=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=9A=84=EF=BC=8C=E8=B0=A2=E8=B0=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...the-RISC-V-Instruction-Set_Architecture.md | 272 ++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 articles/20220627-QEMU-Support-for-the-RISC-V-Instruction-Set_Architecture.md diff --git a/articles/20220627-QEMU-Support-for-the-RISC-V-Instruction-Set_Architecture.md b/articles/20220627-QEMU-Support-for-the-RISC-V-Instruction-Set_Architecture.md new file mode 100644 index 0000000..fea9f14 --- /dev/null +++ b/articles/20220627-QEMU-Support-for-the-RISC-V-Instruction-Set_Architecture.md @@ -0,0 +1,272 @@ +# 介绍 + +> Title:
+> Author: ZhaoSQ
+> Date: 2022/06/27
+> Revisor: 1044239768@qq.com
+> Project: [QEMU 支持 RISC-V 指令集架构](QEMU-Support-for-the-RISC-V-nstruction-Set_Architecture) + + +RISC-V 是一种新的指令集架构,最初旨在支持加州大学伯克利分校的计算机架构研究和教育。RISC-V 现在将在 RISC-V 基金会的治理下成为行业实施的标准开放架构。 + +本演讲将总结 RISC-V 和开放 ISA 对开源系统软件社区的好处。演讲的第一部分将关注 RISC-V 特权规范草案,包括 RISC-V 愿景,即硬件、管理程序和操作系统之间的更清晰抽象。 + +该演讲还将讨论我在 QEMU 中提出 RISC-V 仿真支持的经验,包括添加架构支持、实验设备和针对 golden reference RISC-V 模拟器 Spike 的模糊测试。演讲最后将概述在 QEMU 中为 RISC-V ISA 支持做出贡献的机会。 + +Sagar Karandikar +加州大学伯克利分校研究生研究员 + +--- + +## 视频内容 +> 本文主要是根据视频发言进行的译文,内容是经过我处理翻译,如果有地方不准确,希望收到你反馈,我会及时修改的,谢谢。 + +Sagar Karandikar 是伯克利大学的博士,一致致力于在 QEMU 中添加对于 RISC-V 的指令支持。 + +* 主要讨论为什么 RISC-V 的开放 ISA 的好处?是希望不会太难卖。 +* 了解一些关于 RISC-V ISA 基础内容,以及为什么设计 ISA? +* 讨论使用经典的虚拟化技术的支持,在虚拟机管理程序规范中存在的差距? +* 讨论对 RISC-V 的 QEMU 目标支持? +* 讨论关于正在进行的工作类型,以及对 QEMU 的上游做了什么,以及未来的规划? + +--- + +## 1. 主要讨论为什么 RISC-V 的开放 ISA 的好处? + +### ISA 并不是很重要 + +如果我们在看一个完整计算机系统时,有很多不同因素会影响机器上运行应用程序的性能和功耗特性。因此从一开就知道你设计的某些算法具有一定的运行时复杂性,我们必须随后担心,编写代码实现质量很重要,然后我们必须通过编译器、操作系统或其它什么语言去运行。这里的 ISA 是一个特定组件,在使用 ISA 后,还有很多重要的事情去做,当我们设计的微架构或者实际设计核心内容时,我们需要考虑那些内容的权衡,比如有缓存有多大。甚至一旦我们完成了架构工作,就知道了如何正确地制造芯片,芯片会有很多东西影响实际系统正常的运行方式。因此从这个角度来看,ISA 并不是很重要,只是巨大内容一小部分,但你可以说你的指令集很重要。 + +--- + +### 为什么指令集设置架构很重要 + +* 为什么不适用 Intel 销售移动芯片? + * 99% 的移动手机芯片都是基于 ARM v7/v8 的 ISA。 +* 为什么 ARM 不能用于销售的服务器? + * 99% 现有的服务器都是基于 AMD64 ISA 构建的,并且超过 95% 都是由英特尔提供的。 +* 怎么 IBM 仍然销售大型计算机? + * 其中很多古老的机器是基于 IBM 360 系统的,其中 ISA 已经存在了 50 多年。 + +对很多问题的答案是,软件成本真的很高,可以构建在这些主机上运行良好的软件,不同机器类型需要付出很多成本,因此鉴于此,我们可以争辩说我们的 ISA 实际上是计算机系统中最重要的接口,这最终是我们从构建一个 fixed 开始,在固定硬件功能到真正可以编程的任何东西。 + +--- + +### 为什么如此多的 ISAs 在集成芯片上? + +>如图所示,展示了 NVIDIA Tegra SoC。 + +![[NVIDIA_Tegra_SoC.png]] +如果我们更近一步喜欢现代系统,那么不仅仅是一个片上系统,这里有一个 NVIDIA Tegra SoC,有很多不同的类型板载处理器,还有加速类处理器,有图形处理器,图像处理器,各种 DSP,安全处理器,电源管理单元,有时只有常规内核。应用处理器太大了,无法更好地用于小型加速器,当我们构架片上系统时,会从各种供应商和这些 IP 中的每一个都有自己专有的权利,有时想开发自己的核心,如果您正在构建这些加速器之一,甚至构建自己的 CPU,使用自己的 ISA,因为它们需要一些受限制的功能集,或者需要添加不存在的功能,因此必须不断的推出新的编译器和操作系统,因此今天的 SoC 板载了十多个 ISA,其中每个 SoC 都必须有自己独特的软件,所以这是大量的工程工作。需要做一些已经完成的事情。 + +--- + +由此产生了几个问题,列表: + +* 我们需要这些不同的 ISAs 吗? +* ISA 一定是专有的吗? +* 最重要的是如果有一个免费和开放的 ISA,可以提供给你使用吗? + +--- + +### ISAs 应该是开放和免费的 + +对于以上的问题,应该认为 ISA 自由和免费的,不受任何法律的约束,因此更多 ISA 出于各种原因是专有的,但是在很大程度上,这些原因是历史原因或者商业原因。因此,对我们现在还有没有一个开放的 ISA,这并不是一个很好的技术原因,这并不是很多人的遗漏,也不是像在这些大公司之一工作的人,有一天突然离开了,说一句:天哪,我忘记开源我们的 ISA 了。这并不是因为公司进行了大部分软件开放,正如我们看到那样,很多贡献者,甚至在很多机器上运行的系统软件,很多公司也没有专门设计经验,以及专门介绍 ISA 的教科书,来介绍 ISA 的行为有何不同,那种 ISA 功能是好的、坏的、现代的以及采用现代的实施技术等等,最受欢迎的 ISA 绝对不是最精彩的,大多数有用的 ISA 随着时间的推移与遗留的问题建立起来的复杂性,并且没有公司专门验证 ISA 兼容性的正确性,你可以轻松拥有某些类型的基础来创建兼容性,以确保每个处理器的某些流程,在人实施的时候,尽可能的规范、正确或者尽可能接近我们可以确定规范匹配。过去公司拥有自己的 ISA,可是有些公司已经消失了,并且那些 ISA 不受支持了,所以不能保证仅仅因为有一家大公司支持 ISA,这样它就会永远的持续下去。 + +--- + +### 免费和开放 ISA 的好处 + +拥有免费和开放 ISA 的好处是什么呢?更大的创新将是自由市场竞争,因为 ISA 是标准化的,并且任何人都可以实现与之匹配的内核,因此您可以拥有不同的内核,包括封闭的源代码和开放的源代码,并且您获得帮助,通过共享开放核心设计的方式,因此我说大部分系统构建的实际核心板载性能并不是产品差异化因素,所以在这种情况下,设计师真正需要更好的功能和执行指令的内核。拥有这些共享的开放式设计确实是很有用的处理器。因为越来越多的类型提供更实惠的价格设备,所以这些设备就像物联网设备一样,作为你真的想要的便宜的东西,比如说如果你能得到一些免费和开源的东西,你并不是需要最快的 CPU,这是一种很好方式,与此同时,系统的软件堆栈可以很长时间存在,当从事它们工作的人分布在一家无任何相关公司的情况下,你可以升级所需要的软件,以便能够升级系统中的软件,对于 IoT 类型的设备,例如已经嵌入具体功能的系统因此需要长期支持才能使得正常工作。最后在系统研究社区发展的一件事情,是可以做非常好的实践研究,因为哪里有所有可用的开源系统软件,所以在架构领域,我们想拥有完全开放的硬件堆栈,来使得架构研究更加真实,然后将所有软甲都预先构建在上面,这样从事研究的人可以修改真实设备中实际使用的真实内核了,假如它们是开源的,并且他们得到所有投入软件的工作。你知道移植 GCC 类型的内容以及所有相关的东西都是开放的。 + +--- + +## 2. 了解一些关于 RISC-V ISA 基础内容,以及为什么设计 ISA? + +### RISC-V 的起源 + +在 2010 年,经过很多年使用不同国际标准,伯克利大学的计算机体系结构研究人员研究了他们希望在下一组项目中使用的 ISAs,多年来 RISC-V 有很多明显的选择,例如 x86 和 Arm。如果首先使用 x86 实现,它复杂了,所以你知道我们可能采用几个博士来实现它。假如我们使用它,并且设计的处理器可以工作,然后,我们就可能被起诉了,所以这么去做并不是很好。 + +--- + +### Intel x86 "AAA" 指令 + +你知道,这将作为复杂性的一个样本,比如,"AAA" 指令是 Intel x86 的东西,这对于使用 BCD 数学来说真的很复杂,但它是一个单字节指令,在现在机器中并不是那么重要,但是如果你想要一个 x86 兼容的处理器,你必须实现一些东西,当你尝试时,我们可以对 ARM 说同样的内容,使用 ARM 实现一种不错的简单处理器,它非常复杂,最后你要么必须支付很多钱,要么最终被起诉,这是同样的问题,所以,在伯克利大学,我们在 2010 年夏天开始一个为期 3 个月的项目,开发我们自己的 clean-slate ISA,这里列出主要的设计师:Andrew Waterman, Yunsup Lee, Dave Patterson, Krste Asanovic principal designers,他们在一家初创公司,该公司正在基于 RISC-V 构建更多处理器核。 + +--- + +### RISC-V 背景(部分) + +这里想说更多的背景,在 2014 年 5 月,有很多芯片在本次讨论,在伯克利大学真的有很多关于 RISC-V 研究内容,因此 RISC-V 来实际开发用于研究系统,同时选择 RISC-V 这个名称,使用 RISC-V 来代表伯克利大学的 RISC-V 设计历史,在 1981 年就有了最早的 RISC-V 出版物和各种修订版,并进行进一步的开发,一直坚持测试和实现,其中影响了架构,例如 RISC-I,、RISC-II、SOAR、and SPUR。因此 RISC-V 是伯克利大学的第五个版本。如果我们回到 2014 年的八月,公司的章程被提交,用于创建一个非盈利性 RISC-V 基金会来管理 ISA,并确保它发展没有像伯克利大学这样特殊的利益需求控制。 + +--- + +### RISC-V 并不是一个开源处理器 + +RISC-V 是什么?最总要的,RISC-V 并不是一个开源处理器。所以它只是一个 ISA 规范,不属于任何组织,因此在伯克利大学,我们开发了软件和开源内核处理器,实现了 RISV-V ISA,但是 ISA 是独立的,它是实物,它是开源的。因此任何人都可以实现符合 RISV-V ISA 规范的内容。例如,你不会因为 RISC-V 而被起诉。这样做的原因是以及芯片设计大部分的成本多是软件成本,因此提前在特定芯片上符合一个标准的巨大软件堆栈是一种方法,您可以在一堆不同芯片设计中重用它。基金会的目标是为了确保 ISA 良好发展,更好得到社区的反馈,我们希望鼓励 RISC-V 规范的开源和专有实现,所以这不意味则着它设计东西必须开源,这样公司可以使用它构建自己粉笔源代码核心,并在上面加上特殊的设计,这样他们就不必须开源。 + +--- + +### 伯克利大学 RISC-V 核心 + +这是伯克利大学核心简要历史: +![[伯克利大学核心简要历史.png]] +这些都是伯克利大学设计的,伯克利也有实际芯片设计,它们上面运行 Linux 之类的系统,它们的性能相当的高,特别是提到是它们是由几个研究生制作的,我们使用非常现在的流程制造他们,这个时间表一直在继续,我们不断向工厂发送芯片,我们可以继续让他们回来使用,他们变的越来越好,所以我们有 RISC-V 的实际实现,还有和其它初创公司一起努力构建 RISC-V。 + +--- + +### 背后一些支持者 + +这些是 RISC-V 背后支持者: +![[RISC-V_背后支持者_1_2016 年.png]] +现在有很多公司加入 RISC-V 基金会,有很多已经付钱参与 RISC-V 标准化流程的工业,成为了赞助商,以及指导内容和未来。另一张有更多公司,也做出很多贡献。 +![[RISC-V_背后支持者_2_2016 年.png]] + +--- + +## 3. RISC-V ISA + +### RISC-V ISA 介绍 + +这里将快速讨论 ISA 本身,这里定义三个不同的寻址地址,我们知道的 32 bit 用于嵌入式类型系统的,64 bit 用于服务标准桌面类型机器,还有一个 ISA 规定的 128 bit 地址,用于未来使用和更大的数据中心。最基础的 ISA 仅仅使用不到 50 个指令集,这足以支持编译器和连接器,或者操作系统的特权指令。RISC-V 使得在顶部添加扩展变得非常容易,所以这个想法是与其他 ISA 或者以前 ISA 不同,规定预定义的特定区域,这样您就可以很容易知道,将来有一个软件可以准确地告诉处理器实现的 ISA 版本,以及所有这些功能,是因为它在一开始就被嵌入到 ISA 中,所有的功能。测试所有功能都是预先计划好,所以有更标准的扩展,为我说的通用目的提供了东西,比如浮点和原子,类型的操作。你看在 ISA 是一个水平,因此与其它类型的风险相似,事实上,伯克利大学近期一些技术报告做了一些事情,相比之下,ISAs、x86 和 ARM 都谈到了很酷的 makearov、fusion。ISA 确实是为了扩展和定制而设计的,因此人们想要在 ISA 中添加东西和标准扩展和非标准扩展的期望,因此 ISA 的设计是为了更好的适应未来的扩展,而不会破环一些虚拟化之类的事情,我们已经拥有了 12 个 64 bit 硅原型,所以它们实际上是我们拥有 RISC-V 的真正实现,使得我们可以在上面运行 Linux。 + +--- + +### RISC-V 标准基于 ISA 的信息 + +有几种指令格式是基于 32 bit 固定宽度的,自然对齐,相对简单,有 31 个寄存器,加一个 0x zero register,rd/rs1/sr2 固定位置的,并且没有任何隐藏寄存器,例如,AAA 指令使用了一组特定的寄存器集,这些寄存器并不是指令本身的一部分,所以在这里 rd 就像是指定的一样,当你看指令时,就知道它正在使用什么寄存器并且在后台没有任何魔改,另一个特性是立即数总是符号扩展,所以如果你看像 MIPS 这样的东西有有很多规则是关于什么事情得到扩展你的在这里发生的事情,很容易记住一切得到扩展。浮点数添加浮点扩展寄存器,浮点控制状态寄存器以及一些额外的指令格式,例如 fuse 乘法的添加在你指定的寄存器中,并且基础是一个旨在非常巧妙地允许与位置无关代码和动态链接之类的东西而没有奇怪的东西。 + +--- + +## 4. RISC-V 中 QEMU 都有那些,包含什么内容? + +### RV64 是什么? + +RV64 是 general-purpose 的 ISA,也就是现在在 QEMU 里面的,这是 QEMU 的版本实现的,G 代表是 general-purpose,包括标准扩展 I,M,A,F,D,我是基于在前几张幻灯片中讨论的一个,比如你想在常规桌面类或服务器类系统中添加扩展,基于其它标准扩展。因此你有标准整数乘法和除法扩展,然后是 32 位和 64 位浮点扩展,就像我说的,这是 ISA 的标准通用版本,这就是 QEMU 实现的特权部分,到目前为止,这里我展示是标准化的东西,用户级别是固定标准化,并且不会改变。 + +--- + +### RISC-V 特权规范 + +它仍然在开发中,所以我会讲它的现状如何,但其中有一些东西在未来可能会发生变化,所以现在有四种特权模式,User,Supervisor,Hypervisor,Machine,每个模式都是需要机器模式,常见的情况是提供机器管理模式和用户模式来允许类似 unix 操作系统之类的内容,这就是 QEMU 现在所作的事情,如果你担心内存转换的内容,所以虚拟内存架构基本上是为了支持你知道标准的类 Unix 操作系统,所以这里没有什么疯狂的事情,例如 Sv39(RV64)规范,在 RV64 中使用,而 64bit RISC-V 使用了常规的东西,所以在这种情况下你得到一个需求页面虚拟地址空间,Sv39 意味着,它是一个 39 位 虚拟地址空间 3 级页表,你可以拥有各种各样大小的页,标准为 4 KB,并且有各种不同的地址空间大小,具体取决与你的系统需求,这些都是在规范中标准化,所以这是特别有趣的内容。 + +--- + +## 5. 关于 RISC-V 虚拟化 + +### RISC-V 虚拟化 + +简单谈谈关于虚拟化,RISC-V 虚拟化是一种经典虚拟化,从一开始就融入了 ISA,我们试图关注虚拟化,关于虚拟化我们的系统很容易,所以你只是使用用户管理模式和机器模式,RISC-V 被设计为在这个意义上可以虚拟化,因此这是直接来之与手册的引述,以表明设计人员正在关注正确的特权架构,为了简化客户操作系统使用经典虚拟化技术,让其在用户级别允许,并且由于可以轻松检测和跟踪少数特权指令,因此我将简要讨论如何在原始 VMware 论文的上下文中避免一些经典的虚拟化问题,该论文描述了它们在添加虚拟化是遇到的一些困难,是一个运行在 x86 上的操作系统。 + +--- + +### 处理敏感但非特权的指令 + +处理敏感但没有特权的指令,因此如果你在为这些指令在 x86 构建 VMware 时查看这篇论文,他们会有列表列出了 x86 架构的 19 条指令,这些指令不幸违反了 Popek and Goldberg’s 的规则,因此在没有任何黑客攻击的情况下制造了 x86 非虚拟化,因此在 RISC-V 中没有这种隐藏的特权状态读取或写入,所以有一个小部分特权可以修改特权状态的空间,我们称之为“控制状态寄存器”,这是特定寄存器的地址空间,并且在寄存器编号中编码的有关权限的信息,例如,你必须处于那种模式才能读取或写入此特定寄存器,因此很容根据你的所处的模式告诉你允许修改,因此很容让你知道本机的常规允许内容,并为特权指令执行陷阱和模拟,当你在尝试虚拟化时,遇到这些内容,但是 RISC-V 基本上没有这个问题,这个隐藏的特权状态读取和写入。 + +--- + +### 追踪虚拟机内存的变化 + +对于原始的 VMware 这是引用特权硬件寄存器包含段描述符表和页表的地址,但是这些东西会被常规的加载和存储修改,这些显然不会有问题,所以你不能告诉这是怎么回事,因此在 RISC-V 中你仍然使用定期加载和存储以及修改内存的管理状态,但根据规范,需要在加载和存储只有有这个 SFENCE.VM 指令,像页表一样修改,如果你在运行它,这是一个特权指令用户模式,它会使你陷入困境,你就会知道,你可以做你通常的模拟来修复你的监控器。 + +--- + +### 虚拟化分段 + +最后时虚拟化分段,这是一种最简单的修复,所以不得不把这段写在这里,因为它太复杂了,不能放在 PPT 上,但基本上你知道各种各样的隐藏状态,当你在 RISC-V 中处理段描述符表和寄存器之类的事情时,大量隐藏状态会在 x86 中被修复,修复是很简单的,没有 x86 的分割,在分页之上的分割,所以如果你想要这种有限的基本入栈模式,这可以在机器模式和类似的内容使用,你会得到几个段,同时得到这种简单的保护,但是我们希望常规系统将使用分页代替,所以由于我们要求很低,我们没有这个问题,隐藏状态被修改为段处理和类似的内容,以及我们内存管理是通过页面发生的,并且在很容检测到。 + +--- + +### RISC-V 虚拟化堆栈 + +在 ISA 发生另一件事情是内部软件的逻辑故障,在 ISA 的设计目的是让虚拟化变得非常容易,因此在我所说的在运行软件中拥有更简洁、抽象的想法:“应该可以很容地交换任何这些基本组件并行虚拟化:,所以这个是我们想在软件堆栈本身内部提供非常干净的定义明确的层,这样您就知道一些已经常见的东西,你的应用程序通过一些应用二进制接口与 OS 通信,所以这没什么不同,但我们想在 RISC-V 中将其一直扩展到堆栈,例如,你的操作系统现在将通过一些二进制接口与由一些特权软件提供的执行环境进行通信,你就可以将其扩展到管理程序等等,所以这个想法是所有级别 ISA 都是预先设计的,用于支持虚拟化。 + +--- + +### RISC-V 管理程序规范 -WIP + +因此虚拟机管理程序规范 ions 现在是特权规范中一个空白章节,所以它是一种正在处理的东西,你可以用当前的特权设计做这个,M 模式监视器,它提供非常简单的物理资源分区并且可以充当,非常简单的虚拟机管理程序。当然我们希望在顶部有更多功能齐全的虚拟机管理程序,所以会有一个虚拟机管理程序扩展规范,就像我说的那样,如果你有兴趣参与其中,它现在是特权架构设计中的一个空位,我会鼓励你加入一个开发邮件列表,这个想法是会有有人这个初稿的,然后草稿会在开发邮件列表上进行循环,我们会接受反馈,事情会得到修复,然后它通过基金会中的不同委员会,并在让我们知道它运作良好后,最后获得批准。 + +--- + +### RISC-V 的生态 + +* Github:github.com/riscv and github.com/ucb-bar +![[RISC-V_年的生态.png]] +关于 RISC-V 生态系统本身,我们构建了一堆软件,所以你知道你的常规编译器和内容,我们有 GCC/ glibc / GDB,可以使用 LLVM / Clang,我们有一个 Linux Port 它正在快速改进,但是启动它你可以使用它输入命令命令行,使得它为小型嵌入式系统生成嵌入式发行版,我们还有一个标准的测试的验证套件,我将快速浏览我们拥有的硬件,因此如果您想购买 FPGA 并自行设计 RISC-V 的内核,我们将拥有 FPGA 基础设施(后边会讨论这个内容),我们有 Spike,这是我们的”Golden-standard“ISA,它是一个模拟器,所以关于 Spike 的事情以及我们称之位”Golden-standard“的原因是 Spike 是由为 ISA 和 Spike 编写规范,来至同一个人编写的结果,你可以质疑它,并且说如果 spike 做了一些你被允许做的事情,这就我们一些测试的方式,我会在最后讨论这个,然后我们由 angel,JavaScript ISA 模拟器,如果你有兴趣你可以去尝试,它们可以在浏览器中启动 Linux,然后就是 QEMU 的内容,稍后回谈论这个,然后我们还有一堆硬件实现,芯片或者内核,这是一个 RV64G 单一问题的内容,我们有 Sodor 处理器,它是用于教育的处理器,然后我们也有 BOOM 这是我们一种(伯克利 Out-of-Order Machine)没有顺序各种规模的处理器,在上边已经展示很多了与各种 arm 内核的可比指标。 + +--- + +## 6. 对于 QEMU,RISC-V 支持的目标 + +### 概述 + +这里将谈谈 RISC-V 目标对 QEMU 的支持,所以现在这里在 GitHub 上的 RISC-V 组织上进行维护的,我们显然希望上游加入它们,我们想在几张 PPT 中为说清楚为上游做了什么内容,这里维护我们现在在现在 x86 上拥有 QEMU 完整的系统模拟器是没有 Linux 用户模式,非常有趣的是 QEMU 是最快的 RISC-V 实现,这里可能将在知道 1-2 年的后,因为真正的核心开始出现,但是现在我们是最快的,一件很酷的事情是,这对开发 RISC-V 软件将有很大的帮助,尤其是当我们不这样做的时候,在等级核心上真的很强大,这可以很快开发软件。这里展示它的工作原理,所以在左侧一个启动 Liunx,在右侧 QEMU 已经完成了,所以你会看到右侧完成启动,这样你就可以允许命令行了,并且使用它做任何事情了, +![[在_Linux_中启动_QEMU_中_RISC-V.png]] + +--- + +### RISC-V 的时间线及”第一次“ + +简要讨论 在 RISC-V 的时间线中很多第一次发生在 QEMU 的事情,因为我们开始了 QEMU 时,当时我还是 XXX,2014 年的,好像时 2014 年 5 月什么的,大约一个月后我就开始 QEMU,我们在 QEMU 上进行了第一次 Linux 启动,它立即成为最快的 RISC-V 实现,然后它也是第一个具有 TCP/IP 服务的网络,所以我们有 Vert IO 网络设备,你可以关联到 Linux 上通过 VNC 运行的 GUI 交互,然后它也是第一个 Python 的一部分,所以第一个真正软件 Python 是在 QEMU 上运行的 RISC-V 之上运行的。第一个运行 Java 启动也发生在 QEMU 上运行的 RISC-V,我认为特别酷的是,第一个 RISC-V 内核建立在 RISC-V 系统上在 QEMU 中。然后我们在 2016 年初做的下一件事情是 bump 特权规范,所以特权规范任然在发展,这是一个相当大的飞跃,所以我们升级一个新的特权规范,随之而来第一个 RISC-V 系统,你可以使用 debug 通过 GDB 服务器远程调试 GDB,在几周前对特权 1.9 规范进行了另一次 bump,希望我们在完成初步准备后,尽快启动流程测试。 + +--- + +### RISC-V 芯片上开发 RISC-V + +这里将简要介绍一下我们在伯克利是如何制造芯片的,所以我们有自己的 DSL 用于开发称为 Chisel 的芯片,所以这个想法它不像高级合成,它不像你编写 C 程序并将其转换成电路芯片,Chisel 是一种是开发硬件变得更容易的方法,类似与你在日志中所做的那样,你仍然在描述硬件,但是想法是你应用良好的软件工程技术和良好的编程语言特性来设计硬件,所以 Chisel 是嵌入在 Scala 中用于生成硬件的 DSL,因此为了实际知道芯片,尽管我们最终需要生成错误日志,所以我们编写所有我们的芯片和 Chisel,和所有展示这些照片,以及之前展示照片,这些都是用了 Chisel 编写的,然后我们在 JVM 上运行 Chisel 编译器以及发出错误日志,然后通过所有 CAD 工具,所以这里有个非常棒的本科是提出一个简单的 JVM 端口,经过大量工作后来解释的版本,所以这里是在 QEMU 内部运行,可能很难在后面看到,但这里是 Chisel 的源头,停留在我们教育阶段课程并在 QEMU 之上运行它,你在 RISC-V 系统上运行它会有大量日志,然后你可以执行,并通过 CAD 工具进行操作,所以虽然着很酷,但它有点像第一个自我托管的以某种方式运行 RISC-V 系统。 + +--- + +### RISC-V 目标对 QEMU 的支持 + +对于 RISC-V 支持的更多信息,我们支持了什么,我们早在 2014 年,正如我在上一张 PPT 上向你们展示的那样,随着 ISA 的发展,我们一直在修改内容,自我更新,所以我们支持我们 RV64G 完整系统仿真用户是一种支持,从那时起,它 2.0 版本中已经标准化,我说的特权已接近标准化,至少机器管理员模式和用户模式为 1.9,因此 RISC-V 版本 2.0 通常意味着,你知道的标准固定版本,不过好处是未来对 QEMU 的特权规范审计会简单很多,因为我们至少在非常关键的性能区域嵌入一些 Spike 代码到 QEMU 中,所以它更容易嵌入对未来的事情,所以在我们这样做之前,回到 1.7 的与特权,但我不得不将他提升到 1.7 规范时,花了大约一个月的时间来做调整并确保一切正常,但在几周前我做了 1.7 到 1.9 的升级,我基本上生成了带有 Spike 的巨大差异,然后动手应用它,看看这次发生了什么,只用了三天而不是一个月,所以在这里修改显然要快速很多,一旦特权领域的事情变得稳固,我们想要优化任何可优化的内容并完成。另一个重要的功能时我现在仅限于主机目标接口设备,因此主机目标接口或者 HTIF 是我们构建时遗留的内容,通过控制台有一个 HTIF 控制台设备。我们以前有很多其它设备,在我们拥有真正的特权之前,我们正在致力于平台标准化并添加软件支持,对于一堆设备,尤其像 Linux 这样的设备。但要查看 QEMU 中硬件类型,这是您将看到的内存映射(hw/riscv/riscv_board.c),它提供一个参考板设计,用与匹配 Splike 现在的功能,因此它提供一个非常简单的硬件配置有一个基于 HTIF 的控制台,用于显示引导消息和 Linux,你知道你可以让你的中断使用,还有循环软件中断、仿真,由于特权范围的需要。还有一个 RTC 和 符合特权规范的 TIMER,然后是一个重置向量,嵌入式的 RISC-V 程序集,现在有一个配置字符串,所以邮件列表上正在讨论这个匹配字符串应该是什么样子的,这是一种自定义的东西,我认为它们正朝着用标准的设备树的方向发展这个自定义匹配字符串,但基本上它被映射到内存中,你有你的 DRAM,然后你的所有设备很快就在内存比较低的区域出现。 +![[内存映射.png]] + +--- + +### I/O :HTIF(old),Debug (new) + +现在出现了 HITF 和 我们新的调试系统(正在使用),就像我说的那样,HTIF 是 伯克利测试芯片的遗物,它基本上被淘汰了,它是从主机使用的 64bit 寄存器来监听主机,这些是一个很大程度上遗留的系统,所以你有一个 FPGA 板子,在使用我们使用我们制造的芯片,所有的 IO 都由 FPGA 上的东西处理,所以我们没有必须在这些测试内容上拥有大量复杂的自定义 IO 的 IP,所以 HTIF 是逐步淘汰的内容,它曾经能够提供诸如联网块设备和控制台之类的内容,除了 QEMU 现在拥有的标准,它只是对于控制台和指令测试完成,将在稍后讨论,但是我们要替换它,使用的 RISC-V 标准的调试规范,因此我们希望在获得真实芯片后更容易调试它们,这个是我正在标准化过程中的内容,它将取代 HTIF 曾经拥有的 H-24 类型调试功能,当然对于真正的硬件和真正的软件模拟器,虚拟化环境,他们将逐步淘汰 HITF 并转向标准,一旦软件支持进展,标准设备就会发生这样的事情,所有的 HTIF 代码和 Linux 在我们获得其它设备支持之前,首先将被剥离出来,但其他设备支持正在慢慢重新添加进来。 + +--- + +### 在 RISC-V QEMU 的软件堆栈 + +这里将很快谈谈,在 QEMU 中运行的软件堆栈是什么样子的,所以基本上有一些运行安全启动的主要 M-mode 和一些监控代码,在这种情况下,它被称为 BBL,它是伯克利大学设计引导加载程序,我将确切低谈论它在下下一张 PPT 中,然后是 S-Moe 超级用户模式将运行你的操作系统,这里想法是操作系统始终运行虚拟化,因此操作系统始通过 SBI 接口与其余硬件交互,如果你有这些干净整洁的界面,那么操作系统可以直接在硬件上运行,这里使用引导加载程序,并有一些监视器模式,或者让你知道管理程序和在哪里提供 SBI 的内容,然后用户模式可以在操作系统之上运行应用程序或者如果你的 M-mode 监视器支持,则可以直接在 U-mode 下运行应用程序。 + +--- + +### Boot Up + +这个东西是如何启动的,当你向 QEMU 提供一个引导加载程序的二进制文件,并且由于引导加载程序是你拥有的 Linux 的有效负载,所以引导加载程序执行执行系统机器模式管理,并将 SBI 暴露给操作系统,例如,当 Liunx 想要打印到 HTIF 控制台,它将进行 SBI 调用和 M-mode 管理代码,将作为 Liunx 执行操作,因此 Linux 不会必须解决这个问题,这里的想法是,从长远来看,你可以编写在操作系统之外运行的设备驱动程序,这样您就不必须为开发的新操作系统编写新的驱动程序,而不是操作系统通过标准化接口与外部世界交互,在这种情况下,我们的 Linux 还包括,这样我们就不必须处于设备,但我们之前必须支持它,它很快就会被会放回,所以这个东西启动的方式是系统启动到你的硬件编码,启动 ROM,它将跳转到 BBL,BBL 将执行此处列出的所有这些管理,它将初始化操作系统期望看到的主要执行环境,然后它将在种情况下运行内核 Linux。 + +--- + +### 正在执行的测试与调试 + +这里会谈谈测试和调试,当你了解它时,你通常会知道 GDB 非常困难的调试类型,但是现在它公国了 RISC-V 标准测试,正如我之前展示那样,我们可以在上面运行相当大的软件堆栈,所以在 Python 上,我们已经完成了诸如在上面运行图像处理研究的东西,所以我们在 qmu 中开发了所有这些东西,然后最终得到了一些内容,它可以在真正的硬件上运行——我们在 JVM 之上做了一些事情,就像我向你展示了用凿子构建东西一样。 + +--- + +### 使用 riscv-torture 进行模糊测试 + +所以我们已经在 Linux 上的 qmu 之上运行了相当大的软件库存堆栈,我将快速谈论模糊测试标准,所以我们有称为 RISC-V 测试框架,本质上它的作用是它会根据你提供的一些参数生成随机指令序列,所以你给它一些混合,你希望你知道一些内存指令浮点原子的一部分,无论它会生成一个序列,然后因为我们有这个黄金标准实现,它总是被认为是正确的,它本质上是我们所做的,我们是否运行我们运行我们的代码这个生成的代码在峰值和一些替代实现上,在这种情况下你有 QEMU 然后最后发生的事情是你在这种情况下只转储一些签名,只是所有寄存器状态,你比较所以如果 如果你输出的东西与尖峰所说的不匹配,你会生成然后你做某种类型的二分搜索来准确找出出错的指令,然后我将它报告给运行测试的人,我制作了脚本在我们公开的可用的 QEMU 版本之上运行 Torture,自我我在特权 1.9 更新后重新启动它以来,我们已经积累 384 小时的无故障测试,所以我打赌在这里硬编码这个数字,因为几天前我不得不提交幻灯片,但幸运的是它在过去两天没有崩溃,所以这个数字仍然是正确的,所以自从我们进行特权 1.9 更新以来,我们还没有收到任何由 Torture 报告的崩溃,所以在这方面看起来不错的。 + +--- + +### target-riscv SLoC + +最后一件事是比较代码行,我知道这是非常不公平的,但是 arm 有 45,438,MIPS 是 37,501,x86 是 30,437,而 RISC-V 只有 5,074,当然你知道这是不公平,因为我们没有要处理的所有遗留问题,但这只是表明我们有合理数量的代码,这基本上没有做任何工作来简化事情,或者你知道清理掉那些在某些地方重复,所以这可能会得到相当不错的改进。 + +--- + +## 7. 未来的工作和想要做的内容 + +这绝对是我们想要做的最后一件事我要谈论的是我们剩下要做的事情以及我们未来想要做的事情,所以在功能方面我们肯定想添加标准设备支持,所以这主要是在 Linux 端,需要在 Linux 上完成的事情有一些事情需要在 QEMU 中完成,比如标准平台级中断控制器,但当然那里还没有真正标准化,是当前特权规范中指定的版本,所以这是需要实施的东西,当然还有 upstreaming,所以我们计划在 9 月中旬开始流媒体,我提交了一个非常大的补丁,因为我被建议,只是为了表明目标支持存在,因为我们有兴趣可能会做 chuseok 并且无论如何我们都得到了一些关于该补丁的反馈,例如已经完成了一些好东西,比如使用内置 FPU 而不是我们自定义版本的软浮动 并且 Torture 测试器还有助于确保像这样的事情是正确的,这非常有用最近我碰到了 1.9 特权规范,它比以前花费了更少的时间,所以希望这对于事情的稳定性来说是令人鼓舞的还有更多的清理工作要做,主要是我认为在我们上游之前把事情放在正确的地方是明智的,然后我们 需要对 master 进行 rebase,所以它是 kupets,我们目前正在使用 QEMU 版本,我认为就像 2016 年 12 月一样,所以我们需要 rebase,然后我们还需要把事情分解成你知道的小补丁,幸运的是我让 tricor 的维护者在这里帮助我,他最近在上游,然后在未来我们也想做一些事情,比如支持其他是一个变体,所以我们的 RV32 压缩是一个,然后还添加对像 linux 用户模式。 + +## 参考链接 + +* +* http://www.linux-kvm.org/images/6/6a/02x04B-QEMU-Support_for_the_RISC-V_Instruction_Set_Architecture.pdf -- Gitee From 1e528c269fde389ec02b1ff7ef9113fb0dee4780 Mon Sep 17 00:00:00 2001 From: ZhaoSQ <1044239768@qq.com> Date: Mon, 27 Jun 2022 14:26:38 +0000 Subject: [PATCH 02/15] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20QEMU=5FSupport=5Ffor?= =?UTF-8?q?=5Fthe=5FRISC-V=5FInstruction=5FSet=5FArchitecture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/.keep diff --git a/articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/.keep b/articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 08247a3a4fc64ae890b675b14418d15ad8f39ec3 Mon Sep 17 00:00:00 2001 From: ZhaoSQ <1044239768@qq.com> Date: Mon, 27 Jun 2022 14:28:21 +0000 Subject: [PATCH 03/15] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E7=9A=84=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NVIDIA_Tegra_SoC.png | Bin 0 -> 518825 bytes ...64\347\232\204\347\224\237\346\200\201.png" | Bin 0 -> 61049 bytes ...14\201\350\200\205_1_2016 \345\271\264.png" | Bin 0 -> 166187 bytes ...14\201\350\200\205_2_2016 \345\271\264.png" | Bin 0 -> 207932 bytes ...00\350\246\201\345\216\206\345\217\262.png" | Bin 0 -> 380230 bytes ...05\345\255\230\346\230\240\345\260\204.png" | Bin 0 -> 26625 bytes ...7\345\212\250_QEMU_\344\270\255_RISC-V.png" | Bin 0 -> 22158 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/NVIDIA_Tegra_SoC.png create mode 100644 "articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/RISC-V_\345\271\264\347\232\204\347\224\237\346\200\201.png" create mode 100644 "articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/RISC-V_\350\203\214\345\220\216\346\224\257\346\214\201\350\200\205_1_2016 \345\271\264.png" create mode 100644 "articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/RISC-V_\350\203\214\345\220\216\346\224\257\346\214\201\350\200\205_2_2016 \345\271\264.png" create mode 100644 "articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/\344\274\257\345\205\213\345\210\251\345\244\247\345\255\246\346\240\270\345\277\203\347\256\200\350\246\201\345\216\206\345\217\262.png" create mode 100644 "articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/\345\206\205\345\255\230\346\230\240\345\260\204.png" create mode 100644 "articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/\345\234\250_Linux_\344\270\255\345\220\257\345\212\250_QEMU_\344\270\255_RISC-V.png" diff --git a/articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/NVIDIA_Tegra_SoC.png b/articles/images/QEMU_Support_for_the_RISC-V_Instruction_Set_Architecture/NVIDIA_Tegra_SoC.png new file mode 100644 index 0000000000000000000000000000000000000000..016cf90812376eb6272edee8167d5b5c64749774 GIT binary patch literal 518825 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 z

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