1. 程式人生 > >Qemu下u-Boot + Kernel + rootfs完整啟動移植

Qemu下u-Boot + Kernel + rootfs完整啟動移植

對於Ubuntu12.04系統,首先要安裝如下的庫檔案,不然在後續的移植過程中會出錯

1、zlib庫

sudo apt-get install zlib1g-dev

2、glib庫的安裝

1)在Ubuntu下,通過如下命令來獲取glib庫,命令為:git clone https://git.gnome.org/browse/glib

2)下載完後,進入glib庫所在的目錄。cd ~/glib/

3)執行sh autogen.sh檔案,產生configure配置檔案

4) ./configure                           #執行指令碼`configure' 

5) make                                   # 構建GLIB庫
6)如果必要,切換到root使用者下,接著執行如下命令:

rm -rf /install-prefix/include/glib.h /install-prefix/include/gmodule.h
make install   

3、autoreconf

sudo apt-get install autoconf

4、libsdl1.2

一、安裝Qemu

解壓安裝:

1)新建一個資料夾,用於安裝qemu
[email protected]:/opt$ sudo mkdir /opt/qemu_bin

2)配置
[email protected]:~/Debug_Kernel/qemu-1.7.0$./configure --prefix=/opt/qemu_bin --target-list="arm-softmmu arm-linux-user x86_64-linux-user x86_64-softmmu" --enable-debug
其中 --prefix表示qemu安裝的目錄,--target-list表示表示qemu模擬的CPU架構,此處選擇支援arm和x86_64 CPU。

加入arm-linux-user後,在對應安裝的目錄下才會生成qemu-arm檔案,不然沒有。

可以通過[email protected]:~/Debug_Kernel/qemu-1.7.0$ ./configure -help來看配置選項

3)make

在該過程中出現瞭如下錯誤:
錯誤1:
(cd /home/fantasy/Debug_Kernel/qemu-1.7.0/pixman; autoreconf -v --install)
/bin/sh: 1: autoreconf: not found
make: *** [/home/fantasy/Debug_Kernel/qemu-1.7.0/pixman/configure] Error 127

解決方法:
sudo apt-get install autoconf


錯誤2:
configure.ac:75: error: possibly undefined macro: AC_PROG_LIBTOOL
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.

解決方法:
缺少libtool庫
sudo apt-get install libtool

4)make install

這樣在/opt/qemu_bin目錄下就生成了如下的檔案:


其中qemu-arm用來執行ARM二進位制檔案,qemu-system-arm用來啟動AMR OS。

二、Qemu模擬ARM

使用Qemu主要有兩個目的,一是用來執行執行arm程式,另一個是boot和執行arm kernel

對於第一種情況,可以執行利用qemu來執行和測試arm程式,而不需要安裝arm os或kernel,qemu的這種特性非常有用,和節省時間。

對於第二種情況,可以用於boot用於arm的Linux kernel。

1. 第一種情況,利用Qemu來執行ARM程式

現在,開始開發一個簡單的測試程式,我們都知道,開發運行於Intel CPU上的程式,需要用的是x86工具鏈,因此,若開發運行於ARMCPU上的程式,則需要用arm工具鏈。從如下地址下載:

1)下載下來後,解壓:tar -xvfarm-2013.11-33-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

2)進入bin目錄:cd arm-2013.11/bin,如下圖


3)設定環境變數:

       a)開啟/etc/profile檔案,命令:sudo vim /etc/profile

       b)在其中加入arm工具鏈的bin檔案所在的路徑,即:exportPATH=$PATH:~/my_workplace/arm-tool-chain/arm-2013.11/bin

4)執行一下命令:source /etc/profile,則到此arm工具鏈就可以使用了。

以下測試一下工具鏈的使用。

1) 首先建立一個簡單的測試程式test.c,程式碼如下:

#include <stdio.h>

int main()
{
	printf("Welcome to the Open World!\n");
	return 0;
}


2) 執行arm-none-linux-gnueabi-gcc test.c-o test進行編譯

3) 編譯成功後,在當前目錄下生成一個test檔案,利用file命令來檢視test檔案的屬性,從顯示的結果來看,是用於執行ARM平臺的可執行檔案,如下圖所示

 

4) 執行test可執行檔案,執行如下命令:

qemu-arm -L~/my_workplace/arm-tool-chain/arm-2013.11/arm-none-linux-gnueabi/libc ./test

