搭建NEMU与QEMU的DiffTest环境(动态库方式)

news2024/9/20 14:30:28

搭建NEMU与QEMU的DiffTest环境(动态库方式)

  • 1 DiffTest原理简述
  • 2 编译NEMU
  • 3 编译qemu-dl-difftest
    • 3.1 修改NEMU/scripts/isa.mk
    • 3.2 修改NEMU/tools/qemu-dl-diff/src/diff-test.c
    • 3.3 修改NEMU/scripts/build.mk
    • 3.4 让qemu-dl-difftest带调试信息
    • 3.5 编译生成riscv64-qemu-so
  • 4 NEMU、动态库、QEMU之间的关系
  • 5 以difftest方式,运行NEMU
    • 5.1 坑1:dlopen失败
    • 5.2 坑2:xxx.debug文件

本文属于 《RISC-V指令集差分测试(DiffTest)系列教程》之一,欢迎查看其它文章。

环境:Ubuntu 18.04.5 LTS

1 DiffTest原理简述

DiffTest核心思想: 对于根据同一规范的两种实现, 给定相同的有定义的输入, 它们的行为应当一致。

如果,我们正在开发一款处理器或者模拟器,那么我们的指令集实现,可能存在无数错误,此时我们需要找一个标准实现,也就是参考对象(REF)。我们以该参考对象,进行指令级的一对一验证,以确保我们的处理器或模拟器,实现是正确的。

本文中,我们选择:

  • QEMU作为参考对象(REF)
  • NEMU作为测试对象(DUT)

当然,如果需要测试处理器硬件,那它也可以作为DUT。

2 编译NEMU

执行以下命令:

apt install build-essential man gcc gdb git libreadline-dev libsdl2-dev zstd libzstd-dev
git clone https://github.com/OpenXiangShan/NEMU.git
cd NEMU/
export NEMU_HOME=/home/test/NEMU    # /home/test/NEMU换成自己NEMU源码目录
make riscv64-benos_defconfig	    # riscv64-benos_defconfig需放入NEMU/configs/
make menuconfig

配置以下内容(让NEMU附带调试信息):

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

配置以下内容(开启动态库方式的DiffTest功能):

Testing and Debugging -> [*] Enable differential testing -> Reference design (QEMU, communicate with dynamic linking)

在NEMU/scripts/build.mk中,删除所有-Werror选项(否则编译报错),如下所示:

CFLAGS  := -O2 -MMD -Wall -Werror $(INCLUDES) $(CFLAGS)
CXXFLAGS  := -O2 -MMD -Wall -Werror --std=c++17 $(XINCLUDES) $(CFLAGS)

编译

make -j`nproc`

编译成功,生成NEMU/build/riscv64-nemu-interpreter可执行文件。

3 编译qemu-dl-difftest

3.1 修改NEMU/scripts/isa.mk

在NEMU/scripts/isa.mk中,将ISA ?= x86修改为ISA ?= riscv64,如下所示:

ISA ?= riscv64
ISAS = $(shell ls $(NEMU_HOME)/src/isa/)
ifeq ($(filter $(ISAS), $(ISA)), ) # ISA must be valid
$(error Invalid ISA=$(ISA). Supported: $(ISAS))
endif
NAME := $(ISA)-$(NAME)
CFLAGS += -D__ISA_$(ISA)__=1

3.2 修改NEMU/tools/qemu-dl-diff/src/diff-test.c

在NEMU/tools/qemu-dl-diff/src/diff-test.c中,将isa_raise_intr(NO);注释掉。

void difftest_raise_intr(uint64_t NO) {
	//  isa_raise_intr(NO);
}

这个函数在NEMU/tools/qemu-dl-diff/src/isa/x86/intr.c中定义(riscv怎么会用x86的代码?这里没深究,直接注释掉,继续)。

3.3 修改NEMU/scripts/build.mk

在NEMU/scripts/build.mk中,在LDFLAGS末尾,添加-ldl

