qemu(3) -- qemu-arm使用

1. 前言

qemu中有很多的特技,此處記錄下qemu-arm的使用方式,簡單來說qemu-system-xx用于虛擬整個設備,包括操作系統的運行環境,而qemu-xx僅虛擬Linux應用程序的環境,不涉及操作系統,應用程序的系統調用有宿主系統提供。

2. 安裝

2.1 qemu-user

此處直接通過apt進行qemu-user的安裝,該操作會一次性安裝許多平臺的仿真器。

# 大概需要65MB空間
$ sudo apt install qemu-user
0 upgraded, 2 newly installed, 0 to remove and 37 not upgraded.
Need to get 9621 kB of archives.
After this operation, 65.4 MB of additional disk space will be used.

2.2 arm-linux工具鏈

  1. arm的工具鏈可以通過apt命令安裝。
# 大概需要140MB空間
$ sudo apt install gcc-arm-linux-gnueabi
0 upgraded, 18 newly installed, 1 to remove and 47 not upgraded.
Need to get 43.1 MB of archives.
After this operation, 140 MB of additional disk space will be used.
  1. 也可以去arm developer網上下載,我下載的是arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz,大概123MB。

3. 測試程序

  1. 編寫一個測試程序main.c
#include <stdio.h>int main(int argc, char *argv[])
{printf("hello word!!!\n");#ifdef __x86_64__printf(">>>>>> I'm x86_64 arch <<<<<<\n");#elif defined(__ARMEL__)printf(">>>>>> I'm arm arch <<<<<<\n");#endifreturn 0;
}
  1. 編寫一個Makefile
# 此處定義了arm-linux工具鏈中包含的arm的動態庫,Makefile中$有特俗作用,傳遞給shell處理時需要使用$$表示$
ARM_LIBC = $(shell echo $$(dirname $$(which arm-none-linux-gnueabihf-gcc))/../arm-none-linux-gnueabihf/libc)all:# 使用主機的gcc編譯并運行gcc main.c -g -o hello_x86_64./hello_x86_64# 使用arm-linux工具鏈編譯,并設置靜態鏈接arm-none-linux-gnueabihf-gcc main.c -g -static -o hello_arm_static# 對于靜態鏈接的程序,可以使用qemu-arm直接運行qemu-arm hello_arm_static# 使用arm-linux工具鏈編譯,缺省為動態鏈接arm-none-linux-gnueabihf-gcc main.c -g -o hello_arm_dyn# 動態鏈接的程序需要使用-L參數指定hello_arm_dyn的動態庫搜索路徑qemu-arm -L $(ARM_LIBC) hello_arm_dyn# hello_arm_dyn的動態庫搜索路徑也可以使用環境變量QEMU_LD_PREFIX來設置QEMU_LD_PREFIX=$(ARM_LIBC) qemu-arm hello_arm_dyn
  1. 執行make,觀察輸出。
# 執行make命令,以下內容為makefile和可執行程序所打印,可以看到arm的程序正常運行了
$ make
gcc main.c -o hello_x86_64
./hello_x86_64
hello word!!!
>>>>>> I'm x86_64 arch <<<<<<
arm-none-linux-gnueabihf-gcc main.c -o hello_arm_static -static
qemu-arm hello_arm_static
hello word!!!
>>>>>> I'm arm arch <<<<<<
arm-none-linux-gnueabihf-gcc main.c -o hello_arm_dyn
qemu-arm -L /home/xflm/tools/exe/arm-none-linux-gnueabihf/bin/../arm-none-linux-gnueabihf/libc hello_arm_dyn
hello word!!!
>>>>>> I'm arm arch <<<<<<
QEMU_LD_PREFIX=/home/xflm/tools/exe/arm-none-linux-gnueabihf/bin/../arm-none-linux-gnueabihf/libc qemu-arm hello_arm_dyn
hello word!!!
>>>>>> I'm arm arch <<<<<<

4. binfmt_misc

  1. Linux有一種binfmt_misc機制,簡單說就是我們執行程序時,系統會根據該機制的配置信息選擇使用不同的加載器,wsl種默認就有注冊了一個解釋器WSLInterop,內容如下。
# binfmt_misc機制以文件系統的方式存在
$ mount | grep bin
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
# 查看WSLInterop解釋器配置
$ sudo cat /proc/sys/fs/binfmt_misc/WSLInterop
enabled
# interpreter -- 啟動文件的程序,需要是絕對路徑,長度不能超過127
interpreter /init
# flags -- 可選字段,控制interpreter打開文件的行為。
# P -- 表示preserve-argv[0]保留原始的argv[0]參數。
# F -- 表示fix binary,binfmt-misc默認的行為在spwan進程時會延遲,這種方式可能會受到mount namespace和chroot的影響,設置F時會立刻打開二進制文件。
# O -- 表示open-binary,binfmt-misc默認會傳遞文件的路徑,而啟用這個參數時,binfmt-misc會打開文件,傳遞文件描述符。
# C -- 表示credentials,即會傳遞文件的setuid等權限,這個選項也隱含了O 。
flags: PF
# 文件的偏移
offset 0
# 文件的魔幻數
magic 4d5a
# 查看window上的ping.exe文件的開頭,-g表示每列1個字節,-l表示顯示4個字節,-R表示不要顯示顏色
$ xxd -g 1 -l 4 -R never $(which ping.exe)
00000000: 4d 5a 90 00       MZ..
# 查看一下wsl中編譯的hello_x86_64
xxd -g 1 -l 4 -R never hello_x86_64
00000000: 7f 45 4c 46       .ELF
  1. 根據這邊文章的描述Support for miscellaneous binary formats (binfmt_misc) with Ubuntu on WSL,wsl中貌似暫時不支持該特性,所以執行sudo apt install qemu-user-binfmt sudo modprobe binfmt_misc sudo systemctl restart systemd-binfmt均不生效。

