1. 簡介
QEMU(quick emulator)是一款由法布里斯·貝拉(Fabrice Bellard)等人編寫的免費的可執行硬件虛擬化的(hardware virtualization)開源托管虛擬機(VMM)。
QEMU 是一個托管的虛擬機鏡像,它通過動態的二進制轉換,模擬CPU,并且提供一組設備模型,使它能夠運行多種未修改的客戶機OS,可以通過與KVM一起使用進而接近本地速度運行虛擬機(接近真實電腦的速度)。
QEMU還可以為user-level的進程執行CPU仿真,進而允許了為一種架構編譯的程序在另外一種架構上面運行(借由VMM的形式)。
大致介紹完就不得不介紹編寫此軟件的作者:法布里斯·貝拉
2. 法布里斯·貝拉
-
1972年生于法國格勒諾布爾(Grenoble)。在高中就讀期間開發了著名的可執行壓縮程序LZEXE,這是當年DOS上第一個廣泛使用的文件壓縮程序。大學就讀于巴黎綜合理工學院,后在巴黎高等電信學校攻讀。
-
1996年,他編寫了一個簡潔但是完整的C編譯器和一個Java虛擬機Harissa。Fabrice Bellard發明的TinyCC是GNU/Linux環境下最小的ANSI C語言編譯器,是目前號稱編譯速度最快的C編譯器。
-
1997年,他提出了最快速的計算圓周率的算法,是貝利-波爾溫-普勞夫公式的變體。在計算圓周率的過程中,Fabrice Bellard使用改良后的查德諾夫斯基方程算法來進行圓周率的計算,并使用貝利-波爾溫-普勞夫公式來驗證計算的結果。為了紀念他對圓周率算法所作出的杰出貢獻,Fabrice Bellard所使用的改良型算法被命名為Fabrice Bellard算法,這種算法是目前所有圓周率算法中最快的一種,這個計算N位PI的公式比傳統的BBP算法要快47%。
-
1998年,貝拉開發出VReng (虛擬現實引擎),這是一個分布式 3D 應用程序,運用多播技術允許通過 Internet 連接在虛擬世界中導航。之后,貝拉注意到有效的OpenGL后端是基于軟件的,比實際需求要慢很多。于是他決定基于 VReng 的代碼來編寫一個更小和更快的3D光柵。
-
2000年,他化名Gérard Lantau,創建了FFmpeg項目。FFmpeg單詞中的FF指的是Fast Forward,FFmpeg這個2000年發起著名的開源多媒體播放器項目,是MPlayer的姊妹項目。這是一個如此重要的成就。這個多平臺、多功能的多媒體編碼解碼器由Fabrice Bellard發起并管理,現在是由Michael Niedermayer在進行維護。
這個項目無比強大,我們今天所熟知的視頻播放軟件,如暴風影音、QQ影音、YouTube、VLC等都使用了FFmpeg的編解碼函數庫。FFmpeg易擴展、功能強、速度快、占資源少,支持的音視頻格式極其廣泛,基本上超越了其他所有同類軟件,被譽為處理數字視頻和音頻的“瑞士軍刀”。
-
2002 年,貝拉發布了 TinyGL,一個 OpenGL 的子集的小型實現。TinyGL 比 Mesa 和Solaris 的OpenGL 快很多,是平臺獨立的,并且數量級比后二者小很多,總共才 400KB。這也是他在圖像處理領域取得的重要成就。
-
2003年,開發了Emacs克隆QEmacs。
-
2004年,他編寫了一個只有138KB的啟動加載程序TCCBOOT,可以在15秒內從源代碼編譯并啟動Linux系統。
-
2005年,用普通PC和VGA卡設計了一個數字電視系統。
-
2005年,發布了QEMU,QEMU是一個處理器仿真,可以用軟件來模擬不同處理器體系,允許為一個特定處理器編譯的程序通過軟件仿真在另外一個體系上運行。QEMU近似于已有的Bochs、PearPC,但具有后兩者所不具備的高速及跨平臺等特性。
📢 因為QEMU的速度之快、效率之高,它被包含在許多主要的虛擬化技術中,如 VirtualBox、Xen以及Linux Kernel-based 虛擬機(KVM)。
-
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硬盤。
-
2011年,他使用JavaScript寫了一個PC虛擬機Jslinux。這個虛擬機仿真了一個32位的x86兼容處理器,一個8259可編程中斷控制器,一個8254可編程中斷計時器,和一個16450 UART。
-
2012年,在PC上用軟件實現4G LTE基站。
-
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程序