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

爲什麼會有這篇文章

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


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


近期在梳理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執行環境之後。再依據自己的需求進行更改。


下載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

1
<span style="font-family:'Microsoft YaHei'"><span style="font-size:18px">sudo apt-get install libglib2.0-dev</span></span>


配置qemu,支持模擬arm架構下的全部單板:

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


編譯和安裝:

make

make install


測試qemu和內核是否能執行成功

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

執行命令非常easy:

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 CROSS_COMPILE=arm-linux-gnueabi-


安裝完畢後。會在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/tty2c 4 2

sudo mknod rootfs/dev/tty3c 4 3

sudo mknod rootfs/dev/tty4c 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架構的內核開發。或者與架構無關的內核開發,也能夠做單板相關的驅動開發。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章