Qemu 有兩種使用方式,用戶模式和全系統模式。這篇文章會給出兩個簡單示例便于理解這兩種模式。和上篇文章一樣,這篇文章也是以使用者的角度來學習 Qemu 的使用,并不深究 Qemu 的原理。
用戶模式
在展示 Qemu 的用戶模式之前,可以簡單的了解一下交叉編譯。
交叉編譯
交叉編譯是什么?
粗淺的解釋一下,交叉編譯就是幫別的平臺編譯程序,編譯出來的程序本身不能運行。接下來要展示的示例就是在 PC (intel 架構)機器上編譯出可以在 ARM 架構下運行,但不能在 PC 上直接運行的程序,需要在 PC 上借助 Qemu 模擬運行。
為什么需要交叉編譯?
有時是因為目的平臺上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器的某些特征;有時是因為目的平臺上的資源貧乏,無法運行我們所需要編譯器;有時又是因為目的平臺還沒有建立,連操作系統都沒有,根本談不上運行什么編譯器。 -- 來自百度百科
安裝交叉編譯工具鏈
C 語言代碼從源碼轉變成可執行程序大致可以分為四個步驟:預處理、編譯、匯編、鏈接四個步驟,可以簡單的理解為每一步都有一個相應的程序。平常我們接觸的 gcc 這個工具一步就可以完成,這是因為 gcc 就是個工具鏈,把源碼轉換中的各個程序按照一定的步驟連了起來,方便使用,很形象的稱為工具鏈。當在 PC(Intel)要編譯 ARM 的程序時,就需要安裝 ARM 的工具鏈了,當這個編譯鏈工具編譯出來的程序是供其他平臺使用的就叫做交叉編譯工具鏈。
aldrin@aldrin-PC:~/QemuTest$ sudo apt-get install gcc-arm-linux-gnueabi
Qemu 用戶模式執行
安裝完成后就可以寫個簡單的 hello_world 程序測試一下了:
// arm_main.c
#include
int main(){
printf("Hello, World!\n");
return 0;
}
使用剛剛安裝的交叉編譯工具簡單編譯一下:
arm-linux-gnueabi-gcc arm_main.c
此時這個程序并不能在當前計算機中執行,需要利用 Qemu 進行模擬執行:
aldrin@aldrin-PC:~/QemuTest$ qemu-arm -L /usr/arm-linux-gnueabi a.out
效果如下:

可以看到直接執行會提示不能執行該二進制文件。而在使用 Qemu 模擬的過程中使用了 -L /usr/arm-linux-gnueabi 參數,這是因為編譯時采用的是非靜態編譯,這種情況下 printf 函數的實現并沒有被編譯進程序中,執行時需要相應平臺的一些動態庫及進行配合,例如 printf 函數的實現就在 libc.so 中,所以需要告訴 Qemu 執行的時候去什么地方找相應的動態庫。
如果是靜態編譯,也就是把用到的函數直接編譯進程序,此時執行并不需要動態庫。
arm-linux-gnueabi-gcc -static -o static_a.out arm_main.c
-static 含義就是進行靜態編譯,完成后執行效果如下:

作為一個使用教程,用戶模式就介紹的到這里,只是為了展示,目前有個感性的認識就可以。所涉及到的動態編譯、靜態編譯等這些知識有興趣可以自行了解,順手推薦一本書《程序的自我修養-鏈接、裝載與庫》。小弟我在這方面的功力尚淺。
全系統模式
模擬硬盤
在上篇文章完成 Qemu 的安裝之后的簡單測試中發現 Qemu 提示 No bootable device 即沒有可引導的設備。這里我先簡單說下原因,后續會詳細解釋計算機的引導過程。計算機在啟動之后執行完寫死在主板上的代碼之后就要加載其他的代碼了,通俗點說就是去哪找用戶寫的代碼。現在就有問題了,從哪里加載?目前我們最常用的可以斷電后保存數據的就是硬盤了,而恰巧現在沒有模擬硬盤,這個時候 Qemu 找了一圈發現當前硬盤沒有、其他規定好可存放引導代碼的硬件都沒有,只能無奈提示用戶當前沒有可以用來引導的設備。
通過上面的描述我們已經知道大致感性的理解了提示信息的含義,解決方法也比較簡單,就是利用 Qemu 自帶的工具模擬一個硬盤供 Qemu 使用。
aldrin@aldrin-PC:~$ mkdir QemuTest
aldrin@aldrin-PC:~$ cd QemuTest/
aldrin@aldrin-PC:~/QemuTest$ qemu-img create -f qcow2 qemu_test.qcow2 1G
Formatting 'qemu_test.qcow2', fmt=qcow2 size=1073741824 cluster_size=65536 lazy_refcounts=off refcount_bits=16
為了之后方便創建一個 QemuTest 目錄進行操作,qemu-img create -f qcow2 qemu_test.qcow2 1G 該命令就是模擬一個名稱為 qemu_test.qcow2, 大小為 1G 的硬盤。-f 后面的 qcow2 是格式,這個可以先忽略。
接下來讓 Qemu 使用模擬的硬盤進行啟動:
aldrin@aldrin-PC:~/QemuTest$ qemu-system-i386 -hda qemu_test.qcow2
看下效果:

和上篇文章展示的差不了多少,細心觀察紅色方框中的提示信息 Boot failed: not a bootable disk , 不是一個可以引導的硬盤。而上篇文章圖片同樣的位置提示的是 Boot failed: could not read the boot disk ,無法讀取引導硬盤,可以理解為找不到硬盤。這說明現在已經有硬盤了但是由于硬盤中沒有任何信息,導致系統無法開始引導。后續如何讓硬盤可引導就是寫代碼和學習硬盤相關的知識了。本來想寫個測試用例,后來想了想還是先介紹硬盤相關的知識吧。
總結
到這里 Qemu 的基礎使用就介紹的差不多了,可能沒什么深度不過對我以后的大部分場景使用已經夠了,能力有限,見諒,但我的觀點是學習的時候不追求大而全,有些東西夠用就行。就拿 Qemu 來說,如果深入研究 Qemu 的話就有點本末倒置了,目的一定要明確:學習操作系統,輔助工具會用就行。 有任何問題、批評可以直接留言。
|