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

2021-06-28 02:36:27 字數 4639 閱讀 1083

再續【從零使用qemu模擬器搭建arm執行環境】

早在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/

這裡的/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

console=ttyama0

"-sd a9rootfs.ext3

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

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

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

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

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

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

開源Cortex M模擬器QEMU的使用方法

qemu是開源 跨平台 支援多種目標架構的模擬器,包括cortex m架構。開源cortex m模擬器qemu支援兩款開發板,分別為stellaris lm3s811evb和stellaris lm3s6965evb。原文 mingdu.zhengatgmaildotcom 這裡給出ubuntu下的...

使用QEMU模擬搭建ARM開發平台

tags qemu 安裝交叉編譯工具鏈 將下列源新增到 etc apt sources.list或在 etc apt sources.list.d 目錄下新建乙個檔案debian arm toolchain.list。emdebian cross toolchains deb unstable ma...