在執行該程式時,必須連結到ARM庫,其中–L即用於連結ARM庫。

       輸出如下圖所示:


2.第二種情況,利用Qemu來啟動ARM的Linux kernel。

首先,來學習一下U-Boot, 對於ARM處理器,U-Boot是用於bootloader最好的選擇,U-boot可以用於不同的CPU架構,像PPC,MIPS,x86等等。

1)下載和編譯U-Boot

2)解壓,命令為:

tar -jxvf u-boot-2010.03.tar.bz2 

3)進入解壓後的資料夾中,命令:

cd u-boot-2010.03/

4)針對ARM平臺進行編譯,使其適合用於ARM處理器,

配置U-boot用於特定的板子(此處versatilepb),執行如下命令:

make versatilepb_config arch=ARM CROSS_COMPILE=arm-none-linux-gnueabi-

如下圖:


5)編譯U-Boot,命令為:

make all arch=ARM CROSS_COMPILE=arm-none-linux-gnueabi-

6)在Qemu中執行U-Boot,命令為:

qemu-system-arm -M versatilepb -nographic -kernel u-boot.bin

執行結果如下:


適用於ARM平臺的kernel的編譯

1)下載核心,解壓,我下載的核心版本為(linux-3.13.5)

# tar -jxvf linux-3.13.5.tar.bz2

2)  配置核心,

# cd linux-3.13.5

# make menuconfig ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

會出現如下錯誤:

scripts/kconfig/mconf.o: Infunction `show_help':

mconf.c:(.text+0x8a4): undefinedreference to `stdscr'

解決方法:

sudoapt-get install libncurses5  libncurses5-dev

指定了架構為ARM,同時呼叫ARM工具鏈來構建核心,在Kernel Features導航視窗中,使能“Use the ARM EABI to compilethe kernel”(EABI是Embedded Application BinaryInterface),若該項沒選,則核心將無法載入test程式。

 

修改Kernel用於U-Boot載入

由於我們是基於U-Boot來載入核心,應該需要對Kernel進行修改,由於Kernel zImage與U-Boot不相容,所以我們使用uImage來替代,uImage對Kernel Image的頭進行了修改,以支援U-Boot。

編譯Kernel,選擇構建uImage用於U-Boot(編譯時需要指定架構和ARM工具鏈)

# make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage -s

若按這個命令編譯,會出現如下錯誤:

multiple (or no) load addresses: 
This is incompatible with uImages
Specify LOADADDR on the commandline to build an uImage
make[1]: *** [arch/arm/boot/uImage] Error 1
make: *** [uImage] Error 2

解決辦法:

執行如下編譯命令:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- LOADADDR=0x80008000 uImage -s

編譯好後,就生成了uImage檔案,通過file命令來檢視uImage檔案的屬性,如下圖:

接著,在Qemu上測試uImage,結果如下圖所示:

。。。


參考資料:

Git參考資料:

相關推薦

Qemuu-Boot + Kernel + rootfs完整啟動移植

對於Ubuntu12.04系統,首先要安裝如下的庫檔案,不然在後續的移植過程中會出錯 1、zlib庫 sudo apt-get install zlib1g-dev 2、glib庫的安裝 1)在Ubu

第三期 QEMU除錯U-Boot實驗 《虛擬機器就是開發板》

        這一期註定會很簡短,簡短的意義就在於使用模擬器做某些事情確實很快捷。這一期我們使用QEMU來模擬執行U-Boot,大家對U-Boot應該都不陌生,相當於Linux的學前班,U-Boot的資料結構定義和驅動模型定義都採用Linux風格,在研究Linux核心前

U-boot從tftp伺服器啟動,掛載到NFS根檔案系統

在uboot輸入設定下面的變數: # mac address可以使用uboot目錄tools下的gen_eth_addr工個來產生 setenv ethaddr <mac address>

U-boot在S3C2440上的移植詳解

U-boot在S3C2440上的移植詳解 一、移植環境 ·                                主機:VMWare--Fedora 9 ·                                開發板:Mini2440--64M

