1. 程式人生 > >QEMU, KVM, QEMU-KVM 和 Goldfish

QEMU, KVM, QEMU-KVM 和 Goldfish

qemu

QEMU 是模擬器
QEMU在 在 System 模式下,能進行指令級的模擬(就是說他虛擬了一個/多個CPU(包含記憶體管理器等),比如虛擬一個ARM CPU)

可以模擬 IA-32 (x86)個人電腦,AMD64個人電腦,MIPS R4000,ARM v6, v7 (Cortex-A8, A9, A15),昇陽的 SPARC sun3 與 PowerPC(PReP 及 Power Macintosh)架構

Android 就是用 QEMU構建模擬器,在 x86主機上執行 arm 程式碼的 Android系統和程式

Oracle 的 virtual  box  就是在 QEMU的基礎上改寫的。

KVM

是一種用於Linux核心中的虛擬化基礎設施。KVM目前支援Intel VT及AMD-V的原生虛擬技術。
KVM還需要一個經過修改的QEMU軟體(qemu-kvm),作為虛擬機器上層控制和介面。
KVM能在不改變linux或windows映象的情況下同時執行多個虛擬機器,(它的意思是多個虛擬機器使用同一映象)併為每一個虛擬機器配置個性化硬體環境(網絡卡、磁碟、圖形介面卡……)。
在主流的Linux核心,如2.6.20以上的核心均已包含了KVM核心。

qemu 和 KVM 的關係

qemu自己模擬 x86的CPU 太複雜了,借用 kvm 的功能來實現更方便, 也更能提速

也可以說 kvm 缺少顯示器,硬碟等外設,就直接用 qemu 提供(前人在qemu寫下這些虛擬裝置的程式碼,正好拿來用)

但只有在 linux 上 qemu 和 kvm 才有關係,因為像windows這樣的系統下面沒有 kvm.

qemu 和 GoldFish的關係

Android 提供的模擬器是 GoldFish , 也是在 qemu基礎上改寫而成的。為何不直接使用 qemu?因為少了些東西。

一般計算機上沒有 modem, sensors 這些裝置,因此 android 擴充套件了 qemu 幫助使用者實現這些東西

Android  讓在 容器的 guest 系統(就是 android) 通過 pipe 同 主機(要模擬虛擬裝置的PC機)通訊。

具體有下面的裝置:

   "gsm"       Used to communicate with the emulated GSM modem with
               AT commands.

   "gps"       Used to receive NMEA sentences broadcasted from the
               emulated GPS device.

   "sensors"   Used to list the number of emulated sensors, as well as
               enable/disable reception of specific sensor events.

   "control"   Used to control misc. simple emulated hardware devices
               (e.g. vibrator, leds, LCD backlight, etc...)
關於pipe可看參見: external/qemu/docs/ANDROID-QEMU-PIPE.TXT

又比如:對 egl, gles 的模擬, 都是通過 QEMU PIPE 進行的,參見:sdk/emulator/opengl/DESIGN


例子:執行 Android x86 4.0

下載 Android x86 4.0映象
mkdir ~/android-x86/ && cd ~/android-x86/
wget -O android-x86-4.0.iso http://goo.gl/zDvR6


下載 Android x86映象
sudo apt-get install qemu-kvm


建立大小為1G的虛擬機器硬碟
qemu-img create ~/android-x86/android-4.0.img 1G


啟動 android-x86 (記憶體512M, cdrom, 硬碟(hda)都指定好了)
cd ~/android-x86/
kvm -m 512 -cdrom android-x86-4.0.iso -hda android-4.0.img -boot d