qemu 環境搭建

2021-08-09 07:15:29 字數 4637 閱讀 8099

早在2023年的時候,跟當時同事一起討論,做linux系統開發正處於整個linux開發中間層,沒有上層的c/c++業務和資料庫的開發經驗,也沒有底層的核心和驅動開發經驗,到底路該如何走……基於對linux系統開發的理解和核心的興趣,認為選擇linux核心開發更適合自己。於是到**上買了塊三星s3c2440(arm 9)開發板,學起核心開發。沒有過多久,機緣巧合,正式加入了公司的核心開發部。就這樣跟核心和arm打上交道了。

沒有想到這一做就是3年了,arm晶元只有在公司才能使用,回到家裡就不能訪問了。去年(2014)開始覺得做核心久了,應該向核心社群提交patch,提公升知名度和影響力。但在公司提交patch不方便,於是在家裡通過qemu方式搭建於arm a9的執行環境,進行開發和測試驗證,一口氣提交了好幾個patch(link1, link2, link3, link4, link5)並被社群接納了。

最近在梳理linux記憶體機制,無論是《深入理解linux核心》還是《深入理解核心架構》這兩本紅寶書都無法告知你每個細節的時候,就需要檢視**細節,修改**,甚致做行為分析。此時需要修改**輸出除錯資訊,以幫助更深入體會**的邏輯。這該是qemu派上場的時候。

其實我前前後後搭建qemu+arm的執行環境已超過5次了,每次都要花上很多時間。碰巧昨天有同事看到我再次搭建,他如搭珍寶,告訴我一定要將搭建qemu的方法告訴他。

所以,如果你想買個開發板來做arm + linux嵌入式開發,完全可以使用qemu進行開發。或者你像我一樣,對核心機制關心,而不關心於具體的外設器件,最多是關心arm架構相關的功能,也可以使用qemu進行開發。

一句話:搭建qemu+arm環境,用於做核心開發和功能分析除錯。

我整個搭建過程都是在筆記本上進行的,ubuntu 12.04系統;如果是fodera環境,搭建過程可能略有不同,但關鍵步驟是不變的。

qemu模擬得最好的arm晶元,要數arm公司的vexpress a9開發板了,本文的搭建過程都是圍繞這個開發板進行的。當然,如果你想搭其它開發板,也不難,只要qemu和核心對它有成熟的支援就夠了。

下面是step by step的搭建過程,建議沒有特別訴求的朋友,按照下在面的步驟操作。或者先根據下面的步驟成功搭建vexpress執行環境之後,再根據自己的需求進行更改。

git clonegit:

想必做嵌入式開發的朋友,對交叉編譯工具鏈不陌生。如果你訂製乙個交叉編譯工具鏈,建議你使用crosstool-ng開源軟體來構建。但在這裡建議直接安裝arm的交叉編譯工具鏈:

sudo apt-get install gcc-arm-linux-gnueabi

生成vexpress開發板子的config檔案:

make cross_compile=arm-linux-gnueabi- arch=arm vexpress_defconfig

編譯:make cross_compile=arm-linux-gnueabi- arch=arm

生成的核心鐿像位於arch/arm/boot/zimage, 後續qemu啟動時需要使用該映象。

wget

配置qemu前,需要安裝幾個軟體包:

sudo apt-get install zlib1g-dev

sudo apt-get install libglib2.0-0

sudo apt-get install libglib2.0-dev

配置qemu,支援模擬arm架構下的所有單板:

./configure –target-list=arm-softmmu –audio-drv-list=

編譯和安裝:

make

make install

qemu已經安裝好了,核心也編譯成功了,到這裡最好是測試一下,編譯出來的核心是否ok,或者qemu對vexpress單板支援是否夠友好。

執行命令很簡單:

qemu-system-arm -m vexpress-a9 -m 512m -kernel/path/to/kernel/dir/arch/arm/boot/zimage -dtb/path/to/kernel/dir/arch/arm/boot/

這裡的/path/to/kernel/dir/

如果看到核心啟動過程中的列印,說明前面的搭建是成功的。

這裡簡單介紹下qemu命令的引數:

-m vexpress-a9 模擬vexpress-a9單板,你可以使用-m ?引數來獲取該qemu版本支援的所有單板

-m 512m 單板執行物理記憶體512m

-kernel/path/to/kernel/dir/arch/arm/boot/zimage  告訴qemu單板執行核心映象路徑

-nographic 不使用圖形化介面,只使用串列埠

注意:我每次搭建,都忘了核心啟動引數中的console=引數應該填上哪個tty,因為不同單板串列埠驅動型別不盡相同,建立的tty裝置名當然也是不相同的。那vexpress單板的tty裝置名是哪個呢? 其實這個值可以從生成的.config檔案config_console巨集找到。

