哪个网站做外单出口好,开企网,知乎 做照片好的网站,wordpress分享到目录 写在前面
一、RISC-V指令集简介
1、什么是ISA
2、有哪些ISA
3、CISC和RISC
4、什么是RISC-V
1. RISC 的起源
2. RISC-I 和 RISC-II
3. RISC 发展和商业化
4. RISC-V 的诞生
5、RISC-V生态的特点
6、RISC-V指令集的特点
1. 开源
2. 社区化
3. 设计简洁
4. 模…目录 写在前面
一、RISC-V指令集简介
1、什么是ISA
2、有哪些ISA
3、CISC和RISC
4、什么是RISC-V
1. RISC 的起源
2. RISC-I 和 RISC-II
3. RISC 发展和商业化
4. RISC-V 的诞生
5、RISC-V生态的特点
6、RISC-V指令集的特点
1. 开源
2. 社区化
3. 设计简洁
4. 模块化
5. 分层设计
二、RISC-V的基础知识
1、交叉编译工具链的安装
2、RISC-V的开发板
①Sipeed Lichee Pi 4A
②VisionFive2
③Longan Nano
④Pine64 0x64
3、RISC-V虚拟操作系统
①使用virsh来管理虚拟机我不推荐这种做法
②直接使用Qemu命令直接创建虚拟机
③使用virt图形界面管理
三、RISC-V编程初体验 写在前面
现在计算机的体系架构正是发展得如火如荼的时候占领桌面端市场的x86架构、占领移动端市场的arm架构、在服务器市场仍有一定地位的mips架构、国产自研的指令集loongarch架构、还有我现在要讲到的新型开源开放的RISC-V指令集架构。
我先说一说我的学习经历三年前我开始学习x86架构不得不说x86架构这么多年的发展变得是真的非常复杂和难以概括它为了兼容性不得不保留一些早期的设计实际上计算机硬件的发展非常迅速摩尔定律已经保持了这么多年很多Intel的早期设计虽然非常精彩、体现了工业的气息和Intel工程师的智慧但是放到现在来说真的是太冗余了。2021-2022年我主要学习8086汇编在DOS操作系统上做实验进行实模式的编程。2022-2023我主要学习x86的保护模式在保护模式上完成了我的第一个OS,随后进入x86_64的长模式编程制作了一个具有现代性质的有smp支持的OS。这一路学来体会到最多的就是Intel为了兼容性让内核程序员体会到新旧思想的反复交替和叠加在体系结构升级的过程中不断弱化但没有抛弃分段式的内存管理强化分页式内存管理把用段来表示的内存逐渐变成平坦模型最终MMU就完全是分页机制管理了。除此之外就是指令集的不断增加在很多的寄存器或者是结构里都会有res这样的保留字段感觉坑坑洼洼的也许是Intel为了填坑而设定的就显得不是那么美观、符合直觉。
那么我现在要讲的是RISC-V这个新型开源开放的指令集它是有加州大学伯克利分校的教授和研究人员开发的。它出自大学那么和x86、arm这样出自企业的指令集形成鲜明的对比它具有浓厚的学院的设计思想有更好的设计美学和简洁的哲学表达语言用人话说就是risc-v汇编写起来更加简单、不需要特别的记忆、对于程序员来说学起来比x86要简单许多。这一点非常类似于Python,简单 简洁 方便 适合初学者成为它的一大特点。并且它作为“后来者”在设计的时候就已经吸取了前代risc和cisc指令集的经验教训没有那么多为了兼容性的历史包袱更加纯粹。实际上它不仅仅利好于程序员的汇编编程而且对于基于RISC-V架构的芯片设计也有很多良好的帮助。 本文适合哪些人看1、掌握c语言内核开发c语言是基础2、会Linux命令我还是用我最喜欢的Fedora上实现3、有计算机组成原理的基础我会对比risc和cisc指令设计的不同 4、最好是学过x86或者arm这些体系结构我会使用x86架构来类比迁移学习risc-v。
本文尽可能少的去讲理论而是去实践编程也就是带大家去上手写risc-v的汇编并观察现象把理论和实践结合起来。我主要是从一个内核开发者的角度去看也就是从软件开发的角度着手关于RISC-V硬件相关的功能我只能少量的提一提多了也不会。 以下是我当前的环境还是那个熟悉的Fedora. 学习risc-v指令集有许多的资料希望大家能够用起来 《RISC-V体系结构编程与实践》 bilibili汪辰老师的视频 The RISC-V Reader: An Open Architecture Atlas 一些参考资料的合集 大家也能够看出来risc-v指令集官方也是有提供中文资料的这对于学习RISC-V指令集是非常方便的。希望大家能够把这些资源都利用起来本文实际上理论来源也是官方的文档和这些参考资料。 一、RISC-V指令集简介
1、什么是ISA
ISA是Instruction Set Architecture翻译成中文就是指令集架构的意思可以看作是一系列指令的集合这里的指令不仅仅是你能看见的汇编语言的指令它还包括了这些指令对应的底层的电路设计。Instruction有指令、命令、吩咐的意思Set就是数学上的集合Arch这个缩写相信大家经常能够看到是架构的意思。 2、有哪些ISA
我们知道的指令集就有x86、arm、risc-v、mips、loongarch、sparc等 实际上你在终端敲qemu然后按两下Tab,就能够看到qemu能够模拟的指令集。
既然提到了Qemu模拟器/虚拟机那么我们就在这里安装它吧Qemu将是我们以后学习RISC-V指令集最重要的工具之一。
sudo dnf install qemu-system-riscv qemu-user-static-riscv
前者是system mode是模拟整个计算机系统就是它会把riscv芯片和外部设备等硬件全部模拟出来然后你可以把它当作是一个开发板、裸机之类的概念模拟硬件。它启动的时候是在M模式下是要从opensbi开始运行这个我们暂时不用管从用户程序开始学起比较容易。
而后者是user mode是模拟一套Linux软件相当于是运行了一个riscv Linux系统你可以把你写的用户程序在这个模式下跑。
为了保险起见你可以多安装几个qemu的包防止在运行的时候出现一些莫名其妙的错误。 我们可以给这么多的指令集进行分类。 3、CISC和RISC
CISCComplex Instruction Set computer 复杂指令集 比如x86
在设计指令的时候是针对特定的功能设计的也就是说它的一条指令对应了一种功能比如x86里的mov指令能够把数据从寄存器移动到寄存器、可以把数据从内存移动到寄存器、还可以把数据从寄存器移动到内存。这个mov指令就是针对数据移动这个功能设定的。随着计算机越来越复杂实现的功能越来越多那么CISC ISA就要不断地添加指令每多一个功能就要加一个指令。优点就是你掌握好少数几条指令就可以做许多的功能因为一条指令可以有很多用途的而且生成的程序比较短占用空间小并且对兼容性和拓展性的支持也比较好你想推出新功能在原来的基础上添加新的指令集就好了。而缺点也很明显每多一种就加一条指令那么最终指令的数量会越来越多整个指令集和电路的设计就会越来越膨胀。一开始还能接受到了后期可能扩展到了几千条指令据我查到的数据新x86指令集是有1468条指令现在也许更多了指令数量越多越难以把握。实际上x86的这种设计是针对早期计算机存储空间太小问题而设计的思路那时候的程序员绞尽脑汁地开发就是为了自己的程序能够省一点内存。 RISCReduced Instruction Set computer 精简指令集 比如arm和risc-v
RISC ISA在设计指令的时候和CISC全然不同它是只定义一些常用、必要的指令然后你要实现更多功能那么就需要对这些指令进行“排列组合”用好几条指令来实现原本CISC一条指令就能实现的功能。也就是它不再按照功能来设计指令了。那么在这种设计哲学下随着计算机功能越来越多RISC ISA的指令条数增长的速度相比CISC就会慢很多不会造成电路设计过于复杂、指令数量膨胀这些缺点。RISC的缺点是生成的程序比较长、占用空间大。但是由于现代计算机发展迅速存储已经不再是已经太大的问题了现在的个人电脑16GB内存已经是标配了计算机只有64KB内存的时代已经一去不复返了。 但实际上RISC和CISC这二者之间并不是水火不容的关系而是互补的关系。RISC指令集有CISC的设计思想在里面CISC指令集也有RISC的设计思想在里面互相融合可以解决很多原本的缺陷从而更加适应现实里复杂的环境。
x86系列面向外部的指令集是CISC复杂指令集计算机但在内部这些复杂的指令在执行之前会被分解成更小、更简单的操作这些操作称为微操作micro-operations 或 μops这种新的设计思想就叫做Intel微架构。
而risc-v指令集为了方便程序员编程也设计了一系列的“伪指令”伪指令本身不翻译成机器码而是展开成好几条汇编指令伪指令把多条汇编指令封装起来实现类似CISC那样一条指令实现一个功能这样的设计这样是为了方便程序员使用。 4、什么是RISC-V
终于回归主题了 RISC-V全名Reduced Instruction Set Computer 即精简指令集计算机。V是罗马字母5你可以认为这是伯克利大学开发的第五代精简指令集。它可以读作 risk five/ˈrɪsk ˈfaɪv/ 1. RISC 的起源 RISC 的概念最初在 1980 年代初由加州大学伯克利分校和斯坦福大学的研究者提出。这些研究者发现通过简化处理器中的指令集可以提高其执行效率和速度。最初的 RISC 设计包括 John Hennessy 在斯坦福大学领导的 MIPSMicroprocessor without Interlocked Pipeline Stages项目。David Patterson 在加州大学伯克利分校领导的 RISC-I 和 RISC-II 项目。 2. RISC-I 和 RISC-II RISC-I1982 年伯克利的 RISC-I 项目产生了第一款 RISC 处理器。这款处理器包含了约 31 条指令实现了高度的指令流水线化。RISC-II紧随 RISC-I 之后伯克利团队开发了 RISC-II它包含了更多的指令和优化证明了 RISC 架构的有效性和高性能。 3. RISC 发展和商业化 80 年代中后期RISC 架构开始被更广泛地接受和商业化。例如Sun Microsystems 开发了基于 RISC 的 SPARC 架构IBM 推出了 POWER 架构同时 MIPS 和 ARM 架构也开始流行。 4. RISC-V 的诞生 起始RISC-V 指令集是在 2010 年由加州大学伯克利分校的研究者包括 David Patterson 和其他人发起的。RISC-V 的设计目标是创建一个开放、免版税、可扩展的指令集架构旨在支持从最小的嵌入式系统到高性能计算机系统的广泛应用。开放性RISC-V 是第一个完全开源的指令集。这意味着任何人都可以使用、修改并分发 RISC-V而无需担心版权问题。发展自推出以来RISC-V 逐渐成为学术界和工业界的热点。多个组织和公司包括 Google、NVIDIA、Western Digital 等开始投资于 RISC-V 的研发。 从以上的故事里我们不难看出加州大学伯克利分校对这个RISC类型的指令集真的是非常执着一直有专门的教授和学者在研究指令集的设计思想。我目前没有搜索到关于RISC-III和RISC-IV指令集的故事也许它们是伯克利大学内部的一些研究方案没有公布出来。RISC-V 指令集是在 2010 年由加州大学伯克利分校的研究团队开发并以 BSD 开源协议发布的。这种开源发布方式允许任何人可以自由地使用、修改和重新分发 RISC-V而无需支付版税或遵循严格的许可限制这是 RISC-V 快速增长和广泛采用的一个重要因素。那么既然RISC-V指令集是伯克利大学设计和发布的使用BSD协议开源也是很合理的吧。它最大的特点和优势就是开源在此之前的流行指令集都是闭源的牢牢掌握在商业公司的手里要么就对外出售知识产权IP核心这样虽然也算是开放了但是不开源还是很难服众。而RISC-V是完全的开源且免费将吸引更多的企业入局也会加强开源生态的建设。 5、RISC-V生态的特点
这里的特点讲的不是risc-v指令集本身而是它背后的组织的特点。
RISC-V的官网
RISC-V 指令集目前由 RISC-V International 维护和推广。RISC-V International 是一个非营利性的全球性组织负责协调 RISC-V 的技术和标准发展。这个组织由来自全球的多个企业、学术机构和个人成员组成它们共同协作推动 RISC-V 架构的发展和应用。 RISC-V International 的总部最初设在美国但为了强调其全球性和独立性该组织在 2020 年将其法律和运营总部迁移到瑞士的日内瓦。这一举措旨在利用瑞士的国际中立地位更好地服务其全球会员并避免特定国家的政策影响。 虽然前面说了RISC-V是加州大学伯克利分校的教授和学者设计发布的但是它现在属于瑞士的一个非营利组织负责指定和推动RISC-V标准的制定。
以下是一些非常重视RISC-V并且能够推动和制定RISC-V标准的企业 西部数据Western Digital - 西部数据是 RISC-V 基金会的创始成员之一并且计划在其数据存储产品中广泛使用 RISC-V 处理器。公司对 RISC-V 的推动非常积极旨在利用 RISC-V 的可扩展性和开源优势来优化其产品。 谷歌Google - 谷歌对开源技术一向有着深厚的兴趣RISC-V 也不例外。谷歌已经在多个项目中考虑使用 RISC-V特别是在其自定义硬件和数据中心技术中。 英伟达NVIDIA - 又是我们的老朋友NVIDIA. NVIDIA 对 RISC-V 表示了显著的兴趣尤其是在嵌入式处理器和辅助处理器中。英伟达是 RISC-V 基金会的高级成员并参与了多个相关的开发项目。 高通Qualcomm - 作为全球领先的芯片制造商高通对 RISC-V 的支持强调了这一架构在移动和物联网设备中的潜力。高通加入了 RISC-V International参与标准化和技术发展工作。 SiFive - 作为一家专注于商业化 RISC-V 处理器和平台的领先公司SiFive 是由 RISC-V 架构的创始人之一启动的。SiFive 不仅设计 RISC-V 基础的芯片还积极参与 RISC-V 的标准化工作。 阿里巴巴 - 阿里巴巴的子公司平头哥技术有限公司已经发布了基于 RISC-V 的处理器并在其云计算和数据中心产品中使用。阿里巴巴支持 RISC-V 的发展以促进技术的创新和自主控制。平头哥的芯片确实不俗有相当的实力的。 在这些企业里面大家重点需要关注的是这个SiFIve公司它是RISC-V创始人成立的一家公司给RISC-V指令集的商业推广起到示范作用它为RISC-V体系结构提供商业化的IP核心、开发工具包和芯片解决方案。 6、RISC-V指令集的特点
1. 开源
定义RISC-V 是完全开源的指令集架构ISA意味着任何人都可以查看、使用、修改以及分发其设计而无需支付版权费用。优势这种开源特性促进了全球性的创新和合作这个特点前面讲过了我这里就不重复了。
2. 社区化
定义RISC-V 的发展由一个活跃的全球社区支撑包括学术界、工业界以及个人贡献者。优势社区化确保了 RISC-V 的设计和发展方向能够响应广泛用户的需求同时增强了技术的透明度和多样性。
3. 设计简洁
定义RISC-V 保持了 RISCReduced Instruction Set Computer架构的核心原则即提供一个简洁的指令集使得芯片设计更为简单、高效。优势简洁的设计有助于降低硬件实现的复杂性提高处理器的执行效率和易于优化。
4. 模块化
定义RISC-V 指令集支持模块化扩展允许开发者根据具体应用需求添加或定制特定的指令模块。优势模块化设计使得 RISC-V 可以灵活适应各种应用场景从嵌入式系统到高性能计算都可以通过添加专门的指令扩展来优化性能。
5. 分层设计
定义RISC-V 架构采用了分层设计方法基本指令集可以通过额外的扩展层来增强功能如浮点运算、向量处理等。优势分层设计不仅保持了核心指令集的简洁性同时也提供了高度的可扩展性和定制性。用户可以根据需要选择性地实现这些扩展以适应特定的应用需求而不必在所有实现中支持所有功能。 我之所以讲这么多故事主要是为了让大家学起来轻松一点吸引读者的阅读兴趣大家可以耐心看下去。 二、RISC-V的基础知识
虽然我前面说尽可能少去讲述risc-v的理论但是必要的基础知识还是要掌握的。这里我为了简化描述会把RISC-V简写成rv或者是RV.
RV指令集是一个现代的指令集它已经完全抛弃了对16位的支持因为现代计算机也没有16位的了嵌入式设备使用32位通用计算机使用64位。因此rv可以分为RV32和RV64,但无论是RV32还是RV64,都是32个通用寄存器我会在后面通过例子具体讲到它们的用法。架构是多少位那么对应的通用寄存器的大小就是多少位。
RISC-V体系结构有一套命名标准来描述当前CPU支持哪些指令集RISC-V是模块化、可拆卸的非常灵活。比如RV32I、RV64G、RV32IMA这样。
命名格式如下
RV[n][I/F/D/Q/M/C/A/B/E/H/K/V/P/J/T/N]
RV代表这是RISC-V指令集n代表当前指令集是几位的32位还是64位后面的是指令集模块模块含义如下表格 指令集模块名说明I基本整数指令集这是RV的基本指令集是必选的如果没有I那么这就不是RV指令集了下面的都是扩展指令集是可选的。IntegerF单精度浮点数扩展指令集FloatD双精度浮点数扩展指令集DoubleQ四倍精度浮点数扩展指令集QualM整型乘除法扩展指令集MultipleC压缩指令集CompressA原子操作指令集AtomicB位操作指令集BitE为嵌入式设计的整型指令集EmbeddedH虚拟化扩展指令集HyperK密码运算扩展指令集KeyV可伸缩矢量扩展指令集VectorP打包SIMD扩展指令集packedJ动态翻译语言JIT扩展指令集T事务内存指令集Transactional MemoryN用户态中断指令集User-Level Non-maskable Interrupts
所以当你拿到一块RV的CPU,那么这块CPU有多少斤两、有多少能力、有多少指令集的支持一眼就能看出来了你看它的命名就好了。而像x86架构的话就很麻烦还要用CPUID一组一组去测试和判断看是否支持对应的指令集关于这个CPUID如果大家感兴趣的话我可以单独开一期来讲。大家在记忆这些指令集名称的时候就根据英文去记就好了不难记。 在扩展指令集里有一个特殊的“稳定的指令集组合”用G来表示General这不是某一个指令集而是一组指令集IMAFD。
我们已经掌握了RV命名的标准现在来做几个例子
1、RV32IMAC
就意味着这是RISC-V的32位的带有通用整形支持、整形乘除法、原子指令支持、压缩指令支持的一块CPU. 2、RV64G
我们把G代进去就是RV64IMAFD,意味着这是RISC-V的64位的带有通用整形支持、整形乘除法支持、原子指令支持、单精度浮点数支持、双精度浮点数支持的CPU.
这只是一种描述方法这块CPU可以是一块真是的硬件CPU,也可以是一块虚拟出来的virt CPU,甚至还可以是工具链的配置比如写在-march选项里。总之用这种方式能简洁的描述硬件提供了或者软件使用到了哪些指令集。你需要匹配这二者否则要是执行到了不支持的指令集的的指令的话那就要引发trap了。 那我理论就讲到这里大家务必把上面我讲述的内容全部学会这个东西比较重要你在构建开发工具链和模拟器的时候需要这些参数来写配置文件的。 下面的内容大家当成是个资料简单了解一下每个指令集的实际作用 RISC-V国际基金会将持续完善至少8种可选扩展 1、B标准扩展位操作 B扩展提供位操作指令包括位字段的插入、提前和测试循环移位漏斗移位位和字节的排列计算前导0和尾随0计算置1的位数这和x86的PF标志位有点像 2、E标准扩展嵌入式 为降低低端CPU的开销RV32E减少了16个寄存器保存寄存器和临时寄存器均被拆分称0-15和16-31号两个部分。 3、H特权态架构扩展虚拟化的意思 H扩展向特权态架构添加超监管模式和第二级页式地址翻译机制意思就是一台机器上开多个虚拟机的时候有这个扩展的话运行效率将大大提升 4、J标准扩展JIT动态翻译语言 比如Java和Javascript这些编程语言都是基于动态翻译实现的如果CPU支持这个扩展的话那么运行JVM、Python解释器的效率将大大提升 5、L标准扩展十进制浮点 支持IEEE 754-2019标准所定义的十进制浮点算术运算 6、N标准扩展用户态中断 这个用户态也能直接执行中断程序了而不是“陷入内核”看起来好像很不安全但其实这个是给嵌入式设备准备的。它就是在用户态发生中断和异常的时候把控制权直接交给用户态一般来说都是会陷入内核让操作系统内核来解决这些问题。 7、Q标准扩展四倍精度浮点 这个是符合IEEE754-2019标准的128位四倍精度二进制浮点指令。如果有Q扩展出现那么F和D扩展也必然出现。 8、P标准扩展紧缩SIMD指令 加强并行计算能力投入和细分资源提升数据的并行度是用来做向量计算的要有RVV扩展的前提下使用这个扩展。这个其实有点类似显卡的能力了也许未来某一天会出现基于RISC-V架构的显卡你说是吧NVIDIA. 三、搭建RISC-V的学习环境
1、交叉编译工具链的安装 交叉编译是在一个平台宿主上生成另一个不同平台目标上运行的代码的过程。简单来说交叉编译器能在一个操作系统或硬件架构上编译程序而这些程序是为在另一个不同的操作系统或硬件架构上运行设计的。 我假设你的实验平台就是x86架构这是个人电脑的最主流指令集架构。你在x86平台上使用gcc编译器编译的c语言程序它是x86架构的只能在x86环境上运行而不是编译成RISC-V的机器码。 可以使用file命令去查看这个编译后默认生成的a.out就是x86_64架构的ABI也是x86的。也就是说你不可能把这个程序直接跑在arm或者RISC-V这些其他指令集的机器上。你需要使用专门的交叉编译的工具用这个RISC-V特色的gcc去编译生成的程序才能直接跑在RISC-V机器上。
那么我推荐的工具就是GNU的那一套gcc、gas、GNUld.我们需要把这些工具给构建出来不能通过dnf包管理器安装了。
下面我会放一些链接希望大家都能点进去看看。
RISC-V开发工具链https://github.com/riscv-collab/riscv-gnu-toolchain
这是RISC-V的官方提供的工具链当你构建好之后你就拥有了以下这些工具; 这些riscv64开头的就是RV官方的工具链。我把所有的RISC-V开发需要的工具都放置到一个目录里便于管理和使用。就在我写文章的时候我现在就把这个目录给删除然后和大家一起重新构建一套RISC-V交叉编译的工具链。假如你既需要32位的工具又需要64位的工具那么我建议你只需要编译64位的工具就好可以往下兼容的。 在正式开始构建工具之前我推荐最好创建一个用户组该用户组有权限对/opt/riscv目录进行管理然后把自己添加到这个用户组里。 sudo groupadd riscv-userssudo mkdir /opt/riscvsudo chown root:riscv-users /opt/riscvsudo chmod 755 /opt/riscvsudo usermod -a -G riscv-users april_zhao你需要把这里的april_zhao改成你当前用户的id,april_zhao是我的id,你的计算机里没有这个用户。
这个时候你可以进入到/opt/riscv目录里试图创建一个文件如果提示你没有权限创建那么你可以重启一下看看你当前这个用户登录着会影响更新。 riscv-gnu-toolcharin项目是RISC-V官方维护的项目是rv的开发工具链它很特殊它不是一个项目而是多个项目。它使用了git的子模块管理submodules它允许你将一个 Git 仓库作为另一个仓库的子目录。 大家可以看到图中有很多个这个意思就是这是子模块。这些子模块本身不是RISC-V官方工链的一部分只是官方工具链需要它们、使用到了它们于是引用它们。让它们变成子模块然后构建的时候直接用就好了很方便不需要你一次一次自己去git clone去管理自己管理很麻烦而官方来管理更加合适、对用户也好。
大家可以看到这里面有llvm,musl.这些大家有需要的可以去了解一下我这里就不使用了。
git clone gitgithub.com:riscv-collab/riscv-gnu-toolchain.git
sudo dnf install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk bison flex texinfo patchutils gcc gcc-c zlib-devel expat-devel libslirp-devel
cd riscv-gnu-toolchaingit submodule update --init
git submodule update --remote
./configure --prefix/opt/riscv --enable-multilib
make -j8
make linux -j8
此后你每一次想要进行开发工具链构建的时候都需要执行一次git submodule update --remote以更新子模块。千万不要就直接make -j8这样去运行因为git和cc1同时执行的话有概率导致构建的时候模块还没拉好会出错的。 在./configure配置期间你可以
--with-archrv32gc --with-abiilp32d
这样指定两个选项你也可以像我一样干脆不指定默认就是RV64GC.
--enable-multilib使用这个选项之后它构建出来的64位的工具是兼容32位的代码。 直接make构建出来的工具是riscv64-unknown-elf-gcc等一系列命令。
make linux构建出来的工具是riscv64-unknown-linux-gnu-gcc等一系列命令。
这二者是有区别的
前者是一个裸机编译器用于生成不依赖操作系统的代码它不包括对标准C库如 glibc的支持因为这些库通常依赖于操作系统级别的功能。它可能使用新lib一个针对嵌入式系统优化的C库或其他简化的库。后者是一个为运行Linux操作系统的RISC-V系统编译程序的编译器它支持标准的C库如 glibc这是大多数基于Linux的应用所需要的。这包括对系统调用、进程管理、文件操作等复杂操作的支持。 构建期间你的CPU使用率会“拉满”你需要等待一段时间去喝一杯咖啡回来就好了。工程量也不算大我在玩Gentoo整个系统都要自己去编译出来编译KDE桌面要消耗8个小时睡一觉醒来才能够看到结果。
如果出现构建报错的情况那样也是很正常的你可以尝试make clean然后重新执行configure和make. 你编译好之后进入这个目录这里面就存放着交叉编译的工具了。当然,你现在还不能在任意目录直接使用这些命令需要添加到环境变量里。
如果你使用的是zsh,那么就添加到~/.zshrc里或者是.bashrc /etc/bashrc这些目录里
export PATH$PATH:/opt/riscv/bin
现在你就可以执行这些命令去编译出RISC-V架构的程序了。 既然已经构建好了RISC-V的工具链我们顺便和spike模拟器和pk内核也构建一下。
以下是spike模拟器和pk内核的链接
spike模拟器https://github.com/riscv-software-src/riscv-isa-simpk内核https://github.com/riscv-software-src/riscv-pk git clone gitgithub.com:riscv-software-src/riscv-isa-sim.git
cd riscv-isa-sim/
mkdir build cd build
../configure --prefix/opt/riscv
make
make install
git clone gitgithub.com:riscv-software-src/riscv-pk.git
cd riscv-pk/
mkdir build cd build
../configure --prefix/opt/riscv --hostriscv64-unknown-elf --with-archrv64gc_zifencei
make
make install
请注意以上两个工具是需要创建单独的构建目录的而不是在原目录里进行make.
pk内核的--host选项可以是
riscv64-unknown-elf
riscv64-unknown-linux-gnu
二选一就好。 不难发现RISC-V开发工具链、spike模拟器、pk内核这三者的--prefix都放置到了/opt/riscv这个目录。大家不需要担心它们并不会起冲突不会互相覆盖对方你如果要重新构建以上工具的话只需要再一次configure、make、make install就好了不需要把原来的目录删除再重新创建。 好到现在为止咱们的环境已经搭建好了你现在已经可以跑RISC-V程序了。我再把Qemu的用户模式给大家也配置好环境。
alias qemu-riscv64qemu-riscv64 -L /opt/riscv/sysroot
此时的qemu-riscv64还不能直接运行RISC-V程序因为qemu-riscv64会尝试使用宿主机的根目录系统去找动态链接库但是你的系统本身是x86架构的根本是找不到riscv64的库因此你需要使用这个-L选项去指定到一个包含有适合 RISC-V 架构的库和链接器的目录这样才能跑起来。 如图所示.我们现在已经把RISC-V程序成功地跑起来了现在你既可以使用spike模拟器去调试和运行c程序你也可以使用qemu的用户模式去运行。是不是很开心 2、RISC-V的开发板
RISC-V指令集目前主要还是用于教学和嵌入式这样的设备虽然也有小电脑、笔记本电脑也用上了RISC-V芯片但还是非常非常小众的。RISC-V开发板目前来说从性能上来讲很难和老牌的arm嵌入式开发板一较高下不过我们主要是用于学习的不需要什么太高的性能主要是带大家去了解一下。 ①Sipeed Lichee Pi 4A
Sipeed Lichee Pi 4A 是一款紧凑型计算机性能也许优于 Raspberry Pi 4。拥有可与Raspberry Pi相比的功能。尽管它的基准测试速度在使用 Fedora 发行版时表现不佳但这块板子使用 TH1520 芯片这块芯片就是阿里平头哥的从这方面来看阿里巴巴是对RISC-V是相当重视的了理论上应有更好的性能。修复其性能可能需要更多的配置工作和系统优化。价格可以说是比较高了。
荔枝派https://wiki.sipeed.com/hardware/en/lichee/th1520/lp4a.html ②VisionFive2
VisionFive2 是另一款RISC-V开发板拥有四核处理器和8GB的RAM不同版本配置会不同。该板主要设计用于高级计算和多任务处理适用于需要高性能和多线程处理的应用。VisionFive 还提供了对高速NVMe存储的支持这是其在数据处理和操作系统性能方面的一个重要优势。 ③Longan Nano
- 这是一款非常便宜的小型开发板价格低廉。它是一个32位RISC-V板具有32kB RAM和128kB Flash包含多种GPIO引脚2x ADC, 2x DAC, RTC, I2S, I2C, SPI, U(S)ART, CAN接口并附带一个小型LCD屏幕。此板还可以通过USB进行编程非常适合初学者和爱好者在面包板上进行实验。 ④Pine64 0x64 -
这个板配有三种不同的RISC-V核心价格比较低廉支持Linux操作系统适合需要更多功能但预算有限的用户。 3、RISC-V虚拟操作系统
由于购买RISC-V开发板是有成本的因此初学者可以在虚拟机里学习RISC-V编程这是一个既无成本、计算机的性能还高的选择由于你是在高性能的x86平台开启RISC-V虚拟机那么开启的虚拟机的性能也不会太差比“高性能开发板”的性能还可以强一些。而且开发板的硬件配置是出厂就定死的固定的而虚拟机是可以调节性能和配置参数的。
我还是以Fedora跑在RISC-V上为例子
Architectures/RISC-V/Installinghttps://fedoraproject.org/wiki/Architectures/RISC-V/Installing这是Fedora官方的文档它大致提供了两种使用Qemu跑Fedora的方法大家听我一一道来。 ①使用virsh来管理虚拟机我不推荐这种做法
mkdir -p ~/.config/virt-builder/repos.d/
cat EOF ~/.config/virt-builder/repos.d/fedora-riscv.conf
[fedora-riscv]
urihttps://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/index
EOF你可以直接复制粘贴去执行本质就是创建一个目录然后在这个目录里创建一个配置文件把Fedora RV的镜像源给添加进来这样方便管理。
virt-builder --list | grep riscv64 这是你添加的镜像源里有的镜像你可以挑选其中一个。不建议你选择最后两个。
选择好你要的镜像之后复制它的名字比如fedora-rawhide-minimal-20200108.n.0把它记录下来我们一会儿要用到。其中developer的是“开发者”镜像它包含更多的rpm包也自带一些图形桌面的包而minimal是“最小化”的镜像它只会自带必要的rpm包开发工具什么的你也必须自己单独安装。
virt-builder \
--arch riscv64 \
--size 50G \
--format qcow2 \
--output fedora-rawhide-minimal-20200108.n.0.qcow2 \
fedora-rawhide-minimal-20200108.n.0
通过virt-builder命令可以自动下载镜像并进行配置--arch是指定指令集--size是把下载下来的镜像扩展到的尺寸这里的50GB是我自己设置的实际上根本不需要这么大--format是把下载好的镜像转换成什么样的格式我这里选择了qcow2是因为我喜欢这个格式它具有更多良好性质你可以换成其他格式默认使用的raw裸盘也可以--output是最终输出的文件你需要把拓展名跟上去。最后的是我之前让你复制的镜像名字。第一次下载会消耗一点时间请大家耐心等待第一次下载好之后它会缓存起来当你第二次执行的时候就不会重复去下载了。 实际上你第一次执行后就会在这个目录里放置缓存文件所以你第二次执行的的时候就不会真的去下载了而是在这个目录里找。如果你需要使用了你可以把这个目录里的缓存文件给删除掉防止占用过多的磁盘空间。你也可以看见这个镜像的大小也就是424MB而已我上面给它50GB属实是有点过多了你自己看磁盘空闲情况去调节这个大小吧。 这就是执行后的样子这里大家一定要注意一下在构建结束的时候它会自动生成一个root密码然后告诉你你千万不要直接clear把屏幕清理掉而是要把这个root密码记下来否则的话你的镜像都白下载和构建了。
最终出现镜像fedora-rawhide-minimal-20200108.n.0.qcow2之后我们还需要去下载一个elf文件这个 .elf 文件是一个预先编译好的 U-Boot 启动加载器用于在仿真环境中初始化并启动操作系统。
elf文件下载地址https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/ 你需要下载你所选择的镜像对应的elf,你去对比一下文件名就好了。比如我们这个例子你就需要下载红色框里的elf,上面的是elf文件下面的是校验文件校验文件你也可以不下载。
virt-install \
--qemu-commandline-bios none \
--name fedora-riscv \
--arch riscv64 \
--vcpus 8 \
--memory 4096 \
--os-variant fedora33 \
--boot kernelFedora-Minimal-Rawhide-20200108.n.0-fw_payload-uboot-qemu-virt-smode.elf \
--import --disk pathfedora-rawhide-minimal-20200108.n.0.qcow2 \
--graphics none根据你的实际情况使用virt-install命令去安装这个虚拟机。你只需要把--boos kernel和--import --disk path这两个参数给填写成你的实际情况就好了。
当你执行这条命令之后就会自动启动和注册虚拟机然后你把虚拟机关闭之后如果想要再次开启就不需要重复执行virt-install了你可以使用virsh命令去管理开启、关闭、中断虚拟机等操作你还可以使用Red Hat开发的Cockpit工具更加方便地管理虚拟机。 当你注册好虚拟机之后以后的操作就可以在Web页面进行控制而不需要再使用命令行当然很多时候命令行也是非常高效的。 虚拟机启动之后你会进入到如下页面。
它要求你进行登陆用户就是root 密码就是它自动生成的那个字符串之前让你复制下来了。 我们现在已经正式进入了RISC-V的时代大家还记得之前学的命名方式吧这是一个RISC-V的64位的有基础整形支持、整形乘除法支持、原子指令支持、单双精度浮点数支持、指令压缩、指针压缩等一系列指令集支持的这么一个环境。除了前面已经讲到过的指令集之外还有一些其他指令的能力也出现在了这里
zic64b表示支持64位0/1压缩Zero/One compressed指令。zicbom表示支持指令布局优化Instruction Compression Opcode Mapping。zicbop表示支持指令操作优化Instruction Compression Operand Packing。zicboz表示支持指令零/零优化Instruction Compression Zero/Zero Optimization。ziccamoa表示支持指令压缩的AMOAtomic Memory Operations and Memory Access。ziccif表示支持指令压缩的条件分支Conditional Instruction Compression with Forwarding。zicclsm表示支持指令压缩的Load/Store Merge。ziccrse表示支持指令压缩的Register Stack Engine。zicntr表示支持指令压缩的Next-Thread Register。zicsr表示支持指令压缩的Control and Status Register。zifencei表示支持指令压缩的Fence Instruction。zihintntl表示支持指令压缩的Hint and Intent Instructions。zihintpause表示支持指令压缩的Hint and Pause Instructions。zihpm表示支持指令压缩的Hardware Performance Monitors。za64rs表示支持64位Zero-Width Assertions。zawrs表示支持64位Wide Assertions。zfa表示支持指令压缩的Floating-Point Accumulator。zca表示支持指令压缩的Carry.zcd表示支持指令压缩的Divide.zba表示支持指令压缩的Barrel shifter.zbb表示支持指令压缩的Bitfield Instructions.zbc表示支持指令压缩的Bytecode.zbs表示支持指令压缩的Byte Swap.ssccptr表示支持指令压缩的Supervisor-Scoped Counter.sscounterenw表示支持指令压缩的Supervisor-Scoped Counter Enable Write.sstc表示支持指令压缩的Supervisor Scratchpad.sstvala表示支持指令压缩的Supervisor Trap Value Address.sstvecd表示支持指令压缩的Supervisor Trap Vector Dispatch. 但是大家千万不要高兴的太早由于Fedora官方提供的这个镜像是2020年的距离现在2024已经过去很久了这里面原装的rpm包是非常古老的你需要一个“大换血”这样才能正常使用。
此时如果你觉得自动生成的root密码太麻烦、太复杂你可以直接使用passwd命令换一个密码。
rpm --rebuilddb
dnf install neofetch
现在这个镜像的rpm包环境是非常恶劣正是因为这么恶劣所以我更加推荐你使用下面的方法2的依赖也许都已经破坏掉了你需要重建这个数据库否则的话你一更新就滚挂了。现在你千万不要、千万不要直接运行dnf update. 在成功安装neofetch之后你还需要按照dnf命令给你的提示再一次执行rpm --rebuilddb总之这里面情况复杂你需要根据输出的日志再做判断。根据我的实践来说只要你不去更新内核想保住这个虚拟机还是很有希望的。
不管你是否能够解决这个依赖问题都千万不要去更新kernel版本否则的话这个虚拟机你再也进不去了除非你重新创建。如果你在意kernel版本请查看第二种方法。
在关闭虚拟机的时候你可以在虚拟机的命令行里使用init 0/shutdown now/halt命令关机你也可以用virsh或者cockpit来关机。 开机的时候你可以在cockpit里直接点击 也可以
virsh start fedora-riscv
开机之后你打开终端然后
virsh console fedora-riscv
这样就能重新进入虚拟机环境了。其中fedora-riscv是你在virt-install的时候指定的虚拟机的名字。 无论是第一种还是第二种方法创建的虚拟机里客户机系统都是可以直接联网的只要你的主机能联网不需要你做什么配置。 ②直接使用Qemu命令直接创建虚拟机
我更加推荐这种方法这样可以随意更新内核而且它发布的镜像离现在更近rpm包依赖也没有损坏。这就涉及到我前面提到过的SIfive公司了。 它貌似是SIfive公司提供的原来是为开发板准备的Fedora镜像现在移植到了Qemu平台也许刚反过来在Qemu调试好之后再移植到开发板上。不管是怎样我们都能通过这个镜像直接使用较为新版本的Fedora RV了。
镜像下载地址https://dl.fedoraproject.org/pub/alt/risc-v/disk_images/Fedora-Developer-38-20230519.n.0.SiFive.Unmatched.and.QEMU/ 你需要下载如图所示的这几个文件然后xz -d解压它们。 也许是冷门资源的原因这个镜像的下载速度是非常非常慢的请大家耐心等待亿点点时间。这段时间内你可以去看看RISC-V的中文手册了。虚拟机配置好之后就要实际去做RISC-V的编程了。 qemu-system-riscv64 \
-bios Fedora-Developer-38-20230519.n.0-u-boot-spl.bin \
-nographic \
-machine virt \
-smp 8 \
-m 4G \
-device loader,fileFedora-Developer-38-20230519.n.0-u-boot.itb,addr0x80200000 \
-object rng-random,filename/dev/urandom,idrng0 \
-device virtio-rng-device,rngrng0 \
-device virtio-blk-device,drivehd0 \
-drive fileFedora-Developer-38-20230519.n.0-qemu.raw.img,formatraw,idhd0 \
-device virtio-net-device,netdevusernet \
-netdev user,idusernet,hostfwdtcp::10000-:22
然后使用Qemu的system mode运行 -bios Fedora-Developer-38-20230519.n.0-u-boot-spl.bin
指定 BIOS 文件这是虚拟机启动时首先加载的基本输入输出系统这里是u-boot。 -nographic
这个选项告诉 QEMU 不使用图形界面所有的输出都通过控制台进行。 但实际上这个镜像本身是有桌面环境GNOME的你想使用的话也行不过你会觉得很卡就是了除非你的宿主机CPU很强。 -machine virt
指定虚拟机使用的机器类型。在这里virt 是一个适用于 QEMU 的通用虚拟化平台适合于各种客户端和服务端。 -smp 8
设置虚拟 CPU 的数量这里是 8 个虚拟 Hart。Hart是硬件线程的意思 -m 4G
为虚拟机分配的内存大小这里是 4 GB。实际上不带图形界面的话占用的内存是很小的4GB完全足够了 -device loader,fileFedora-Developer-38-20230519.n.0-u-boot.itb,addr0x80200000
这个选项用于加载 U-Boot Image Tree BlobITB文件到虚拟机的指定内存地址0x80200000。 -object rng-random,filename/dev/urandom,idrng0
创建一个随机数生成器对象使用 Linux 系统的 /dev/urandom 设备作为源为虚拟机提供高质量的随机数。 -device virtio-rng-device,rngrng0
将上面创建的随机数生成器对象添加到虚拟机中作为一个设备。 -device virtio-blk-device,drivehd0
添加一个 virtio 块设备到虚拟机这通常用于硬盘驱动。 -drive fileFedora-Developer-38-20230519.n.0-qemu.raw.img,formatraw,idhd0
指定虚拟硬盘的映像文件和格式。这里使用的是 raw 格式的 Fedora 镜像id 为 hd0与上一个命令中的块设备关联。 -device virtio-net-device,netdevusernet
添加一个 virtio 网络设备连接到名为 usernet 的网络设备。 -netdev user,idusernet,hostfwdtcp::10000-:22
创建一个用户模式的网络后端名为 usernet并设置端口转发将宿主机的 10000 端口转发到虚拟机的 22 端口通常是 SSH 服务端口。大家请记住这个特点可以用来ssh连接。 下载下来的img文件默认是raw格式你可以使用qemu-img命令把它给改成qcow2格式,如果你更改了磁盘格式后面的format记得也要跟着更改。同样地如果你觉得12GB是不够大的你也可以使用qemu-img resize进行磁盘容量的扩展。
qemu-img convert -f raw -O qcow2 Fedora-Developer-38-20230519.n.0-qemu.raw.img Fedora-Developer-38-20230519.n.0-qemu.qcow2.img
qemu-img resize Fedora-Developer-38-20230519.n.0-qemu.qcow2.img 30Gqemu-system-riscv64 \
-bios Fedora-Developer-38-20230519.n.0-u-boot-spl.bin \
-nographic \
-machine virt \
-smp 8 \
-m 4G \
-device loader,fileFedora-Developer-38-20230519.n.0-u-boot.itb,addr0x80200000 \
-object rng-random,filename/dev/urandom,idrng0 \
-device virtio-rng-device,rngrng0 \
-device virtio-blk-device,drivehd0 \
-drive fileFedora-Developer-38-20230519.n.0-qemu.qcow2.img,formatqcow2,idhd0 \
-device virtio-net-device,netdevusernet \
-netdev user,idusernet,hostfwdtcp::10000-:22执行后会输出一大堆Qemu的日志虚拟机启动成功之后会进入这个界面和方法1一样也是直接用root登陆只是密码不是随机生成的字符串而是一个固定的密码“fedora_rocks!”就在前面的日志里。
进去之后你可以直接修改root密码然后执行rpm --rebuilddb 你可以进入/etc/yum.repo.d 这里面有一个仓库是fedora-riscv-koji.repo默认情况下是关闭的你可以打开它其他仓库不建议你打开有可能会404。 这里面通常带有最新构建的rpm包。 至此跑在RISC-V架构上的虚拟机已经安装好了。 这里你需要注意的是当你在虚拟机里执行clear命令的时候字符并不是直接删除掉了而仅仅是把屏幕往上推当你用鼠标滚轮往上面滚动的时候前面的东西还是会出现的。 虚拟机对宿主机的CPU占用通常都是小于200%基本上是不会导致你的主机卡顿的如果你的主机卡顿了并且Qemu的CPU占用率超过了600%那你直接在宿主机上使用kill命令强制结束Qemu进程吧这时候已经不正常了。如果你在虚拟机里不执行任何命令那么主机上的Qemu进程的CPU占用率甚至不会超过20%你一直挂着也是没问题的。 通常来说都是网络和IO的消耗在虚拟机里进行磁盘读写会比较慢大家需要忍耐一下。在安装好系统的第一次dnf update需要比较久的时候你可以把主机一直挂在那里可能要个把小时。
同样地你使用第二种方式创建的虚拟机在虚拟机内部使用关机命令就好最好不要直接kill掉qemu进程除非长久地无法正常启动。 大家可以看见这就是用Qemu system mode直接跑的好处。它非常地类似x86平台的grub你更新内核之后他会提供给你用哪一个内核进入的选项而不是直接无法进入OS.默认是选用最新的内核进入。 qemu-system-riscv64 \
-bios Fedora-Developer-38-20230519.n.0-u-boot-spl.bin \
-display gtk \
-machine virt \
-smp 8 \
-m 4G \
-device loader,fileFedora-Developer-38-20230519.n.0-u-boot.itb,addr0x80200000 \
-object rng-random,filename/dev/urandom,idrng0 \
-device virtio-rng-device,rngrng0 \
-device virtio-blk-device,drivehd0 \
-drive fileFedora-Developer-38-20230519.n.0-qemu.raw.img,formatraw,idhd0 \
-device virtio-net-device,netdevusernet \
-netdev user,idusernet,hostfwdtcp::10000-:22
如果你想试试开启图形界面你可以这样写配置然后就会出现一个gtk风格的qemu窗口默认还是命令行进入你可以试图修改配置以启动xinit.
关机方法和前面一样也是可以在虚拟机里使用init 0/shutdown now/halt/poweroff等命令 在输出日志后会把终端归还给运行qemu命令的shell. 经过观察根目录所处的磁盘就是你下载下来的那个文件在虚拟机里抽象成了一个虚拟磁盘/dev/vda. 其中/boot分区有2.1GB,大家不需要担心更新内核的时候/boot分区容量会不够的问题。使用Qemu方法直接启动的Fedora RV是可以更新和删除内核的你更新内核之后重启并进入新内核然后就可以是用dnf包管理器把旧内核给remove 就和你在x86平台使用Fedora是一样的。 现在我们已经处于虚拟环境了 我们再一次写这个最简单的hello.c程序使用RISC-V的原生gcc编译器编译hello,c
执行后成功打印了Hello World!那么这就代表着我们在RV的“原生”机器上跑了第一个RISC-V程序。是不是和第一个写c语言程序在屏幕输出一行开心 由于从网络上下载下来的raw格式磁盘的大小本身只有12GB,其实是挺小的压根就不够用你需要对它进行扩展。在进行虚拟磁盘文件扩展之前你需要关闭虚拟机。
qemu-img resize Fedora-Developer-38-20230519.n.0-qemu.raw.img 40G
我这里暂时先设定为40GB吧一般来说也足够了。
然后启动虚拟机并执行一下命令。
parted /dev/vda
resizepart 2 100%
quit
partprobe
resize2fs /dev/vda2
partprobe [rootfedora-riscv ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs tmpfs 779M 400K 778M 1% /run /dev/vda2 ext4 28G 7.0G 21G 26% / /dev/vda1 ext4 1.9G 49M 1.8G 3% /boot tmpfs tmpfs 1.9G 0 1.9G 0% /tmp tmpfs tmpfs 390M 16K 390M 1% /run/user/0 [rootfedora-riscv ~]# parted /dev/vda GNU Parted 3.5 Using /dev/vda Welcome to GNU Parted! Type help to view a list of commands. (parted) resizepart 2 100% Warning: Partition /dev/vda2 is being used. Are you sure you want to continue? Yes/No? y (parted) quit Information: You may need to update /etc/fstab. [rootfedora-riscv ~]# partprobe [rootfedora-riscv ~]# resize2fs /dev/vda2 resize2fs 1.46.5 (30-Dec-2021) Filesystem at /dev/vda2 is mounted on /; on-line resizing required old_desc_blocks 4, new_desc_blocks 5 The filesystem on /dev/vda2 is now 9961463 (4k) blocks long. [rootfedora-riscv ~]# partprobe [rootfedora-riscv ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs tmpfs 779M 396K 778M 1% /run /dev/vda2 ext4 38G 7.0G 31G 19% / /dev/vda1 ext4 1.9G 49M 1.8G 3% /boot tmpfs tmpfs 1.9G 0 1.9G 0% /tmp tmpfs tmpfs 390M 16K 390M 1% /run/user/0 [rootfedora-riscv ~]# 可以看见现在根目录的占用只有19%已经不再拮据了。 如果你觉得使用qemu进程提供的默认终端执行命令觉得很不舒服你可以使用ssh连接你的虚拟机这样用起来体验会好很多。
首先在虚拟机里打开你的sshd的配置文件
vim /etc/ssh/sshd_config 把允许密码登陆改成yes,把前面的#注释符号给删除。 你可以设置成允许以root用户登陆。
然后重启sshd服务.
systemctl restart sshd 现在你的虚拟机已经允许被ssh连接了你现在打开你的主机的终端。
sudo ssh -p 10000 rootlocalhost
这样就可以以root的身份登陆进虚拟机由于我们将宿主机的 10000 端口转发到虚拟机的 22 端口因此你直接用ssh连接到本地的10000端口即可。
最终效果如下 左上角是qemu进程提供的tty,右下角是ssh连接产生的终端。现在你可以开启多个终端进行多任务操作了。 ③使用virt图形界面管理 前面的方法高度依赖命令行如果你想偷懒可以用图形管理界面。 既然有图形的管理界面了这个大家就自己去探究吧。 三、RISC-V编程初体验
好了我们可以进入正题了现在我们有四种方法运行RISC-V的程序了。
在x86设备上使用Spike模拟器pk内核在x86设备上使用qemu-riscv64在RISC-V架构的开发板上直接运行程序在x86设备上使用Qemu的system mode虚拟出一个Linux,在虚拟环境里直接运行RV程序 我们之前已经运行了第一个RV程序只是这个c程序实在是简单我们好像看不出花样来那么先体验一下真正的RV汇编然后我再把更多的基础知识教给大家。
gcc -S hello.c -o hello.S 这就是RV汇编的初体验了从上图不难注意到在main函数里有很多的汇编指令有addi,sd,mv,ld这么多呢除了这些汇编指令我们还能注意到s0,a0,ra,这些就是RISC-V的通用寄存器了。不过不要着急我会在后面一一讲到。
我们先来完成在RISC-V设备上的第一个RV汇编程序。新建一个文本文件stop.S
.global _start
_start:
stop:j stop
as stop.S -o stop.o
ld stop.o -o stop
./stop 这是最简单的一个汇编程序就是不停地执行j stop循环下去它不会退出程序。 [rootfedora-riscv c]# cat atomic.c #include stdio.h int main(void) { long atomic 2; asm volatile( mv a5,%1 \n\t lr.d t0,(a5) \n\t slli t0,t0,1 \n\t sc.d t0,t0,(a5) \n\t :m(atomic) :r(atomic) :t0,a5,memory ); printf(atomic %d\n,atomic); return 0; } [rootfedora-riscv c]# gcc atomic.c -o atomic [rootfedora-riscv c]# ./atomic atomic 4 RISC-V汇编也比x86要轻松许多大家跟着我写熟练了就不用害怕写汇编了。 文章篇幅比较长我会把对RV的新的思考放在我的下一篇文章里。