NEMU模拟器源码编译与使用

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++-8sudo 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++-7sudo update-alternatives --config gcc

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客NC143 矩阵乘法【中等 矩阵 C++/Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/bf358c3ac73e491585943bac94e309b0 思路 矩阵算法在图像处理、神经网络、模式识别等领域有着广泛的用途。在矩阵乘法中,A矩阵和B矩阵可以做乘法运算必须满足A矩阵的列的数量等于B矩阵的行的数量。运算…

Restful API 具体设计规范(概述)

协议 https 域名 https://www.baidu.com/api 版本 https://www.baidu.com/v1 路径 https://www.baidu.com/v1/blogs 方法 数据过滤 状态码返回结果 返回的数据格式 尽量使用 JSON,避免使用 XML。 总结: 看 url 就知道要什么看 http method 就知道干…

Linux基础——Linux基本指令(下)

前言:Linux基本指令学到这里也快接近尾声了,如果对前面内容还有不清楚建议回顾这两篇文章 。 Linux基本指令(上) 和Linux基本指令(中) 接前两篇,接下来让我们再深入学习一下最后几个Linux指令,Linux基本指令将在本篇完结。 在此前&#xff…

Web3技术解析:区块链在去中心化应用中的角色

引言 在过去几年中,Web3技术已经成为了互联网领域的一个热门话题。作为区块链技术的延伸,Web3不仅仅是数字货币的代名词,更是一个能够为各种应用提供去中心化解决方案的强大工具。本文将深入探讨区块链在Web3去中心化应用中的关键角色&#…

国产麒麟v10系统下打包electron+vue程序,报错unknown output format set

报错如下: 报错第一时间想到可能是代码配置原因报错,查看代码似乎感觉没啥问题 又查看具体报错原因可能是因为icon的原因报错,后面查阅发现ico在各系统平台会不兼容,也就是ico是给win下使用的,此处改下图标格式就ok&am…

C++系列-输入输出

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” C输入和输出 我们都知道C语言的输出是用printf函数来实现的&#xff0c;那么C呢&#xff0c;它的实现逻辑是什么呢&#xff0c;让我们一起来看一下&#xff0c; #include<i…

怎么用PHP语言实现远程控制电器

怎么用PHP语言实现远程控制电器呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制电器&#xff0c;通过控制电器的电源线路来实现电器控制。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称厂商1智能WiFi通断器AC3统…

Qt Creator Pro文件添加库和源文件

在项目的pro文件所在的文件夹中添加源文件lib_header &#xff0c;entityobject 如下图所示&#xff1a; 在 pro 文件里面添加源文件的路径如下所示&#xff1a; 这个英文符号点&#xff0c;表示当前目录&#xff0c;因为这个文件是和pro文件在同一个目录下&#xff0c;所以用…

【内网横向】SSH协议隧道搭建详解

什么是SSH隧道 SSH隧道是通过Secure Shell&#xff08;SSH&#xff09;协议在两个网络节点之间创建的加密通道。它可以用于安全地传输数据&#xff0c;绕过网络限制或保护数据免受窃听。通过SSH隧道&#xff0c;可以在两个网络之间建立安全的连接&#xff0c;例如在本地计算机和…

微信小程序:5.数据绑定

在Data中定义数据早wxml中进行数据使用 在data中定义数据 在页面对应的js对象中找到data&#xff0c;然后把数据进行定义即可 Page({data: {motto: Hello World,userInfo: {avatarUrl: defaultAvatarUrl,nickName: ,},hasUserInfo: false,canIUseGetUserProfile: wx.canIUse…

Taro +vue3 中实现全局颜色css变量的设置和使用

当我们现在需要弄一个随时修改的页面颜色主题色 我们可以随时修改 我使用的是 Taro 框架 一般有一个app.less 文件 我们在这个里面 设置一个root 全局样式 :root {--primary-color: #028fd4;--secondary-color: #028fd6;/* 添加其他颜色变量 */ } 这样在全局我们就可以使用这…

前端到全栈进阶之“前端框架”

从前端入门到全栈-系列介绍 你会学到什么&#xff1f; 可能学不到什么东西&#xff0c;该系列是作者本人工作和学习积累&#xff0c;用于复习 系列介绍 现在的 Web 前端已经离不开 Node.js&#xff0c;我们广泛使用的 Babel、Webpack、工程化都是基于 Node 的&#xff0c;各…