从零开始的RISC-V模拟器开发(一)环境搭建

前言

博主这系列文章是跟随中科院吴伟老师的b站公开课:[完结]从零开始的RISC-V模拟器开发·第一季·2021春季_哔哩哔哩_bilibili 记录的笔记。仅供学习使用,侵删!

苦逼的博主现在自己毕设也是要设计类似的东西。哎。我需要做的是给一个现成的 RISC-V 模拟器作 RVF 扩展。还是挺没有体系的,决定还是来看看课学习一下。

介绍

模拟器:在计算机上模拟真实环境或者假想的运行场景来学习系统工作的方式。比如虚拟开发板。

Spike, Qemu 是 RISC-V 比较成熟的模拟器。本次课程也是围绕这两种主流方式进行模拟。

课程需要的环境是 RISCV GNU toolchain 和 Nuclei RISC-V toolchain。测试环境比如 riscv tools,nuclei SDK 等。

交叉工具链中 Build 是程序构建时的系统(本机),Host 是程序要运行的系统,Target 是要构建的程序的输出的对应架构。

riscv 工具链可以跟随汪辰老师操作系统课程安装,步骤非常清晰。

nuclei 工具链我在安装过程中出了一些问题,我也不能保证说帮读者一定能解决这些问题。我说一下我个人和官方老师沟通后的一些安装建议吧……

需要安装的软件下载链接说明安装建议检验成功安装
riscv-gnu-toolchainriscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC (github.com)编译 riscv 架构可运行程序不要 --recursive 克隆,会变得不幸。每个外链仓库分别手动克隆riscv64-unknown-linux-gnu-gcc -v
riscv-toolsriscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCC (github.com)执行 riscv 架构可执行程序同上.
编译安装 fevsr 和 spike
spike -h
nuclei-riscv-toolchain芯来工具链_专业RISC-V处理器IP及解决方案公司 (nucleisys.com)芯来的工具链2023 以后版本程序名称改为和 riscv-gnu-toolchain 里一样的 riscv64-unknown-elf-gcc,而之前版本的工具链名称为 riscv-nuclei-elf-gcc。我建议学习此课程使用 2022.10 版本工具链, 下载速度有些慢,可以使用我下载下来的工具链:
链接:https://pan.baidu.com/s/1jIZvawmb4Oz7PsOXBclOFw?pwd=4lye
提取码:4lye
riscv-nuclei-elf-gcc -v
nuclei sdkNuclei-Software/nuclei-sdk: Nuclei RISC-V Software Development Kit (github.com)用于评估开发板/软件riscv-nuclei-elf-gcc 相应的 sdk 使用 9369a3a 版本。如果使用23年以后的芯来工具链,就不用切换版本。make CORE=n600 PROGRAM=baremetal/demo_eclic all

Spike

针对 RV 的轻量级 ISA 模拟器。其代码包含在 riscv-tools/riscv-ism-sim 中。

1700576208373

processor 是核心硬件。

cache 只是统计功能使用,统计命中率,并不会真正加速(毕竟这是模拟器)。

spike 对于新扩展支持比较全面,MDFV 都有。

查看 spike 使用帮助:

$ spike -h
Spike RISC-V ISA Simulator 1.1.1-dev