.DEFAULT_GOAL = app

ifdef SHARE
SO = -so
CFLAGS  += -fPIC -D_SHARE=1
LDFLAGS += -rdynamic -shared -fPIC -Wl,--no-undefined -lz -ldl
endif

注意:build.mk中有多处LDFLAGS,-ldl只能加在上文所示位置。

3.4 让qemu-dl-difftest带调试信息

在NEMU/scripts/build.mk中,将CFLAGS、CXXFLAGS、LDFLAGS中:

  • 所有-O2改为-O0
  • 并且在-O0后,增加-g

如下所示:

CFLAGS  := -O0 -g -MMD -Wall $(INCLUDES) $(CFLAGS)
CXXFLAGS  := -O0 -g -MMD -Wall --std=c++17 $(XINCLUDES) $(CFLAGS)
LDFLAGS := -O0 -g $(LDFLAGS)

3.5 编译生成riscv64-qemu-so

进入NEMU/tools/qemu-dl-difftest目录

cd tools/qemu-dl-difftest/

编译qemu-dl-difftest

make

在NEMU/tools/qemu-dl-diff/build目录下,生成riscv64-qemu-so动态库。

4 NEMU、动态库、QEMU之间的关系

在这里插入图片描述

首先,需要大致解释一下,NEMU、动态库、QEMU之间的关系和原理,如上图所示。

基本关系:

  • riscv64-qemu-so动态库,导出了difftest_xx系列函数。
  • qemu-system-riscv64可执行文件中,有cpu_xx、gdb_xx以及qemu_xx系列函数,会被动态库调用。
  • 基本关系就是,NEMU调用动态库,动态库再调用qemu-system-riscv64。

基本流程:

  • NEMU可执行程序riscv64-nemu-interpreter,通过调用dlopen函数加载riscv64-qemu-so,并将difftest_xx系列函数符号解析出来,以备后续调用。
  • 然后,NEMU调用difftest_init函数,进行初始化。
  • 在difftest_init函数中,会再次调用dlopen函数,去加载qemu-system-riscv64可执行文件,并解析cpu_xx、gdb_xx以及qemu_xx系列函数符号,这些函数符号,其实就是difftest_xx系列函数的底层实现代码。
  • 从qemu-system-riscv64文件中,解析的函数,就有main函数,随后difftest_init函数就会调用它,以启动qemu程序。
  • 随后,如果一切正常的话,就可以调用qemu函数,以实现指令结果比对了。

5 以difftest方式,运行NEMU

动态库启动qemu时,使用的启动参数(NEMU/tools/qemu-dl-diff/src/isa/riscv64/init.c),如下:

char *isa_qemu_argv[] = {
  "/usr/bin/qemu-system-riscv64",
  "-nographic", "-S", "-serial", "none", "-monitor", "none",
  NULL
};

因此,qemu路径,必须为/usr/bin/qemu-system-riscv64。

此外,还需要将benos_payload.bin、riscv64-qemu-so,均拷贝至NEMU/build目录下。

以difftest方式,运行NEMU:

./riscv64-nemu-interpreter -b benos_payload.bin -d ./riscv64-qemu-so

见证奇迹的时刻!!!

5.1 坑1:dlopen失败

哦豁,riscv64-qemu-so里面,dlopen打开/usr/bin/qemu-system-riscv64失败,报错信息:

cannot dynamically load executable

报错原因:dlopen是glibc库函数。我在老版机器上glibc 2.27,发现可以打开;在新版机器上glibc 2.31,发现打开失败;猜测是glibc版本问题,dlopen官方定义用途为打开so,这里用来打开可执行文件,新版glibc更严格,所以不允许这么用了?
解决办法:期间尝试dlopen劫持,以及移植重写dlopen函数,都挺麻烦的;暂时没什么好办法。

5.2 坑2:xxx.debug文件

