搭建NEMU與QEMU的DiffTest環境(動態庫方式)

搭建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 = appifdef 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.pswp.cn/diannao/42581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42581.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言實現字符串排序

如果只有英文字符且不區分大小寫的話按照字典序排序可以用strcmp函數&#xff0c;兩個字符串自左向右逐個字符相比&#xff08;按ASCII值大小相比較&#xff09; strcmp(s1,s2) 當s1<s2時&#xff0c;返回為負數&#xff1b; 當s1s2時&#xff0c;返回值 0&#xff1b; …

安卓的組件

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

【Linux】打包命令——tar

打包和壓縮 雖然打包和壓縮都涉及將多個文件組合成單個實體&#xff0c;但它們之間存在重要差異。 打包和壓縮的區別&#xff1a; 打包是將多個文件或目錄組合在一起&#xff0c;但不對其進行壓縮。這意味著打包后的文件大小可能與原始文件相同或更大。此外&#xff0c;打包…

Win10精英控制器2代青春版 設備刪除失敗,藍牙連接斷斷續續

前提 更新了主板rog z790帶WiFi、藍牙&#xff0c;但是精英控制器連上老師斷斷續續。 過程 在設備管理中嘗試了卸載、重裝主板對應的藍牙驅動&#xff0c;怎么都不行&#xff0c;都已經想放棄了。 但是想起來之前主板沒有藍牙&#xff0c;用的是綠聯的USB藍牙接收器&#xf…

Ubuntu24.04修改系統的環境變量

apache/tomcat配置要用到JDK&#xff0c;使用torch有時也會用到系統庫&#xff0c;涉及到環境變量 1. 查看環境變量 cat /etc/environment2. 新建環境變量 sudo nano /etc/environment在文件底部添加新的環境變量 MY_VARIABLE"your_value"3. 修改環境變量 臨時—…

數字化精益生產系統--APS 排程管理系統

APS&#xff08;Advanced Planning and Scheduling&#xff09;排程管理系統&#xff0c;即高級生產計劃與排程系統&#xff0c;是一種高度智能化的計劃和排程系統。它通過整合各種生產和供應鏈數據&#xff0c;運用先進的算法和數據模型&#xff0c;根據各種約束條件&#xff…

MySQL篇三:數據類型

文章目錄 前言1. 數值類型1.1 tinyint類型1.2 bit類型1.3 小數類型1.3.1 float1.3.2 decimal 2. 字符串類型2.1 char2.2 varchar2.3 char和varchar比較 3. 日期類型4. enum和set 前言 數據類型分類&#xff1a; 1. 數值類型 1.1 tinyint類型 在MySQL中&#xff0c;整型可以指…

排隊系統、Head and Tail of the Queue 題目

題目 JAVA40 排隊系統描述輸入描述&#xff1a;輸出描述&#xff1a; 分析&#xff1a;代碼&#xff1a; JAVA41 Head and Tail of the Queue&#xff08;隊列的頭和尾&#xff09;描述輸入描述&#xff1a;輸出描述&#xff1a; 示例:分析&#xff1a;代碼&#xff1a;大佬代碼…

【Java13】包

“包”這個機制&#xff0c;類似于分組。主要作用是區分不同組內的同名類。例如&#xff0c;高三三班有一個“王五”&#xff0c;高二八班也有一個“王五”。高三三班和高三八班就是兩個不同的包。 Java中的包&#xff08;package&#xff09;機制主要提供了類的多層命名空間&…

MISRA C2012學習筆記(6)-Rules 8.11

文章目錄 8.11 指針類型轉換(Pointer type conversions)Rule 11.1 不能在函數指針和任何其他類型指針之間進行轉換Rule 11.2 不得在指向不完整類型的指針和其他任何類型間進行轉換Rule 11.3 不得在指向不同對象類型的指針之間執行強制轉換Rule 11.4 不得在指向對象的指針和整數…

HTTP長連接

長連接優點 HTTP為什么要開啟長連接呢? 主要是為了節省建立的時間,請求可以復用同一條TCP鏈路,不用重復進行三握+四揮 如果沒有長連接,每次請求都做三握+四揮 如果有長鏈接,在一個 TCP 連接中可以持續發送多份數據而不會斷開連接,即請求可以復用TCP鏈路 長連接缺點 …

