1. 程式人生 > >QEMU搭建arm linux環境

QEMU搭建arm linux環境

為什麼會有這篇文章

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

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

link1link2,link3link4link5)並被社群接納了。

最近在梳理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直接下載核心程式碼樹,方便後面的核心開發。另一種是直接到核心社群下載穩定版本(詳見:https://www.kernel.org/pub/linux/kernel/v4.x/)下面演示從Linux kernel主線下載程式碼進行編譯

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

整個下載過程會持續個小時左右,有足夠時間來泡杯茶


安裝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 /path/to/kernel/dir/arch/arm/boot/zImage -dtb  /path/to/kernel/dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

這裡的 /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 不使用圖形化介面,只使用串列埠

-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目錄(根目錄),根檔案系統內的檔案全部放到這裡

mkdir -p rootfs/{dev,etc/init.d,lib}

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 -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd a9rootfs.ext3

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


寫在後面的話

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

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

相關推薦

QEMU搭建arm linux環境

為什麼會有這篇文章 早在2011年的時候,跟當時同事一起討論,做Linux系統開發正處於整個Linux開發中間層,沒有上層的C/C++業務和資料庫的開發經驗,也沒有底層的核心和驅動開發經驗,到底路該如何走……基於對Linux系統開發的理解和核心的興趣,認為選擇Linux

通過buildroot+qemu搭建ARM-Linux虛擬開發環境

inux http lex .org linux 通過 clone .gz download 1. 配置工作環境 sudo apt install gcc build-essential bison flex gettext tcl sharutils libncur

Qemu搭建ARM vexpress開發環境(二)----通過u-boot啟動Linux核心

Qemu搭建ARM vexpress開發環境(二)----通過u-boot啟動Linux核心 標籤(空格分隔): Qemu ARM Linux 在上文《Qemu搭建ARM vexpress開發環境(一)》中已經簡單講述了通過Qemu模擬直接啟動Linux核心,並掛在SD卡根檔案系統的方法,這種方法是直接啟動

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

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

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

為什麼會有這篇文章 早在2011年的時候,跟當時同事一起討論,做Linux系統開發正處於整個linux開發中間層,沒有上層的C/C++業務和資料庫的開發經驗,也沒有底層的核心和驅動開發經驗,到底路該如何走……基於對Linux系統開發的理解和核心的興趣,認為選擇Linux核心開發更適合自己。於

Ubuntu 16.04(64bit)嵌入式交叉編譯環境搭建arm-linux-gcc使用

1.把壓縮包arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz放在一個資料夾下,然後在終端進入到該資料夾,將該壓縮包解壓到所需的目錄下(我解壓在了根目錄下) 下面是tar命令的描述 2.然後改變環境變數,能使arm-lin

Qemu搭建ARM vexpress開發環境(三)----NFS網路根檔案系統

Qemu搭建ARM vexpress開發環境(三)----NFS網路根檔案系統 標籤(空格分隔): Qemu ARM Linux 經過上一篇《Qemu搭建ARM vexpress開發環境(二)----通過u-boot啟動Linux核心》,已經實現了通過u-boot載入Kernel啟動開發板,並且掛載根檔案系

JDK1.10+scala環境搭建linux環境(centos6.9)

ava header 執行 2.6 準備 img error: .com html ---恢復內容開始--- 第一步:安裝jdk1.10版本 進入網頁 http://oracle.com/technetwork/java/javase/downloads/index.h

交叉編譯arm Linux環境下的android-tools-adb

前言     專案使用Rockchip的3399挖掘機demo板,使用官方提供的Debian Linux SDK(官方github原始碼連結:https://github.com/rockchip-linux)進行開發定製。當前需要將Android上的除錯工具adb移

(一)大資料生態圈叢集搭建之 --Linux環境準備

搭建準備工作 本地機環境 準備安裝包 虛擬機器工具 連線工具 上傳工具 CentOS虛擬機器環境搭建 通用配置 靜態IP配置 時間同步配置 JDK環境配置

使用 qemu 搭建核心開發環境

本文主要介紹在 MacOS 上使用 qemu 搭建 Linux Kernel 的開發環境。(在開始之前需要注意的是,本文中的 Linux 開發環境是一個遠端伺服器,而 qemu 被安裝在本地的 MacOS 上。通常並不需要這樣折騰,直接將 qemu 安裝在 Linux 中更加方便,而且 qemu 是

centos7.2中搭建ARM開發環境所需工具初體驗

需要用到的工具: 編譯工具:arm-linux-gcc  連結工具:arm-linux-ld 格式轉換工具:arm-linux-objcopy 反彙編器:arm-linux-objdump 檔案資訊檢視:arm-linux-readelf 下載工具:dnw 除錯工具:ar

ARM+linux環境下程式的開發和燒錄

一  方法一( 串列埠通訊 ):         1.  在PC開發端的linux環境中寫好原始碼。         2.  使用交叉編譯器arm-linux-gcc編譯之。         3.  用超級終端或者DNW建立ARM開發板與PC開發端的連線給ARM開發

關於GNU ARM → GNU MCU Eclipse的強行翻譯——eclipse下搭建arm開發環境_(1)

我先致敬一波大神,總是有人跟我一樣,不是計算機專業卻整天想搞個大新聞首先宣告,本人翻譯在翻譯專業中應稱作意譯,所以有不同意見歡迎討論====================老子就是正文分割線===============================GNU MCU Ecli

使用Buildroot與Qemu學習ARM linux IIC驅動

Buildroot配置 下載最新的buildroot,然後進入 buildroot中進行配置 make mini2440_defconfig make xconfig 進入到Ker

基於QEMU搭建完整的虛擬ARM開發環境(uboot+linux+rootfs)

主機環境:ubuntu 16.04虛擬機器,目標機器:QEMU模擬vexpress-a9。------------------------------------------------一、準備工作安裝qemu, 交叉編譯工具等略過。[email protected

arm-linux-gcc環境搭建

over asp gpg linux 4.4 mkdir isp play gin 安裝libncurses5-dev 使用apt-get安裝apt-get install libncurses5-dev 安裝arm-linux-gcc 參考:Ubuntu 12.0

嵌入式交叉編譯環境arm-linux-gcc環境搭建

arm linux gcc 嵌入式交叉編譯環境 準備工具安裝目錄 可以去官網下載對應系統版本的arm-Linux-gcc。將壓縮包arm-linux-gcc-4.4.3.tar.gz存放在一個目錄下。 .tar.gz 和.tgz 解壓:tar zxvf FileName.tar.gz 壓縮:t

Linux搭建arm交叉編譯環境

首先需要在網上搜索arm-linux-gcc-4.3.2.tgz 傳到Linux下,執行tar xzvf arm-linux-gcc-4.3.2.tgz -C/ 解壓到根目錄下(目錄結構/usr/local/arm/4.3.2) 這樣,編譯器就解壓到了Linux系統中 然後建立

arm-linux-gcc編譯環境搭建

記錄下來,方便以後查詢 1.解壓 sudo tar -xvlf arm-linux-gcc-4.4.3.tar.gz 2.建立目錄 sudo mkdir /usr/local/arm_4.43 3.把解壓的東西移動到剛剛新建的目錄 sudo mv /opt/F