歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 從零使用QEMU模擬器搭建ARM運行環境

從零使用QEMU模擬器搭建ARM運行環境

日期:2017/2/28 14:00:20   编辑:Linux教程

為什麼會有這篇文章

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

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

9c986661638c69772f5479c4715061239ec61b29

c2459d35f5b8de077fde859b8c96a23f309b9ab2

20cb6abfe0062693183eb2a85f7c73792e96407f

207a6cb06990c298d0eac982e053d370e216d93d

279f487e0b471577e2b3c134e2ff9af939129d0f

最近在梳理Linux內存機制,無論是《深入理解Linux內核》還是《深入理解內核架構》這兩本紅寶書都無法告知你每個細節的時候,就需要查看代碼細節,修改代碼,甚致做行為分析。此時需要修改代碼輸出調試信息,以幫助更深入體會代碼的邏輯。這該是qemu派上場的時候。

深入理解Linux內核(第三版)(英文版+中文版) 下載見 http://www.linuxidc.com/Linux/2011-08/41228.htm

其實我前前後後搭建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運行環境之後,再根據自己的需求進行更改。

下載Linux內核

下載內核有兩種方法,一種是用git直接下載內核代碼樹,方便後面的內核開發。另一種是直接到內核社區下載對應版本的源碼包。我采用第一種方法,但後面發現主線上3.18版本和後面版本的代碼,使用這種搭建方法運行不起來。目前未查明問題的根因。如果讀者想快速搭建成功,建議選用3.16版本的內核進行搭建。

方法一:使用git

git clonegit://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

方法二:直接下載3.16源代碼包

wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.tar.xz

安裝arm的交叉編譯工具鏈

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

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

編譯Linux內核

生成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啟動時需要使用該鏡像。

下載和安裝qemu模擬器

其實Ubuntu 12.04有qemu的安裝包,但由於版本較低,對vexpress開發板支持不友好,建議下載高版本的qemu:

wget http://wiki.qemu-project.org/download/qemu-2.0.2.tar.bz2

配置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和內核能否運行成功

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

運行命令很簡單:

qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/ivan/kernel_git/linux/arch/arm/boot/zImage -nographic -append "console=ttyAMA0"

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

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

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

-m 512M 單板運行物理內存512M

-kernel /home/ivan/kernel_git/linux/arch/arm/boot/zImage 告訴qemu單板運行內核鏡像路徑

-nographic 不使用圖形化界面,只使用串口

-append "console=ttyAMA0" 內核啟動參數,這裡告訴內核vexpress單板運行,串口設備是哪個tty。

注意:

我每次搭建,都忘了內核啟動參數中的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格式

下載、編譯和安裝busybox

wget http://www.busybox.net/downloads/busybox-1.20.2.tar.bz2

make defconfig

make CROSS_COMPILE=arm-linux-gnueabi-

make install

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

形成根目錄結構

先在Ubuntu主機環境下,形成目錄結構,裡面存放的文件和目錄與單板上運行所需要的目錄結構完全一樣,然後再打包成鏡像(在開發板看來就是SD卡),這個臨時的目錄結構稱為根目錄 1. 創建rootfs目錄(根目錄),根文件系統內的文件全部放到這裡

sudo mkdir 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 mknodrootfs/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

cp -r rootfs/* tmpfs/

sudo umount tmpfs

系統啟動運行

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

qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/ivan/qemu/linux/arch/arm/boot/zImage -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd a9rootfs.ext3

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

寫在後面的話

通過上面的步驟,搭建出來一個最小的qemu+arm開發環境,你可以上面的基礎上修改內核,或者增加一些測試程序在單板上運行,甚至使用單板的flash設備。 在此,你可以做純arm架構的內核開發,或者與架構無關的內核開發,也可以做單板相關的驅動開發。

Linux入門學習教程:虛擬機體驗之QEMU篇 http://www.linuxidc.com/Linux/2015-03/114461.htm

Ubuntu 12.04之找不到Qemu命令 http://www.linuxidc.com/Linux/2012-11/73419.htm

Arch Linux上安裝QEMU+EFI BIOS http://www.linuxidc.com/Linux/2013-02/79560.htm

QEMU的翻譯框架及調試工具 http://www.linuxidc.com/Linux/2012-09/71211.htm

QEMU 代碼分析:BIOS 的加載過程 http://www.linuxidc.com/Linux/2014-12/110472.htm

QEMU 的詳細介紹:請點這裡
QEMU 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved