模擬神器之QEMU

1. 簡介

QEMU(quick emulator)是一款由法布里斯·貝拉(Fabrice Bellard)等人編寫的免費的可執行硬件虛擬化的(hardware virtualization)開源托管虛擬機(VMM)。

QEMU 是一個托管的虛擬機鏡像,它通過動態的二進制轉換,模擬CPU,并且提供一組設備模型,使它能夠運行多種未修改的客戶機OS,可以通過與KVM一起使用進而接近本地速度運行虛擬機(接近真實電腦的速度)。

QEMU還可以為user-level的進程執行CPU仿真,進而允許了為一種架構編譯的程序在另外一種架構上面運行(借由VMM的形式)。

大致介紹完就不得不介紹編寫此軟件的作者:法布里斯·貝拉

2. 法布里斯·貝拉

  1. 1972年生于法國格勒諾布爾(Grenoble)。在高中就讀期間開發了著名的可執行壓縮程序LZEXE,這是當年DOS上第一個廣泛使用的文件壓縮程序。大學就讀于巴黎綜合理工學院,后在巴黎高等電信學校攻讀。

  2. 1996年,他編寫了一個簡潔但是完整的C編譯器和一個Java虛擬機Harissa。Fabrice Bellard發明的TinyCC是GNU/Linux環境下最小的ANSI C語言編譯器,是目前號稱編譯速度最快的C編譯器。

  3. 1997年,他提出了最快速的計算圓周率的算法,是貝利-波爾溫-普勞夫公式的變體。在計算圓周率的過程中,Fabrice Bellard使用改良后的查德諾夫斯基方程算法來進行圓周率的計算,并使用貝利-波爾溫-普勞夫公式來驗證計算的結果。為了紀念他對圓周率算法所作出的杰出貢獻,Fabrice Bellard所使用的改良型算法被命名為Fabrice Bellard算法,這種算法是目前所有圓周率算法中最快的一種,這個計算N位PI的公式比傳統的BBP算法要快47%。

  4. 1998年,貝拉開發出VReng (虛擬現實引擎),這是一個分布式 3D 應用程序,運用多播技術允許通過 Internet 連接在虛擬世界中導航。之后,貝拉注意到有效的OpenGL后端是基于軟件的,比實際需求要慢很多。于是他決定基于 VReng 的代碼來編寫一個更小和更快的3D光柵。

  5. 2000年,他化名Gérard Lantau,創建了FFmpeg項目。FFmpeg單詞中的FF指的是Fast Forward,FFmpeg這個2000年發起著名的開源多媒體播放器項目,是MPlayer的姊妹項目。這是一個如此重要的成就。這個多平臺、多功能的多媒體編碼解碼器由Fabrice Bellard發起并管理,現在是由Michael Niedermayer在進行維護。

    這個項目無比強大,我們今天所熟知的視頻播放軟件,如暴風影音、QQ影音、YouTube、VLC等都使用了FFmpeg的編解碼函數庫。FFmpeg易擴展、功能強、速度快、占資源少,支持的音視頻格式極其廣泛,基本上超越了其他所有同類軟件,被譽為處理數字視頻和音頻的“瑞士軍刀”。

  6. 2002 年,貝拉發布了 TinyGL,一個 OpenGL 的子集的小型實現。TinyGL 比 Mesa 和Solaris 的OpenGL 快很多,是平臺獨立的,并且數量級比后二者小很多,總共才 400KB。這也是他在圖像處理領域取得的重要成就。

  7. 2003年,開發了Emacs克隆QEmacs

  8. 2004年,他編寫了一個只有138KB的啟動加載程序TCCBOOT,可以在15秒內從源代碼編譯并啟動Linux系統。

  9. 2005年,用普通PC和VGA卡設計了一個數字電視系統。

  10. 2005年,發布了QEMU,QEMU是一個處理器仿真,可以用軟件來模擬不同處理器體系,允許為一個特定處理器編譯的程序通過軟件仿真在另外一個體系上運行。QEMU近似于已有的Bochs、PearPC,但具有后兩者所不具備的高速及跨平臺等特性。

    📢 因為QEMU的速度之快、效率之高,它被包含在許多主要的虛擬化技術中,如 VirtualBox、Xen以及Linux Kernel-based 虛擬機(KVM)。

  11. 2009年12月31日,他聲稱打破了圓周率計算的世界紀錄,算出小數點后2.7萬億位,僅用一臺普通個人電腦。他使用的個人PC價格不到2000歐元,僅用了116天,就計算出了PI的小數點后第2.7萬億位,超過了由目前排名世界第47位的T2K Open超級計算機于2009年8月17日創造的世界紀錄。新紀錄比原紀錄多出1200億位,然而,他使用的這臺桌面電腦的配置僅為:2.93GHz Core i7 CPU,6GB內存,7.5TB硬盤。

  12. 2011年,他使用JavaScript寫了一個PC虛擬機Jslinux。這個虛擬機仿真了一個32位的x86兼容處理器,一個8259可編程中斷控制器,一個8254可編程中斷計時器,和一個16450 UART。

  13. 2012年,在PC上用軟件實現4G LTE基站。

  14. 2019年,他編寫了一款新的Javascript引擎QuickJS

