NEMU模拟器源码编译与使用

news2024/11/24 15:20:49

NEMU模拟器源码编译与使用

  • 1 NEMU介绍
  • 2 NEMU编译
  • 3 NEMU使用
    • 3.1 下载MySBI+BenOS
    • 3.2 使用riscv64-benos_defconfig编译NEMU
    • 3.3 编译MySBI+BenOS
    • 3.4 运行MySBI+BenOS
  • 4 解决NEMU编译报错
    • 4.1 找不到readline/readline.h
    • 4.2 找不到path_manager.h

1 NEMU介绍

NEMU(NJU Emulator)最早是由南京大学实现的一个用于教学的计算机指令集体系结构(ISA)模拟器,香山处理器团队基于2019版的NEMU进行增强和维护,用于香山处理器前期RISC-V指令集和体系结构的模拟。

因此,NEMU也称为香山模拟器,NEMU支持x86、mips32、RV32和RV64等指令集体系结构。

2 NEMU编译

安装依赖包

apt install build-essential man gcc gdb git libreadline-dev libsdl2-dev zstd libzstd-dev

下载NEMU源码

git clone https://github.com/OpenXiangShan/NEMU.git

进入目录

cd NEMU/

配置环境变量(/home/test/NEMU换成自己NEMU源码目录)

export NEMU_HOME=/home/test/NEMU

配置NEMU编译为单独可执行程序

make riscv64-xs_defconfig

NEMU有两种工作模式:

  • riscv64-xs_defconfig:作为单独可执行程序编译,生成的文件是build/riscv64-nemu-interpreter;
  • riscv64-xs-ref_defconfig:作为golden model模式编译,生成的文件是build/riscv64-nemu-interpreter-so。

在执行make xxx_defconfig时,会在源码目录下自动创建.config文件,这是源码的编译配置文件。

可执行程序附带调试信息(可选)

make menuconfig

配置以下选项,使其附带调试信息:

  • Build Options -> Optimization Level:选择O0,表示编译器不优化
  • Build Options -> Enable link-time optimization:取消选中,表示禁用链接时优化
  • Build Options -> Enable debug information:选中,表示使能调试信息

执行编译

make -j

在NEMU/build目录下,生成了riscv64-nemu-interpreter。

执行make run,启动模拟器,如下所示:

在这里插入图片描述
此外,执行make clean,可以清除编译结果。
执行make clean-all,清除编译结果和.config文件。

3 NEMU使用

3.1 下载MySBI+BenOS

这里,我们以《RISC-V体系结构编程与实践》中第2章,提供的MySBI+BenOS实验代码为例,进行说明。

关于MySBI+BenOS实验代码的更多说明,可参考《RISC-V体系结构编程与实践》第2章 搭建RISC-V实验环境。

在这里插入图片描述

  • benos目录下为实验代码,包含MySBI(相当于BIOS)和BenOS;这个超精简BIOS和超精简OS,仅仅几行代码,越简单越易学;
  • riscv64-benos_defconfig为NEMU的编译配置文件,这个应该是该实验代码的作者,定制修改过的,可以正确跑实验代码。

因为,我使用上节中make riscv64-xs_defconfig配置,编译生成的riscv64-nemu-interpreter,来跑实验代码,会报错。

3.2 使用riscv64-benos_defconfig编译NEMU

因此,我们需要使用make riscv64-benos_defconfig,然后make -j,生成的riscv64-nemu-interpreter。

3.3 编译MySBI+BenOS

我们需要将MySBI+BenOS,编译为RISC-V格式的可执行程序,因此需要使用RISC-V交叉编译器,编译器安装,可参考《TinyEMU之Linux Kernel编译》。

这里,我们安装的编译器为:riscv64-unknown-linux-gnu-gcc

进入目录

cd benos

将Makefile文件第一行,修改为:

GNU ?= riscv64-unknown-linux-gnu

表示使用riscv64-unknown-linux-gnu为编译器前缀,来进行编译。