(二)U-boot在開發板上移植過程詳解--bootloader架構分析

 本例中採用的同樣是前邊一貫的實驗板,這裡就不對板子資源做進一步介紹了。     我們知道,bootloader是系統上電後最初載入執行的程式碼。它提供了處理器上電覆位後最開始需要執行的初始化程式碼。在PC機上載入程式一般由BIOS開始執行,然後讀取硬碟中位於MBR(Main Boot Record,主引

qemu 模擬-arm-mini2440開發板-啟動u-bootkernel和nfs檔案系統

qemu 本文介紹瞭如何編譯u-boot、linux kernel,然後用qemu啟動u-boot和linux kernel,達到與開發板上一樣的學習效果! 雖然已經買了2440開發板,但是在實際學習開發過程中,還是覺得不方便,既然這樣,那就用qemu模擬2440開發板,

如何在Ubuntu使用TF/SD 卡製作Exynos 4412 u-boot啟動

/** ****************************************************************************** * @author    Maoxiao Hu * @version   V1.0.1 * @date       Feb-2015 *****

如何在Mac使用TF/SD 卡製作Exynos 4412 u-boot啟動

/** ****************************************************************************** * @author    Maoxiao Hu * @version   V1.0.1 * @date       Dec-2014 ****

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

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

linuxweblogic11g成功安裝後,啟動報錯Getting boot identity from user

tro ace author reason tac ica ons pst pri <2015-7-1 下午05時46分33秒 CST> <Info> <Management> <BEA-141107> <Versi

u-boot學習(五):u-boot啟動內核

cor 定義 嵌入式 code efi cpu 頭文件 ng- part u-boot的目的是啟動內核。內核位於Flash中,那麽u-boot就要將內核轉移到內存中。然後執行命令執行之。這些操作是由bootcmd命令完畢的。 bootcmd=nand read.jffs

u-boot-201611 啟動過程分析——基於smdk2410

u-bootu-boot-201611 啟動過程分析——基於smdk2410

u-boot延時程序失效的bug調試

val boot 結果 dump pre spa quest pri 默認 最近在工作中的一個項目中,大概是將兩塊板卡相連(一塊STM32跑裸機程序,另一塊AM335x跑Linux系統),但是發現在u-boot有時無法啟動成功,需要通過一個GPIO的狀態來判斷,具體來說就是

buildroot構建項目(四)--- u-boot 2017.11 適配開發板修改 2 ---- 系統啟動初始化之一

鏈接 extc 信號 分析 col clock -h 17.1 標誌位 一、代碼分析   上一節已經分析了鏈接文件,知道了首先代碼是從 _start 開始,之後設置了中斷向量表,然後從 start.s 開始運行。 _start:vectors.S (arch\arm\li

buildroot構建項目(五)--- u-boot 2017.11 適配開發板修改 4 ---- 系統啟動初始化之三

vid def include cmp ble soft setup.s bubuko 賦值 一、內存控制器   在關閉了MMU和caches 之後 就進入lowlevel_init 函數,對內存控制器進行初始化。lowlevel_init.S (board\samsung

buildroot構建項目(七)--- u-boot 2017.11 適配開發板修改 4 ---- 系統啟動初始化之四

ack tar span mov tel 變量初始化 清零 ppi ntb   設置完寄存器控制器後,則跳出cpu_init_crit,進入_main 函數。即進入crt0.S (arch\arm\lib)   跟著代碼流程慢慢走 一、crt0.S 1.1 第一步執行代碼

u-boot啟動、編譯過程和命令添加

U-BOOTu-boot的啟動、編譯過程和命令添加MCU:s5pv210開發板:unsp210u-boot:1.3.4一、簡介U-Boot是一種支持多架構,多操作系統的Bootloader(啟動引導程序)u-boot目前最新版本是:http://ftp.denx.de/pub/u-boot/二、啟動過程嵌入式

u-boot.2012.10——mini2440(二、啟動流程分析)

我們 分享 默認 從數據 中斷 改變 處理 mini2440 https 參考資料:https://blog.csdn.net/suiyuan19840208/article/details/7239949 1、第一階段功能   * 硬件設備初始化   * 加載u-boot

u-boot之NAND啟動與NOR啟動的區別

lse 讀寫 long ash 直接 分析 lsh 地址 判斷 nand啟動與nor啟動的區別主要分為以下幾部分說明: 1、nand flash與nor flash的最主要區別 2、s3c2440的nand啟動與nor啟動原理 3、nand啟動與nor啟動的時候uboot做

qemu模擬vexpress-a9及u-boot引導 linux

brctl data ket netd pre dong busybox 網絡 vsftpd 前言 本文講述使用 qemu 來模擬 vexpress-a9 開發板 ,同時介紹使用 u-boot 引導 linux 的流程。整個坐下來對 qemu 和 u-boot 以及嵌入式