usage: spike [host options] <target program> [target options]
Host Options:
  -p<n>                 Simulate <n> processors [default 1]
  -m<n>                 Provide <n> MiB of target memory [default 2048]
  -m<a:m,b:n,...>       Provide memory regions of size m and n bytes
                          at base addresses a and b (with 4 KiB alignment)
  -d                    Interactive debug mode
  -g                    Track histogram of PCs
  -l                    Generate a log of execution
  -s                    Command I/O via socket (use with -d)
  -h, --help            Print this help message
  -H                    Start halted, allowing a debugger to connect
  --log=<name>          File name for option -l
  --debug-cmd=<name>    Read commands from file (use with -d)
  --isa=<name>          RISC-V ISA string [default RV64IMAFDC_zicntr_zihpm]
  --pmpregions=<n>      Number of PMP regions [default 16]
  --pmpgranularity=<n>  PMP Granularity in bytes [default 4]
  --priv=<m|mu|msu>     RISC-V privilege modes supported [default MSU]
  --varch=<name>        RISC-V Vector uArch string [default vlen:128,elen:64]
  --pc=<address>        Override ELF entry point
  --hartids=<a,b,...>   Explicitly specify hartids, default is 0,1,...
  --ic=<S>:<W>:<B>      Instantiate a cache model with S sets,
  --dc=<S>:<W>:<B>        W ways, and B-byte blocks (with S and
  --l2=<S>:<W>:<B>        B both powers of 2).
  --big-endian          Use a big-endian memory system.
  --misaligned          Support misaligned memory accesses
  --device=<name>       Attach MMIO plugin device from an --extlib library
  --log-cache-miss      Generate a log of cache miss
  --log-commits         Generate a log of commits info
  --extension=<name>    Specify RoCC Extension
                          This flag can be used multiple times.
  --extlib=<name>       Shared library to load
                        This flag can be used multiple times.
  --rbb-port=<port>     Listen on <port> for remote bitbang connection
  --dump-dts            Print device tree string and exit
  --dtb=<path>          Use specified device tree blob [default: auto-generate]
  --disable-dtb         Don't write the device tree blob into memory
  --kernel=<path>       Load kernel flat image into memory
  --initrd=<path>       Load kernel initrd into memory
  --bootargs=<args>     Provide custom bootargs for kernel [default: console=ttyS0 earlycon]
  --real-time-clint     Increment clint time at real-time rate
  --triggers=<n>        Number of supported triggers [default 4]
  --dm-progsize=<words> Progsize for the debug module [default 2]
  --dm-sba=<bits>       Debug system bus access supports up to <bits> wide accesses [default 0]
  --dm-auth             Debug module requires debugger to authenticate
  --dmi-rti=<n>         Number of Run-Test/Idle cycles required for a DMI access [default 0]
  --dm-abstract-rti=<n> Number of Run-Test/Idle cycles required for an abstract command to execute [default 0]
  --dm-no-hasel         Debug module supports hasel
  --dm-no-abstract-csr  Debug module won't support abstract CSR access
  --dm-no-abstract-fpr  Debug module won't support abstract FPR access
  --dm-no-halt-groups   Debug module won't support halt groups
  --dm-no-impebreak     Debug module won't support implicit ebreak in program buffer
  --blocksz=<size>      Cache block size (B) for CMO operations(powers of 2) [default 64]

比较重要的:

p:处理器个数。

m:内存空间大小。

isa:指定指令集(rv32 rv64)。

pc:入口地址。

varch:向量长度。

ic id l2:设置缓存信息,当然起不到加速作用。

extension:扩展。

extlib:添加链接外部库的扩展。添加后 isa 选项可以添加外部库中包含的新指令集。

device:从 extlib 库中附加MMIO插件设备。

-l:生成日志文件。

log-cache-miss:生成缓存命中日志文件。

dump-dts:输出设备树字符串。

g:pc 的跟踪直方图。

d:交互式调试。

rbb-port=<port>:openOCD+gdb 调试。

qemu

spike 是轻量级 CPU,重点在于模拟不同 CPU 如何运行这个程序,针对目标文件;qemu 重点在于模拟不同 CPU,比如 IO 总线 等模拟。

qemu 主要包含两种模式,用户模式类似 spike,即用特定架构去模拟运行程序。系统模式则是模拟出一整个架构硬件环境。

其代码包含在 riscv-gnu-toolchain 中。编译构建推荐大家看这篇博主文章:

Ubuntu20.04搭建RISC-V和qemu环境-CSDN博客

image-20231125011630809

# 查看用户态支持的 CPU 和系统态支持的机器
$ qemu-riscv32 -cpu help
any
lowrisc-ibex
rv32
sifive-e31
sifive-e34
sifive-u34
$ qemu-system-riscv32 -M ?
Supported machines are:
none                 empty machine
opentitan            RISC-V Board compatible with OpenTitan
sifive_e             RISC-V Board compatible with SiFive E SDK
sifive_u             RISC-V Board compatible with SiFive U SDK
spike                RISC-V Spike board (default)
virt                 RISC-V VirtIO board