5. 調試

qemu-arm還支持gdb調試。

# 啟動qemu-arm并等待gdb連接,gdbserver的端口為tcp 1234
$ qemu-arm -g 1234 hello_arm_static
# 此時qemu-arm不會直接運行程序,而是等待gdb連接
# 另外開一個窗口運行arm-none-linux-gnueabihf-gdb
$ arm-none-linux-gnueabihf-gdb
# 連接到qemu-arm開始調試
(gdb) target remote localhost:1234
# 在main()函數入口設置斷點
(gdb) b main
# 全速運行,程序運行到main()函數時會停下來
(gdb) c

上一篇:qemu(2) – 定制開發板
下一篇:qemu(4) – qemu-system-arm使用
目錄:全部文章合集

參考

QEMU的基本使用方法(MIPS)
基于QEMU和binfmt-misc透明運行不同架構程序

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81393.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81393.shtml

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

相關文章

Docker的簡單使用(不全)

Docker Hello World Docker 允許在容器內運行應用程序&#xff0c;使用docker run命令來在容器內運行一個應用程序 輸出Hello World runoobrunoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"Hello world docker&#xff1a;Docker的二進制執行文件 run…

SALOME源碼分析: 命令系統

本文分析SALOME中命令系統&#xff0c;涉及的知識點包括&#xff0c; MDF框架數據對象模型 注1&#xff1a;限于研究水平&#xff0c;分析難免不當&#xff0c;歡迎批評指正。注2&#xff1a;文章內容會不定期更新。 一、命令對象 1.1 Class Hierarchy 1.2 SUIT_Operation #…

Bootstrap(自助法)??:無需假設分布的統計推斷工具

核心思想?? Bootstrap 是一種??重采樣&#xff08;Resampling&#xff09;技術??&#xff0c;通過在原始數據中??有放回地重復抽樣??&#xff0c;生成大量新樣本集&#xff0c;用于估計統計量&#xff08;如均值、方差&#xff09;的分布或模型性能的不確定性。 ??…

沙箱逃逸(Python沙盒逃逸深度解析)

沙箱逃逸&#xff08;Python沙盒逃逸深度解析&#xff09; 一、沙盒逃逸的核心目標 執行系統命令 通過調用os.system、subprocess.Popen等函數執行Shell命令&#xff0c;例如讀取文件或反彈Shell。 文件操作 讀取敏感文件&#xff08;如/etc/passwd&#xff09;、寫入后門文件…

融智學數學符號體系的系統解讀(之一)

融智學數學符號體系的系統解讀 一、道函數&#xff08;Dao Function&#xff09; 數學表達式&#xff1a; f(x,y,z)0&#xff08;狹義&#xff09; f(x,y,z,ict)0&#xff08;廣義&#xff09; 符號解析&#xff1a; x: 形象思維坐標軸 數學意義: 表征基于感官輸入的多模…

Java 中使用正則表達式

1. 引入包 在使用正則表達式之前,需要引入包: import java.util.regex.Matcher; import java.util.regex.Pattern; 2. 常用模式規則 元字符 :這些是正則表達式中的特殊字符,用于匹配特定的模式。 . :匹配任意單個字符(換行符除外)。例如,a.b 可以匹配 "acb&quo…

cat file.tar.gz | tar -xzf - -C /target/dir兩個減號之間為什么有個空格?是寫錯了嗎?(管道命令后續)

在 tar 命令的參數 -xzf - -C 中&#xff0c;兩個減號&#xff08;-&#xff09;之間的空格是故意保留的語法&#xff0c;沒有寫錯。具體原因如下&#xff1a; 1. -xzf - 的語法解析 -xzf 是 tar 命令的組合參數&#xff1a; x&#xff1a;表示解壓&#xff08;extract&#x…

Linux中的系統延時任務和定時任務與時間同步服務和構建時間同步服務器

延時任務 在系統中我們的維護工作大多數時在服務器行對閑置時進行 我們需要用延遲任務來解決自動進行的一次性的維護 延遲任務時一次性的&#xff0c;不會重復執行 當延遲任務產生輸出后&#xff0c;這些輸出會以郵件的形式發送給延遲任務發起者 在RHEL9中默認系統中的所有普通…

C++之IO流