因此,我回到老版系统上,这里dlopen打开成功,再次运行又报assert错误。

使用gdb --args ./riscv64-nemu-interpreter -b benos_payload.bin -d ./riscv64-qemu-so命令调试跟踪,发现报错原因,是需要一个debug文件,路径为:/usr/lib/debug/.build-id/97/612b9c612a179a100ded49c146a82904b8c5d8.debug

经过了解,需要从该文件中,解析调试symbol信息,我的机器上没有这个文件。
这个文件是apt-get命令,使用包管理器,安装qemu时,自动创建的。

但是我这个老系统,最多只能升级到qemu 2.11.1,这个版本居然不带qemu-system-riscv64,自然也就没有这个debug文件。

QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.42)

走到这里,已经没法继续了,要么只有一个版本一个版本去试:

  • 首先,要能装qemu-system-riscv64的系统;
  • 并且,系统上的glibc还要老的,比如:ubuntu glibc 2.27以前。(我在redhat上glibc 2.12,dlopen也失败,醉了,可能redhat上一直都很严格)

算了,麻烦得很,放弃。
后面,使用socket方式来试试。

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

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

相关文章

昇思12天

FCN图像语义分割 1. 主题和背景 FCN是由UC Berkeley的Jonathan Long等人于2015年提出的,用于实现图像的像素级预测。 2. 语义分割的定义和重要性 语义分割是图像处理和机器视觉中的关键技术,旨在对图像中的每个像素进行分类。它在很多领域有重要应用…

【问题解决】 pyocd 报错 No USB backend found 的解决方法

pyocd 报错 No USB backend found 的解决方法 本文记录了我在Windows 10系统上遇到的pyocd命令执行报错——No USB backend found 的分析过程和解决方法。遇到类似问题的朋友可以直接参考最后的解决方法,向了解问题发送原因的可以查看原因分析部分。 文章目录 pyoc…

ChatGPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建等高级进阶

目录 第一章 ChatGPT-4o使用进阶 第二章 大语言模型原理详解 第三章 大语言模型优化 第四章 开源大语言模型及本地部署 第五章 从0到1搭建第一个大语言模型 第六章 智能体(Agent)构建 第七章 大语言模型发展趋势 第八章 总结与答疑讨论 更多应用…

端口被占用,使用小黑框查杀

netstat -ano (查看目前所有被占的端口) netstat -ano|findstr " 8080" 查一下目前被占用的端口号 ,目前我要查的端口号是:8080,注意 后面打8080的时候,要有空格,要不然报错 **task…

无人机便携式侦测干扰设备(定全向)技术详解

无人机便携式侦测干扰设备(定全向)是一种专门针对无人机进行侦测和干扰的设备。它具备定向和全向两种工作模式,能够覆盖较宽的频率范围,有效侦测并干扰无人机与遥控器之间的通信信号,从而达到控制或驱离无人机的目的。…

CRT工具

CRT工具 传输位置设置 打开SFTP alt p 命令 ls:远程机器当前目录内容 lls:传输位置文件的目录内容 pwd:远程机器的当前位置 lpwd:传输位置的位置 get 文件:ftp传输文件 get -r 文件夹:ftp传输文件…

AI中药处方模型构建与案例

在中医领域,人工智能(AI)可以生成各种指令来辅助诊断、治疗和研究。 1. 诊断辅助指令: 根据患者的症状和体征,自动分析并生成可能的中医证候诊断建议。利用中医望闻问切四诊信息,智能识别关键症状,提供对应的中医辨证思路。2. 治疗建议指令: 根据辨证结果,自动推荐相应…

2024吉他手的超级助手Guitar Pro8中文版本发布啦!

亲爱的音乐爱好者们,今天我要来和你们分享一款让我彻底沉迷的软件—Guitar Pro。如果你是一名热爱吉他的朋友,那么接下来的内容你可要瞪大眼睛仔细看哦!👀🎶 Guitar Pro免费绿色永久安装包下载:&#xff0…