第六十八回 東平府誤陷九紋龍 宋公明義釋雙槍將-文心大模型ernie-speed免費使用方法

宋江和盧俊義抓鬮兒&#xff0c;宋江打東平府&#xff0c;盧俊義打東昌府&#xff0c;誰先打下誰做梁山泊主。宋江帶領林沖、花榮、劉唐等二十八人&#xff0c;盧俊義帶領吳用、公孫勝、關勝等二十八人。 宋江等人到了東平府外安山鎮&#xff0c;郁保四和王定六自告奮勇去下戰…

比Elasticsearch更高效的開源搜索引擎Meilisearch——筑夢之路

功能說明 快速與高效&#xff1a; Meilisearch 旨在提供快速的搜索速度。它可以在毫秒級別內返回查詢結果&#xff0c;即使在處理大型數據集時也是如此。 例如&#xff0c;在官方提供的基準測試中&#xff0c;使用 Meilisearch 處理 10 萬個文檔時&#xff0c;平均搜索時間為 …

vue3制作輪播圖+vue輪播圖的圖片引入方式

對應的<teemplate> <template><div class"box"><ul class"ul1" ref"ul1"><li v-for"(img, idx) in images" :key"idx" :style"{ zIndex: img.zIndex }"><img :src"img.s…

深度學習驅動的中文情感分析:PlugLink 在實踐中的橋梁作用

深度學習驅動的中文情感分析&#xff1a;PlugLink 在實踐中的橋梁作用 情感分析技術則如同濾網&#xff0c;幫助我們從這股洪流中篩選出有價值的情感信號。特別是對于中文這樣的多音字、同音詞豐富且語境復雜度高的語言&#xff0c;深度學習模型展現了無與倫比的優勢。本文將以…

代碼隨想錄第45天|動態規劃

300.最長遞增子序列 參考 dp[i] 表示以 i 為結尾的最長遞增子序列長度遞推公式: 使用 i 和 j 判斷 dp[i] max(dp[j] 1, dp[i])每次 j 都需要從頭遍歷 初始化: dp[i] 1 class Solution { public:int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums…

基于STM32設計的管道有害氣體檢測裝置(ESP8266局域網)176

基于STM32設計的管道有害氣體檢測裝置(176) 文章目錄 一、前言1.1 項目介紹【1】項目功能介紹【2】項目硬件模塊組成【3】ESP8266模塊配置【4】上位機開發思路【5】項目模塊劃分【6】LCD顯示屏界面布局【7】上位機界面布局1.2 項目功能需求1.3 項目開發背景1.4 開發工具的選擇1…

國產化新標桿:TiDB 助力廣發銀行新一代總賬系統投產上線

隨著全球金融市場的快速發展和數字化轉型的深入推進&#xff0c;金融科技已成為推動銀行業創新的核心力量。特別是在當前復雜多變的經濟環境下&#xff0c;銀行業務的高效運作和風險管理能力顯得尤為重要。總賬系統作為銀行會計信息系統的核心&#xff0c;承載著記錄、處理和匯…

2024年06月CCF-GESP編程能力等級認證Python編程二級真題解析

本文收錄于專欄《Python等級認證CCF-GESP真題解析》&#xff0c;專欄總目錄&#xff1a;點這里&#xff0c;訂閱后可閱讀專欄內所有文章。 一、單選題&#xff08;每題 2 分&#xff0c;共 30 分&#xff09; 第 1 題 小楊父母帶他到某培訓機構給他報名參加CCF組織的GESP認證…

云動態摘要 2024-07-07

給您帶來云廠商的最新動態,最新產品資訊和最新優惠更新。 最新優惠與活動 數據庫上云優選 阿里云 2024-07-04 RDS、PolarDB、Redis、MongoDB 全系產品新用戶低至首年6折起! [免費體驗]智能助手ChatBI上線 騰訊云 2024-07-02 基于混元大模型打造,可通過對話方式生成可視化…