貝拉的產出如此之快,質量如此之高,被譽為:

        世界上最多產的程序員(Super-ProductiveProgrammer)

3. 模式

在 qemu 的術語中,運行整個操作系統的方式,稱為 full system emulation, 在 Ubuntu/CentoS 由軟件包 qemu-system-xxx (比如qemu-system-ppc, qemu-system-aarch64, qemu-system-arm)提供功能。

運行單個程序文件的方式,稱為 user mode emulation,由軟件包qemu-user或者qemu-user-static提供功能。

3.1 Full System Emulation

虛擬整個操作系統就需要制作內核鏡像和根文件系統鏡像 [參考這篇文章]

這篇文章里,提供了兩種方法來制作根文件系統,一種是基于busybox的,另一種是基于Ubuntu的rootfs的。我采用的是busybox,比較小巧,當然也比較簡陋,很多etc配置都沒有。

編譯好的內核和根文件系統鏡像都以壓縮包的形式放在這里了 [下載地址]

可以直接拿來驗證。對于根文件系統鏡像,可以mount掛載后進行修改,但是對于內核鏡像,就不能直接修改了,所以最好還是都自己編譯一下。

接下來就是啟動虛擬機了。

qemu-system-aarch64 -cpu cortex-a57 -smp 4 -m 2048M -M virt -nographic \-kernel build_arm64/arch/arm64/boot/Image \-append "console=ttyAMA0 root=/dev/vda init=/linuxrc rw" \-drive format=raw,file=../busybox_rootfs/busybox-1.31.1-rootfs_ext4.img
  • 第一行的"cpu"指定了處理器的架構,"smp"指定了處理器的個數,"m"指定了內存的大小。
  • 第二行的"kernel"指定編譯生成的內核鏡像的存放位置,第三行的"append"是內核啟動的附加參數。
  • 第四行的"drive"指定之前制作生成的根文件系統的鏡像位置

3.2 User Mode Emulation

可以到下面的網址下載

https://github.com/multiarch/qemu-user-static/releases

在這里插入圖片描述
那什么場景會使用這個模式呢?

舉一個例子:我想在 PC 上運行 Arm的程序,也就是我的CPU是 X86_64 架構的,但是想運行 arm64 架構的程序。那么就可以通過 qemu 來運行。

$ qemu-aarch64-static hello_world
hello world!

hello_world 是編譯好的arm可執行程序。

參考文檔

  • QEMU的配置和使用
  • 用 qemu-user 在arm linux機器上運行amd64/x86程序

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

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

相關文章

X86_64平臺運行Arm docker容器

QEMU是什么 QEMU是一個通用的開源的跨平臺仿真模擬器,提供user和system兩種模式。其模擬的作用可是可以模擬在特定的體系結構下的應用的執行或者構建,比如在x86的體系結構的操作系統上運行ARM的應用。 常見問題的場景 在ARM體系結構的硬件環境中安裝D…

Go 條件編譯