image-20231125012132439

image-20231125012146382

后面对于 linux 构建,还需要 nuclei-linux-sdk 和 linux 的下载,这里我就先不弄了,环境也忒麻烦了。

image-20231125012617068

下节课先学一下 Spike 的 CPU 模拟吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

歌曲《难不难》由歌手荆涛演唱:面对挑战,勇敢前行

在人生的旅途中&#xff0c;我们都会遭遇种种困难和挑战。有时&#xff0c;一个看似简单的创意或想法&#xff0c;想要实现它却需要经历无数次的实践和辛酸。歌曲《难不难》由歌手荆涛演唱&#xff0c;以平实的语言和流畅的旋律&#xff0c;表达了面对困难和挑战时&#xff0c;…

01 _ 高并发系统:它的通用设计方法是什么?

我们知道&#xff0c;高并发代表着大流量&#xff0c;高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案&#xff0c;从而抵抗巨大流量的冲击&#xff0c;带给用户更好的使用体验。这些方案好似能操纵流量&#xff0c;让流量更加平稳地被系统中的服务和组件…

用友NC word.docx接口存在任意文件读取漏洞 附POC

@[toc] 用友NC word.docx接口存在任意文件读取漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使…

多线程详解(未完结)

文章目录 ⭐️写在前面的话⭐️一、线程简介1.1 进程1.2 线程1.3 多线程和多进程的区别1.4 总结 二、继承实现2.1 继承Thread类例子&#xff1a;网图下载 2.2 实现Runnable接口 (推荐)案例&#xff1a;火车站买票问题案例&#xff1a;龟兔赛跑 2.3 实现Callable接口 (了解即可)…

虚拟机可ping树莓派树莓派无法ping虚拟机 的解决办法

问题描述 在学习交叉编译的过程中&#xff0c;发现了树莓派无法ping通虚拟机的问题。所以我尝试了各种ping&#xff0c;发现&#xff1a; 虚拟机可以ping通树莓派和主机树莓派可以ping通主机主机可以ping通树莓派和虚拟机唯独树莓派没法ping通虚拟机 尝试各种方法后找到一种…

突破技术障碍:软件工程师如何应对项目中的难题?

在软件开发项目中&#xff0c;工程师常常会遇到各种技术难题。这些难题可能涉及到复杂的算法、不兼容的系统、难以预见的软件行为&#xff0c;或者其他许多方面。 以下是一些策略和方法&#xff0c;可以帮助软件工程师有效地应对这些挑战&#xff1a; 1、理解问题&#xff1a;…

王道p150 14.假设二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树 b的宽度(即具有结点数最多的那一层的结点个数) (c语言代码实现)

采用层次遍历的方法求出所有结点的层次&#xff0c;并将所有结点和对应的层次放在一个队列中。然后通过扫描队列求出各层的结点总数&#xff0c;最大的层结点总数即为二叉树的宽度。 /* A B C D E F …

下一代图片压缩格式 AVIF

长期以来我们都在为了在网络上使用什么样的图片格式而进行纠结。我们所熟知的或者运用到 Web 应用中的图片格式无非就是 PNG、JPG、GIF、SVG 或者 WebP。 HEIC是一种图像格式&#xff0c;上线时间还比较短&#xff0c;只有4年左右。 自iOS 11和 macOS High Sierra&#xff08…

GPS 定位信息获取(北斗星通 GPS)

GPS 定位信息获取&#xff08;1&#xff09; 首先回顾北斗星通 GPS 数据获取&#xff08;1&#xff09;~&#xff08;5&#xff09; gps_pub.cpp 将接收到的串口数据转化为GPS的经纬度信息gps_path.cpp 将经纬度信息转化为全局坐标系下的XY值&#xff0c;以第一个GPS经纬度为…

快递批量查询高手软件,让你轻松掌握多家快递物流信息,提升工作效率