设置board环境变量

export board=nemu

执行编译

make

编译完毕

在这里插入图片描述

生成了,如下文件:

  • benos.bin,BenOS可执行文件
  • benos.elf,BenOS带调试信息的ELF文件
  • mysbi.bin,MySBI固件的可执行文件
  • mysbi.elf,MySBI带调试信息的ELF文件
  • benos_payload.bin,把benos.bin和mysbi.bin整合到一个可执行二进制文件中。

NEMU要求使用一个完整的二进制可执行文件,因此只有benos_payload.bin,才可以在NEMU中运行。

拷贝至riscv64-nemu-interpreter所在目录

cp benos_payload.bin ../NEMU/build/

3.4 运行MySBI+BenOS

在NEMU中,运行MySBI+BenOS

cd ../NEMU/build/
./riscv64-nemu-interpreter -b benos_payload.bin

运行效果,如下所示:
在这里插入图片描述

我们的BenOS,通过串口打印出了信息:Welcome RISC-V!

BenOS代码kernel.c,实现代码,如下所示:

#include "uart.h"

void kernel_main(void)
{
	uart_init();
	uart_send_string("Welcome RISC-V!\r\n");

	while (1) {
		;
	}
}

作为一个OS,它是不合格的,太简陋了!
但是,作为一个实验代码,它是优秀的,极其简单!!!

4 解决NEMU编译报错

4.1 找不到readline/readline.h

报错: fatal error : readline/readline.h : No such file or directory…
解决办法: apt install libreadline-dev

4.2 找不到path_manager.h

报错: path_manager.h:24:10: fatal error: filesystem: No such file or directory
解决办法: 安装gcc8和g++8

sudo apt install gcc-8
sudo apt install g++-8

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 800 --slave /usr/bin/g++ g++ /usr/bin/g++-8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 700 --slave /user/bin/g++ g++ /usr/bin/g++-7

sudo update-alternatives --config gcc

最后一条命令,是选择系统默认GCC编译器,这里选择第0项,“0 /usr/bin/gcc-8 800 auto mode”。

参考链接:《香山处理器仿真环境搭建》

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

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

相关文章

探索和构建 LLaMA 3 架构:深入探讨组件、编码和推理技术(三)KV缓存

探索和构建 LLaMA 3 架构:深入探讨组件、编码和推理技术(三) KV缓存 在推理的每一步中,只对模型输出的最后一个标记感兴趣,因为已经有了之前的标记。然而,模型需要访问所有先前的标记来决定输出哪个标记&…

Redis入门到实战教程(基础篇)笔记

教学来源: Redis课程介绍导学_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1cr4y1671t?p1一、Redis 入门 1.认识NoSQL 2.Redis在虚拟机中的安装和开机自启 Redis在虚拟机中安装和配置开机自启-CSDN博客https://blog.csdn.net/qq_69183322/article/deta…

力扣37题:回溯算法之解数独

编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空…

每日一题(力扣45):跳跃游戏2--贪心