接觸過C/C++編程的應該一定知道條件編譯。通常為了滿足不同環境下使用不同的代碼,從而在編譯的時候進行選擇性的編譯,達到最佳的泛用性。 例如: #define WINDOWS #ifdef WINDOWS # include <windows.h> #elif defined LINUX # include <sys/types.h> # includ…

Boost Arm 交叉編譯

Boost Arm 交叉編譯 1. 源碼下載 下載地址&#xff1a;https://sourceforge.net/projects/boost/files/boost/ 這里下載 1.74.0 版本 然后解壓。 2. 配置 有些庫我們是不需要的&#xff0c;所以就不需要編譯&#xff0c;可以通過 -show-libraries 查看庫列表 vincentmsi-…

為什么Linux會開機黑屏?

有的童鞋由于工作的需要&#xff0c;或者想體驗一把無廣告的世界&#xff0c;會去嘗試使用Linux的發行版&#xff0c;但是經常被Linux拒之門外&#xff0c;甚至連系統到裝不上&#xff0c;當然這個現象也在越來越少&#xff0c;只有更多的人去使用它&#xff0c;它才會變的更好…

Golang跨平臺UI框架之Wails(一)

Golang作為后端、腳手架、API服務等很常見,但Go不僅僅局限于此,它的目標是星辰大海!本系列文章就開始講解如何使用Go來構建現代化的桌面級程序。 1. 初識Wails Wails 是一個框架,可使用 Go 和 Web 技術編寫桌面應用程序。我們先來欣賞一下美圖: Go官方是不支持寫帶有GUI…

Linux安裝NVIDIA顯卡驅動的正確姿勢

文章目錄Linux安裝NVIDIA顯卡驅動的正確姿勢什么是nouveau驅動&#xff1f;檢測NVIDIA驅動是否成功安裝集顯與獨顯的切換使用標準倉庫進行自動化安裝使用**PPA**倉庫進行自動化安裝使用官方的NVIDIA驅動進行手動安裝常見問題解決Linux安裝NVIDIA顯卡驅動的正確姿勢 可能想玩Li…

Linux安裝CUDA的正確姿勢

Linux安裝CUDA的正確姿勢 CUDA&#xff08;Compute Unified Device Architecture&#xff0c;統一計算架構&#xff09;是由NVIDIA所推出的一種集成技術&#xff0c;是該公司對于GPGPU的正式名稱。 透過這個技術&#xff0c;用戶可利用NVIDIA的GeForce 8以后的GPU和較新的Qua…

Linux升級內核的正確姿勢

Linux升級內核的正確姿勢 很多童鞋在玩耍linux發行版的時候&#xff0c;都會遇到各種各樣的問題&#xff0c;比如&#xff1a;網卡不能使用&#xff0c;亮度不能調節&#xff0c;觸摸板不能識別&#xff0c;藍牙不能使用等等&#xff0c;這些關系都和linux的內核有關系。 什么…

Ubuntu 18.04安裝NVIDIA(英偉達) RTX2080Ti顯卡

Ubuntu 18.04安裝NVIDIA&#xff08;英偉達&#xff09; RTX2080Ti顯卡 在安裝顯卡之前請先把ubuntu 18.04系統提前安裝好。 需要準備的資料&#xff1a; NVIDIA 驅動 下載驅動 驅動的下載地址&#xff0c;在此下載頁面選擇合適的顯卡&#xff0c;目前最新的顯卡驅動版本是…

Ubuntu18.04安裝cuDNN和Tensorflow的正確姿勢

文章目錄Ubuntu18.04安裝cuDNN和Tensorflow的正確姿勢一、檢查NVIDIA驅動是否安裝成功二、檢查CUDA是否安裝成功三、安裝cuDNN1. 確定版本2. 下載安裝包3. 解壓安裝4. 安裝libcupti四、安裝Tensorflow1. 確定版本2. 安裝pip3. 安裝Tensorflow4. 檢查是否正常運行五、錯誤解決1.…

HttpServletResponse應用 的 簡單介紹