随着电子商务的繁荣和智能化物流的普及&#xff0c;快递行业在全球范围内迅速发展。在这个快节奏的时代&#xff0c;为了提高工作效率并更好地管理物流信息&#xff0c;一款强大的工具——快递批量查询高手软件应运而生。这款软件可以让你轻松掌握多家快递公司的物流信息&#…

C++ 实现位图

引出 面试题&#xff1a;给出 40 亿个不重复的无符号整数&#xff0c;没有排过序。给定一个无符号整数&#xff0c;如何快速判断这个数是否在这 40 亿个无符号整数中。[ 腾讯面试题 ] 想法一&#xff1a;将 40 亿个数据存放到 set 里面&#xff0c;然后再查找指定的无符号整数。…

PyCharm 安装插件Vue

一、打开PyCharm工具 File -> Settings -> Plugins 二、在项目中添加Vue.js的依赖项。 npm install vue 三、页面应用

Innux(特殊位与权限)

特殊位与权限 目录&#xff1a; 1. SUID 2. SGID 3. SBIT 4. 文件系统属性chattr权限 5. 管理员权限sudo 1. SUID 1.1 什么是SUID SUID只对二进制可执行文件才有效&#xff08;文件必须具备x权限&#xff09; 执行者对该程序有 x 权限 当前程序拥有SUID时&#xff0…

MySQL性能优化,SQL调优,SQL调优的手段

文章目录 对MySQL性能的优化的理解硬件和操作系统层面的优化架构设计层面的优化MySQL程序配置优化SQL优化 SQL调优有哪几种方式1.EXPLAIN2.SQL语句中IN包含的值不应过多3.SELECT语句务必指明字段名称4.当只需要一条数据的时候&#xff0c;使用limit 15.如果排序字段没有用到索引…

android系统新特性——用户界面以及系统界面改进

用户界面改进 Android用户界面改进最明显的就是MD了。MD是Google于2014年推出的设计语言&#xff0c;它是一套完整的设计系统&#xff0c;包含了动画、样式、布局、组件等一系列与设计有关的元素。通过对这些行为的描述&#xff0c;让开发者设计出更符合目标的软件&#xff0c…

Percepio Tracealyzer 4.8.1 视觉跟踪诊断解决方案

Percepio Tracealyzer 4.8.1 视觉跟踪诊断解决方案&#xff0c; 是使嵌入式软件开发人员能够深入了解其运行时系统。这样可以更轻松地调试系统级问题、查找软件设计缺陷以及测量软件时序和资源使用情况。确保您的代码可靠、高效且响应迅速。 视觉运行时洞察 在运行时将 X 射线视…

计算器的模拟实现

计算器的模拟实现 一、实验题目&#xff1a;计算器二&#xff1a;实验目的&#xff1a;三&#xff1a;实验内容与实现1&#xff1a;【实验内容】2&#xff1a;【实验实现】1.计算器界面的实现&#xff0c;如下图所示&#xff1a;2&#xff1a;各项功能的实现&#xff0c;如下图…

Linux常用命令——bg命令

在线Linux命令查询工具 bg 用于将作业放到后台运行 补充说明 bg命令用于将作业放到后台运行&#xff0c;使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号&amp;的效果是相同的&#xff0c;都是将其放到系统后台执行。 在Linux系统中执行某些操作时候&…

基于YOLOv5的视频计数 — 汽车计数实现

在视频中计数对象可能看起来有挑战性&#xff0c;但借助Python和OpenCV的强大功能&#xff0c;变得令人意外地易于实现。在本文中&#xff0c;我们将探讨如何使用YOLO&#xff08;You Only Look Once&#xff09;目标检测模型在视频流或文件中计数对象。我们将该过程分解为简单…

HCIA题目解析(1)

1、【多选题】关于动态 MAC 地址表说法正确的是&#xff1f; A、通过报文中的源MAC地址学习获得的动态MAC表项会老化 B、通过查看指定动态MAC地址表项的个数&#xff0c;可以获取接口下通信的用户数 C、在设备重启后&#xff0c;之前的动态表项会丢失 D、在设备重启后&…