如果搭建其它單板,需要注意核心啟動引數的console=引數值,同樣地,可從生成的.config檔案中找到。

到這裡是否大功告成了呢? 其實在上面的測試中,你會發現核心報panic,因為核心找不到根檔案系統,無法啟init程序。

根檔案系統要考慮兩個方面:

1. 根檔案系統的內容

如果你看過《linux from scratch》,相信你會對這一步產生恐懼感,但如果一直從事嵌入式開發,就可以放下心來。根檔案系統就是簡單得不能再簡單的幾個命令集和態動態而已。為什麼linux from scratch會有那麼複雜,是因為它要製作出乙個linux發生版。但在嵌入式領域,幾乎所有的東西,都是mini版本,根檔案系統也不例外。

本文制本的根檔案系統 = busybox(包含基礎的linux命令)  + 執行庫 + 幾個字元裝置

2. 根檔案系統放在**

其實依賴於每個開發板支援的儲存裝置,可以放到nor flash上,也可以放到sd卡,甚至外部磁碟上。最關鍵的一點是你要清楚知道開發板有什麼儲存裝置。

本文直接使用sd卡做為儲存空間,檔案格式為ext3格式

wget

make defconfig

make cross_compile=arm-linux-gnueabi-

make install cross_compile=arm-linux-gnueabi-

安裝完成後,會在busybox目錄下生成_install目錄,該目錄下的程式就是單板執行所需要的命令。

先在ubuntu主機環境下,形成目錄結構,裡面存放的檔案和目錄與單板上執行所需要的目錄結構完全一樣,然後再打包成映象(在開發板看來就是sd卡),這個臨時的目錄結構稱為根目錄

1.  建立rootfs目錄(根目錄),根檔案系統內的檔案全部放到這裡

mkdir -p rootfs/

2. 拷貝busybox命令到根目錄下

sudo cp busybox-1.20.2/_install/* -r rootfs/

3. 從工具鏈中拷貝執行庫到lib目錄下

sudo cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib/

4. 建立4個tty端終裝置

sudo mknod rootfs/dev/tty1 c 4 1

sudo mknod rootfs/dev/tty2 c 4 2

sudo mknod rootfs/dev/tty3 c 4 3

sudo mknod rootfs/dev/tty4 c 4 4

1. 生成32m大小的映象

dd if=/dev/zero of=a9rootfs.ext3 bs=1m count=32

2. 格式化成ext3檔案系統

mkfs.ext3 a9rootfs.ext3

3.  將檔案拷貝到映象中

sudo mkdir tmpfs

sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop

sudo cp -r rootfs/*  tmpfs/

sudo umount tmpfs

完成上述所有步驟之後,就可以啟動qemu來模擬vexpress開發板了,命令引數如下:

qemu-system-arm -m vexpress-a9 -m 512m -kernel/path/to/kernel/dir/

arch/arm/boot/zimage -dtb

/path/to/kernel/dir/

arch/arm/boot/dts/vexpress-v2p-ca9.dtb

從核心啟動列印,到命令列提示符出現,激動人心的時刻出現了……

通過上面的步驟,搭建出來乙個最小的qemu+arm開發環境,你可以上面的基礎上修改核心,或者增加一些測試程式在單板上執行,甚至使用單板的flash裝置。

在此,你可以做純arm架構的核心開發,或者與架構無關的核心開發,也可以做單板相關的驅動開發。

最後的最後:本文已經過多次修改,如果各位讀者按照本文方法搭建遇到問題,還請各位反饋給我(lyt2008bj at 163 dot com),我會修改直至完全成功。

利用Qemu搭建核心除錯環境

一 核心除錯的原理 傳統除錯核心需要配置兩台linux主機,其中一台主機稱為開發機,另一台主機稱為目標機。開發機中除了有乙個可執行的linux環境,還應包含必要的開發環境 gcc gdb make等 以及核心原始碼,目標機則需要能夠啟動核心並掛載乙個有效的檔案系統,可以將執行在目標機中待除錯核心稱為...

使用 qemu 模擬器搭建 arm 執行環境(一)

一.流程 1 安裝交叉編譯工具鏈 2 安裝 qemu 模擬器 3 編譯 arm 架構 u boot 4 用 u boot 測試 qemu 是否正常啟動 二.原理 qemu 是乙個在 linux 上廣泛使用的可以模擬 arm 的模擬器。在進行嵌入式系統的開發時,執行程式的目標平台通常具有有限的儲存空間...

從零使用qemu模擬器搭建arm執行環境

再續 從零使用qemu模擬器搭建arm執行環境 早在2011年的時候,跟當時同事一起討論,做linux系統開發正處於整個linux開發中間層,沒有上層的c c 業務和資料庫的開發經驗,也沒有底層的核心和驅動開發經驗,到底路該如何走 基於對linux系統開發的理解和核心的興趣,認為選擇linux核心開...