HttpServletResponse是專門用于HTTP協議的ServletResponse接口&#xff0c;它用于封裝HTTP響應消息&#xff0c;允許操控HTTP協議相關數據&#xff0c;包括響應頭和狀態碼&#xff0c;支持Cookies和session跟蹤&#xff0c;HttpServletResponse也定義了一系列用于描述各種HTTP狀…

移動站應該嘗試百度MIP的五個原因

MIP 是什么&#xff1f;MIP 是百度在 2016 年提出的移動網頁加速器項目。 MIP 能做什么&#xff1f;MIP 能幫助站長和網站開發者快速搭建移動端頁面。 MIP 怎么加速&#xff1f;MIP 從前端渲染和頁面網絡傳輸兩方面進行優化&#xff0c;杜絕頁面渲染中的阻塞問題&#xff0c;…

Vim從理解到應用

1991 年&#xff0c;來自荷蘭的一名工程師 Bram Moolenaar 為了在他的Amiga計算機上復制Vi的功能&#xff0c;正式發布 了Vim的第一個版本。在當時無論誰也沒想到&#xff0c;這款軟件未來能在技術圈爆發出那么大的威力&#xff0c;為千千萬萬的工程師節省了無數時間&#xff0…

如何用百度MIP快速搭建體驗友好的移動頁面

在讀這篇文章之前&#xff0c;請確定你已經了解 MIP 定義及加速原理。如果不確定的話&#xff0c;可以到 MIP 官網了解。 改造前期準備和注意事項: 你可以選擇直接將原先的移動站點直接改成 MIP 站&#xff0c;也可以單獨再做一套 MIP 站點與移動站并存。 復雜的頁面暫不建議…

JAVA知識基礎(一):數據類型

在我們學習一門編程語言時&#xff0c;最先要了解的就是數據類型&#xff0c;而數據類型又都是抽象的概念&#xff0c;初學者理解起來比較困難&#xff0c;所以我們往往是先應用再理解&#xff0c;但是在本篇文章我決定用先理解再應用的方式嘗試一下&#xff0c;試試效果。 1、…

百度MIP移動頁面加速——不只是CDN

MIP 是用 CDN 做加速的么&#xff1f;準確答案是&#xff1a;是&#xff0c;但不只是。 MIP 全稱 Mobile Instant Pages&#xff0c;移動網頁加速器&#xff0c;是百度提出的頁面加速解決方案。MIP 從前端渲染和頁面網絡傳輸兩方面進行優化&#xff0c;杜絕頁面渲染中的阻塞問…

JAVA知識基礎(二):基本語法

本篇主要介紹JAVA的運算符、循環結構以及條件結構。 1、JAVA運算符 計算機的最基本用途之一就是執行數學運算&#xff0c;作為一門計算機語言的Java也提供了一套豐富的運算符來操縱變量。 JAVA運算符可以大致概括為幾類&#xff1a;算術運算符、關系運算符、位運算符、邏輯運…

JAVA知識基礎(三):修飾符

JAVA中根據修飾對象的不同可以分為類修飾符、方法修飾符、變量修飾符三類&#xff0c;其中每種修飾符又可以單獨分成兩類&#xff1a;訪問修飾符和非訪問修飾符。為了便于理解&#xff0c;本文以訪問和非訪問的角度展開。 1、訪問修飾符 訪問修飾符有四個&#xff1a;public、…

百度推出新技術 MIP,網頁加載更快,廣告呢?

MIP 項目在 2016 年年初正式發布&#xff0c;幫助移動頁面加速&#xff08;原理&#xff09;。內測數據表明&#xff0c;MIP 頁面在 1s 內加載完成。現在已經有十多家網站加入 MIP 項目&#xff0c;有更多的網站正在加入中。在MIP收到的反饋中&#xff0c;大部分都提到了廣告的…

JAVA知識基礎(四):深入理解static關鍵字

1、static存在的主要意義 static的主要意義是在于創建獨立于具體對象的域變量或者方法。以致于即使沒有創建對象&#xff0c;也能使用屬性和調用方法&#xff01; static關鍵字還有一個比較關鍵的作用就是 用來形成靜態代碼塊以優化程序性能。static塊可以置于類中的任何地方…