由于题目已经告诉了我们一定可以跳到,所以我们只需去考虑前进最快的方法。即 判断当前下一步能跳的各个位置中,哪个能带你去去向最远的地方(why? 因为其他位置所能提供的最大范围都没最远那个大,所以最远的那个已经可以…

【元启发式算法】学生心理学优化算法 SPBO算法【Matlab代码#88】

文章目录 【获取资源请见文章第4节:资源获取】1. 学生心理学优化算法(SPBO)1.1 最好的学生1.2 次好的学生1.3 一般的学生1.4 随机提高成绩的学生 2. 部分代码展示3. 仿真结果展示4. 资源获取说明 【获取资源请见文章第4节:资源获取…

VTK----VTK数据结构详解3(代码篇)

上篇文章(VTK----VTK数据结构详解(计算机篇)-CSDN博客)从计算机数据结构(数组、链表等)的角度对数据数组、数据对象、数据属性的实现原理进行了说明,下面从代码的层面详细说明它们的使用及相关实…

【Leetcode笔记】501.二叉搜索树中的众数

文章目录 题目要求ACM 模式代码知识点 题目要求 给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 …

智能合约——提案demo

目录 这是一个超超超级简单的智能合约提案项目,你确定不点进来看一下吗? 引言: 1、搭建开发环境: 2、编写智能合约: 3、部署智能合约: ​编辑​编辑4、编写前端交互代码(使用web3.js&…

MySQL中的Performance Schema是什么?

MySQL中的Performance Schema是什么? Performance Schema 是 MySQL 的一个特性,主要用于监控 MySQL 服务器在运行时的性能和资源使用情况。它首次引入于 MySQL 5.5 版本,并在后续版本中得到增强。Performance Schema 提供了一种方式来收集数…

PID算法学习

PID算法介绍 在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。它具有原理简单,易于实…

某会员商店App的api接口分析

1、目的 探索学习app接口的加解密机制,并通过api模拟调用的方式,发起业务请求。仅供学习。 2、工具准备 样本App版本:v5.0.80,v5.0.90 设备:Oppo R9s(Android7.1.1) MacOS Big Sur&#xff…

基于Spring Boot的口腔管理平台设计与实现

基于Spring Boot的口腔管理平台设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 管理员登录界面图,管理员登录进入口腔管理平…

基于JAVA实现的推箱子小游戏

Java推箱子小游戏实现: 推箱子小游戏曾经在我们的童年给我们带来了很多乐趣。推箱子这款游戏现在基本上没人玩了,甚至在新一代人的印象中都已毫无记忆了。。。但是,这款游戏可以在一定程度上锻炼自己的编程能力。 窗口画面设计:i…

鸿蒙OpenHarmony【轻量系统 编译】 (基于Hi3861开发板)

编译 OpenHarmony支持hb和build.sh两种编译方式。此处介绍hb方式,build.sh脚本编译方式请参考[使用build.sh脚本编译源码]。 使用build.sh脚本编译源码 进入源码根目录,执行如下命令进行版本编译。 ./build.sh --product-name name --ccache 说明&…

今日arXiv最热大模型论文:大模型也来看球,还能判断是否犯规

在足球世界,裁判的哨声可谓“千金难买”,因为它能直接决定俱乐部的钱包是鼓是瘪。但球场变化莫测,非常考验裁判的水平。 2022年卡塔尔世界杯上,半自动越位识别技术(SAOT)闪亮登场,通过12台摄像…

Rabbitmq安装延迟插件rabbitmq_delayed_message_exchange失败

Docker里的Rabbitmq容器安装延迟插件rabbitmq_delayed_message_exchange失败 一启动插件Rabbitmq容器直接停止运行了 rabbitmq-plugins enable rabbitmq_delayed_message_exchange排除了版本问题和端口问题等,发现是虚拟机运行内存不够,增加虚拟机运行内…

游戏新手村18:游戏广告渠道与广告形式

上文我们说到,渠道为王,渠道可以为我们带来流量和用户,进而带来收入。我们可以通过哪些渠道导入用户呢?每个渠道有哪些优劣呢?在进行游戏营销推广的时候我们该如何选择呢? 根据付费性质,我们可…

Dbeaver客户端安装和使用

数据库管理软件(DBMS): • 数据是数据库中存储的基本对象,种类包括文字、图形、图像、声音等等 • 数据库(database)是以某种有组织的方式存储的数据集合,保存有组织的数据的容器,通…

【C语言必刷题】7. 百钱百鸡

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更…

大模型_ ChatGLM-Med推理及微调部署

文章目录 ChatGLM-Med是什么数据集构建推理部署python环境切换到安装好的conda环境下载github数据切换目录在infer.py修改模型路径启动推理解决infer.py报错修改后再次启动推理完成 微调部署安装evaluate包修改模型路径启动微调 ChatGLM-Med是什么 经过中文医学指令精调/指令微…