目錄 一、C語言的輸入與輸出 二、流是什么 三、CIO流 3.1、C標準IO流 3.2、C文件IO流 四、stringstream的簡單介紹 一、C語言的輸入與輸出 C語言中我們用到的最頻繁的輸入輸出方式就是scanf ()與printf()。 scanf(): 從標準輸入設備(鍵盤)讀取數據&#xff0c;并將值存放…

Fedora升級Google Chrome出現GPG check FAILED問題解決辦法

https://dl.google.com/linux/linux_signing_key.pub 的 GPG 公鑰(0x7FAC5991)已安裝 https://dl.google.com/linux/linux_signing_key.pub 的 GPG 公鑰(0xD38B4796)已安裝 倉庫 "google-chrome" 的 GPG 公鑰已安裝&#xff0c;但是不適用于此軟件包。 請檢查此倉庫的…

極光PDF編輯器:高效編輯,輕松管理PDF文檔

在日常工作和學習中&#xff0c;PDF文件的使用越來越普遍。無論是學術論文、工作報告還是電子書籍&#xff0c;PDF格式因其穩定性和兼容性而被廣泛采用。然而&#xff0c;編輯PDF文件往往比編輯Word文檔更加復雜。今天&#xff0c;我們要介紹的 極光PDF編輯器&#xff0c;就是這…

MySQL進階(一)

一、存儲引擎 1. MySQL體系結構 連接層&#xff1a; 最上層是一些客戶端和鏈接服務&#xff0c;主要完成一些類似于連接處理、授權認證、及相關的安全方案。服務器也會為安全接入的每個客戶端驗證它所具有的操作權限 服務層&#xff1a; 第二層架構主要完成大多數的核心服務…

OpenCV 圖形API(67)圖像與通道拼接函數-----水平拼接(橫向連接)兩個輸入矩陣(GMat 類型)函數concatHor()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于水平拼接兩個 GMat 矩陣&#xff0c;要求輸入矩陣的行數必須一致: GMat A { 1, 4,2, 5,3, 6 }; GMat B { 7, 10,8, 11,9, 12 }; GM…

1.1 點云數據獲取方式——引言

圖1-1-1點云建筑場景圖 點云數據是指能夠描述外部場景、對象表面的三維空間位置&#xff0c;并具有相關屬性的點集&#xff0c;其每個離散點通常包括三維空間位置&#xff08;x,y,z&#xff09;以及強度、顏色等屬性信息。大量分布的離散點集能夠清晰而直接地描繪場景、對象的3…

[Verilog]跨時鐘域數據傳輸解決方案

跨時鐘域數據傳輸解決方案 摘要:跨時鐘域數據傳輸 (Clock Domain Crossing, CDC) 是 SoC 設計中常見且關鍵的問題,因為現代 SoC 通常包含多個時鐘域,不同模塊可能運行在不同頻率或相位的時鐘下。跨時鐘域傳輸數據時,如果處理不當,可能會導致亞穩態 (Metastability)…

Kotlin與Jetpack Compose的詳細使用指南

Kotlin與Jetpack Compose的詳細使用指南&#xff0c;綜合最新技術實踐和官方文檔整理&#xff1a; 一、環境配置與基礎架構 ?項目創建? 在Android Studio中選擇Empty Compose Activity模板&#xff0c;默認生成包含Composable預覽的MainActivity2要求Kotlin版本≥1.8.0&…

預訂接口優化:使用本地消息表保證訂單生成、庫存扣減的一致性

&#x1f3af; 本文介紹了一種優化預訂接口的方法&#xff0c;通過引入本地消息表解決分布式事務中的最終一致性問題。原先的實現是在一個事務中同時扣減庫存和創建訂單&#xff0c;容易因網絡不穩定導致數據不一致。改進后的方法將業務操作和消息發送封裝在本地事務中&#xf…

計算機網絡——客戶端/服務端,URI與URL的區別,以及TCP/IP核心機制全解析

文章目錄 客戶端/服務端&#xff0c;URI與URL的區別&#xff0c;以及TCP/IP核心機制全解析一、客戶端/服務端通信模型概述二、URI 與 URL 的概念與區別1. URL&#xff08;統一資源定位符&#xff09;2. URI&#xff08;統一資源標識符&#xff09;3. URI 與 URL 的關系 三、SYN…

柔性PZT壓電薄膜多維力傳感器在微創手術機器人的應用

隨著醫療技術的迅速發展&#xff0c;微創手術機器人正在成為外科手術的重要助手。與傳統開放式手術相比&#xff0c;微創手術創傷小、恢復快、感染率低&#xff0c;對手術器械的精細操控性和感知能力提出了更高要求。多維力傳感器作為機器人“觸覺”的核心部件&#xff0c;對提…

SpringAI整合DeepSeek生成圖表

利用Spring-ai-openai集成DeepSeek ①、在DeepSeek開放平臺創建API KEY ②、創建springboot項目&#xff0c;引入spring-ai-openai依賴&#xff0c;創建配置文件&#xff0c;配置deepseek的url和api key ③、具體的實現業務應用 RestController public class ChatD…