90元搭建渗透/攻防利器盒子!【硬件篇】

前言 以下内容请自行思考后进行实践。 使用场景 在某些情况下开软件进行IP代理很麻烦,并不能实现真正全局,而且还老容易忘记,那么为了在实景工作中,防止蓝队猴子封IP,此文正现。 正文 先说一下实验效果&#xff1…

鸿蒙开发管理:【@ohos.account.distributedAccount (分布式帐号管理)】

分布式帐号管理 本模块提供管理分布式帐号的一些基础功能,主要包括查询和更新帐号登录状态。 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff…

axios取消请求功能CancelToken原理解析

今天在论坛看到一个取消axios请求的功能,具体场景是这样的:前端接口以较短时间间隔请求后端接口刷新状态,接口返回“成功”状态之后还有处于pending状态的请求在排队,如果请求不取消就会导致前端最后获取到的状态出错,…

C语言实现计算器混合运算(含括号,加减乘除)

功能描述: 实现计算器混合运算基本功能,包括:( )、、-、*、/。 功能很简单,但实现起来还是有一定逻辑难度,因为,混合运算需要考虑优先级。 优先级最高的为:() 其次&a…

LabVIEW干涉仪测向系统

开发了一套基于LabVIEW的软件系统,结合硬件设备,构建一个干涉仪测向实验教学平台。该平台应用于信号处理课程,帮助学生将理论知识与实际应用相结合,深化对信号处理核心概念的理解和应用。 项目背景: 当前信号处理教学…

基于Wireshark和TiWsPC(Wireshark Packet Converter)的Zigbee抓包

前言 介绍几种Zigbee抓包方式: 1. Ubiqua 使用教程网上非常多也非常清晰; 但是Ubiqua是收费软件,较贵; 我安装过了,费好多事,没安装成功。 2. Killerbee套件 https://github.com/riverloopsec/killerbe…

TB作品】51单片机 Proteus仿真 51单片机SPI显示OLED字符驱动

// GND 电源地 // VCC 接5V或3.3v电源 // D0 P1^4(SCL) // D1 P1^3(SDA) // RES 接P12 // DC 接P11 // CS 接P10 OLED显示接口与控制实验报告 背景 OLED(有机发光二极管)显示器由于其高对比度、低功耗和…

【论文通读】RuleR: Improving LLM Controllability by Rule-based Data Recycling

RuleR: Improving LLM Controllability by Rule-based Data Recycling 前言AbstractMotivationSolutionMethodExperimentsConclusion 前言 一篇关于提升LLMs输出可控性的短文,对SFT数据以规则的方式进行增强,从而提升SFT数据的质量,进而间接帮…

关于模拟数字模块认知

工业上常见信号分类 PLC控制系统主要是电信号 电信号分为数字信号和模拟信号 PLC系统中有数字量模块DO/DI,模拟量AO/AI。(O为输出,I为输入) 在模块应用中,注意前连接器要和冷压端子相匹配。前连接器可理解为接插件&am…

Go:hello world

开启转职->Go开发工程师 下面是我的第一个go的程序 在上面的程序介绍: 1、package main 第一行代码package main定义了包名。必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程…

用HttpURLConnection复现http响应码405

目录 使用GET方法,访问GET接口,服务端返回405使用GET方法,访问POST接口,服务端返回405使用POST方法,访问GET接口,服务端返回405 使用GET方法,访问GET接口,服务端返回405 发生场景&a…

Polkadot(DOT)即将爆雷?治理无能还歧视亚洲!资金将在两年内耗尽!是下一个FTX吗?

近期,关于Polkadot(DOT)生态圈的一系列负面消息引发了业界和投资者的广泛关注。从高昂的营销开支、缺乏实际业务亮点,再到治理问题和种族歧视指控,Polkadot似乎正面临着严峻的危机。业内人士警告,Polkadot的财政状况堪忧&#xff…