qemu 模擬-arm-mini2440開發板-啟動u-boot,kernel和nfs文件系統【轉】


轉自:http://www.cnblogs.com/riskyer/p/3366001.html

qemu
本文介紹了如何編譯u-boot、linux kernel,然后用qemu啟動u-boot和linux kernel,達到與開發板上一樣的學習效果!

 

雖然已經買了2440開發板,但是在實際學習開發過程中,還是覺得不方便,既然這樣,那就用qemu模擬2440開發板,讓學習來的更方便些吧!有些萬一模擬機上模擬不出來的或者有問題的,再到開發板上驗證!

下面是我5天正常上班工作之余的時間的成果,很開心,因為我感覺又像linux大神邁進了一大步!10/12/20139:13:23 PM

 

 

qemu-mini2440
 

http://repo.or.cz/w/qemu/mini2440.git

這個可以在windows下模擬mini2440,核心及全部外設,液晶包括其中。可以在程序窗口

中顯示。還可以模擬sd卡,以及DM9000網卡驅動,可以映射到本地虛擬網卡上。

 

Get a local copy of the mini2440 repository with this command:

git clone https://code.google.com/p/mini2440/

git clone git://repo.or.cz/qemu/mini2440.git

 

mini2440 u-boot

git clone git://repo.or.cz/u-boot-openmoko.git

 

 

使用qemu 建立mini2440的模擬仿真環境

 

http://www.cnblogs.com/jinmu190/archive/2011/03/21/1990698.html

1.    首先下載安裝qemu for mini2440

git clone git://repo.or.cz/qemu/mini2440.gitqemu

如果感覺速度慢,直接打包下載

http://repo.or.cz/w/qemu/mini2440.git/snapshot/HEAD.tar.gz

解壓后,源代碼的主目錄中:

$  ./configure--target-list=arm-softmmu --prefix=/usr/local/qemu/mini2440

$  make -j4

$  sudo make install

(其中--prefix=/usr/local/qemu/mini2440表示install的目錄;make -j4表示4個目標同時構建,jobs=4,一般來說編譯速度會更快些)

然后將bin路徑添加到環境變量中方便使用qemu-system-arm

 

可能出現的錯誤:

Error: zlib checkfailed:sudo apt-get install zlib1g-dev

ERROR: QEMU requiresSDL or Cocoa for graphical output:sudo apt-get -y installlibsdl-dev

 

 

下面兩種方法都可以實現mini2440在qemu上運行,使用的qemu都是上面步驟1生成安裝的,不能apt-get install,自動安裝的對mini2440單板不支持。

 

測試安裝結果:

我們可以從QEMU下載頁面中下載arm-test-0.2.tar.gzhttp://wiki.qemu.org/download/arm-test-0.2.tar.gz這是ARM Linux 2.6的測試內核和initrd磁盤鏡像(感謝Paul Brook)。

 

方法一:

2.   下載u-boot for mini2440

git clone git://repo.or.cz/u-boot-openmoko/mini2440.gitu-boot

或者打包下載

http://repo.or.cz/w/u-boot-openmoko/mini2440.git/snapshot/HEAD.tar.gz

(注意采用打包下載的時候這幾個包的文件名可能相同,注意區分)解壓后,配置Makefile文件,打開Makefile文件,CROSS_COMPILE變量賦值,即自己所使用的交叉編譯工具鏈,比如我的是arm-linux-,保存退出,找不到就不用改,另外(編譯uboot的時候,大家可以將設置初始IP的代碼修改為自己想要的IP,比如和自己主機IP一個網段,以方便以后的實驗))輸入

$     make mini2440_config

$     make -j4

幾分鍾編譯完成后,即在當前目錄下生成名為 u-boot.bin 的文件,注意如果想在之后使用u-boot 的nfs下載文件功能,需要將net/nfs.c文件中的NFS_TIMEOUT = 2UL修改為 NFS_TIMEOUT = 20000UL 否則會造成nfs文件下載失敗。

然后將u-boot.bin文件拷貝到qemu-mini2440/mini2440文件夾下。將tools/mkimage加到環境變量中,kernel生成uImage需要使用此工具。

 

3.   下載 linux kernelfor mini2440

git clone git://repo.or.cz/linux-2.6/mini2440.gitkernel

(可以使用原mini2440開發板的內核源代碼)

$     make mini2440_defconfig ARCH=arm

$     make -j4 ARCH=arm CROSS_COMPILE=arm-linux- uImage

之后會在arch/arm/boot/目錄下生成uImage 文件,將此文件復制到qemu目錄下的mini2440文件夾下,並將mini2440文件夾中的mini2440_start.sh作如下修改

添加cmd的 kernel 行為-kernel "$base/uImage" \,回到上層目錄后運行

$     sh mini2440/mini2440_start.sh

 

網上說這時應該看到qemu啟動后進入了u-boot界面下,輸入命令

#   bootm

就會看到linux內核啟動的畫面。

Bullshit!!!!!!!!

讓我一步步分析,最多進得去u-boot界面,但怎么可能看得見內核啟動畫面??!!

 

但是根據實際情況是看不見linux啟動畫面的,下面我們看看mini2440_start.sh做了哪些工作?

首先創建一個dd if=/dev/zero of="$name_nand" bs=2112 count=65536為128MB的nand flash鏡像文件(包含OOB),但是此nand flash根本沒有初始化,里面為全0x00,根本無法運行起來,想要運行起來情況方法二的flashing工具。

后面就是啟動模擬器了:

qemu-system-arm-M mini2440 -serial stdio -mtdblock mini2440/ mini2440_nand128.bin -show-cursor-usb -usbdevice keyboard -usbdevice mouse -net nic,vlan=0 -net tap,vlan=0,ifname=tap0-monitor telnet::5555,server,nowait

此處經常報錯Could not initialize device 'tap',網上給了一堆無用答案,實際上是要初始化一個虛擬網卡,看方法二。

其他的就不想分析了,此處就提供方法二qemu-system-arm多種實用參數吧!

 

 

方法二:

QEMU模擬FriendlyArm的Mini2440開發板

本文基於的開發環境是Ubuntu10.04和buildroot-2012.05.tar.gz。(其他版本的環境可能會出很多問題,所以編譯u-boot和kernel時統一用此buildroot中的交叉編譯工具)

 

2.      下載編譯Buildroot (2012.05)

一般說來,我們需要三樣東西來正常啟動一個嵌入式操作系統:引導程序(bootloader),內核鏡像和根文件系統鏡像。那我們是不是接下來需要下載一個bootloader(比如u-boot,supervivi之類),編譯之;下載任意版本的linux內核,編譯之(當然要適配mini2440);一點一點生成自己的根文件系統,再制作成jffs2,yaffs2之類的格式呢?編譯這三樣東西的交叉編譯工具鏈Cross-compiler toolchain 要制作。

交叉編譯工具鏈和根文件系統都是一點一點制作。。。,很費時間()。雖然我們在制作根文件系統時是可以偷懶使用Busybox這樣的“瑞士軍刀”,但是還不夠方便,Buildroot,一款超好用的開源軟件,能一次過幫我們把交叉編譯工具鏈和三樣東西都生成出來。

首先我們下載Buildroot,Buildroot項目每三個月就有一個新版本,但是最好是使用buildroot-2012.05.tar.gz,其他較新版本會出很多錯,最后會說到。首先我們安裝wget這個小工具,便於下載Buildroot:

$ sudo apt-get install wget

接着下載Buildroot:

$ cd ~

$ wget http://buildroot.org/downloads/buildroot-2012.05.tar.gz

$ tar zxvf buildroot-2012.05.tar.gz

或者到buildroot主頁http://buildroot.uclibc.org/download.html下載http://buildroot.uclibc.org/downloads/buildroot-2012.05.tar.bz2

在讓Buildroot為我們生成三個鏡像前,需要對其進行一些配置。Mini2440開發板的基本所需配置已經集成在Buildroot里了(眾多defconfig文件中的一個),省了不少功夫。在此基礎上,我們只需再進行少許配置,就可以讓Buildroot開工了。

我們選取mini2440_defconfig來生成我們的.config文件,再用make menuconfig 進一步配置:

$ cd buildroot-2012.05

$ make mini2440_defconfig

$ make menuconfig

一個方便的配置窗口會跟着出現,是基於Kconfig的配置機制:

以下列出比較重要的幾個編譯選項,需要改動的幾項用紅色表示:

- Toolchains :在Toolchains目錄里,Kernel Headers須要選取Linux內核版本的適配的編譯鏈版本。默認是設置為3.3.x。后面的Kernel(內核版本)我使用的是3.3.7,所以沒問題,這里不用改也可以。當然也可以使用諸如3.0.x這樣的版本,只要跟之后的Kernel版本適配就好了。

- Bootloaders :默認是U-boot,也可以選用其他版本的Bootloader。本文就用默認的U-boot。

- Kernel :Kernel version默認是3.0.4,因為之前Toolchains目錄選擇的是3.3.x版本,所以這里須要改選,比如3.3.7版本。

- Package Selection for the target :Target packages中Busybox已經包含在里面了,我們也可以選擇更多的項目,比如Qt,EFL,directfb之類的圖形庫。在Graphic libraries and application子目錄里選擇。

- Filesystem images :本文中使用的是jffs2格式的根文件系統(也是Buildroot默認的),因為之后要制作NAND鏡像,所以需要配置成一個每頁512字節和16字節的ECC的NAND類型。在Flash Type這項,改為NAND flash with 512B Page and 16 KB erasesize。

這些都配置好之后,就可以請出我們最喜歡的命令了-- make :

$ make

此時你可以倒杯茶,或者可以烤一只雞。。。總之干點別的,讓Buildroot忙活去吧。如果中間出現錯誤,一般是沒裝必要的東西,照錯誤提示安裝就好,然后接着make。

如果一切順利,make 結束后,在buildroot-2012.05目錄的output/images/子目錄下可以找到生成的三個文件:

- u-boot.bin :bootloader的鏡像

- uImage :u-boot格式的(用mkimage命令生成的)Linux內核鏡像

- rootfs.jffs2 :jffs2格式的根文件系統鏡像(這個工程默認用的是jffs2根文件系統)

至此,Buildroot完成了他艱巨的任務,可以讓他一邊休息去了。我們進入下面的系統制作和啟動部分。

如果我們想用其中的工具,可以將/work/qemu/buildroot-2012.05/output/host/usr/bin加入到環境變量中。

另外,此工具中的linux源碼解壓到了:buildroot-2012.05/output/build/linux-3.3.7目錄。

也可以用dl目錄中的linux-3.3.7.tar.bz2,然后用下面兩條命令對其進行編譯,是一樣的。

$       make mini2440_defconfigARCH=arm                                使用默認配置

$       make menuconfigARCH=arm                   配置內核的時候要帶選項

$       make -j4 ARCH=armCROSS_COMPILE=arm-linux- uImage                                編譯內核

待會兒就知道,這個目錄有多帥,默認就可以在qemu中正確運行^_^

 

 

3.      在QEMU中運行編譯好的系統

a)        生成NAND鏡像並初始化

在開始前,先說一下:如果你想要比較快捷的話,可以直接去看d)、強大的工具-- Flashimg,Flashimg是一個不錯的軟件,可以使用內核鏡像,bootloader鏡像和根文件系統鏡像快速生成NAND或NOR文件。共享在git 上面,http://gitorious.org/flashimg

如果在QEMU里生成NAND的話,會花不少時間。所以我們可以利用閑置的內存(RAM)--  tmpfs

$ mkdir nand

$ sudo mount -t tmpfs none nand/

我們接下來將從零開始生成一個NAND鏡像文件。一般NAND的大小我們可以設定成64MB (NOR鏡像文件一般設為2MB)。我們來做一下簡單的計算:要生成一個64MB的NAND,每個塊是512字節,還要加上16字節的ECC,所以每個塊是528字節。總共需要的塊數是:(64 * 1024 * 1024) / 528 = 127100

用dd 命令來生成一個NAND鏡像:

$ dd if=/dev/zero of=nand/nand.bin bs=528 count=127100

我們現在有了一個NAND鏡像文件了,接下來要使用u-boot來初始化它。我們需要首先將Buildroot替我們生成的u-boot.bin 文件拷貝到nand.bin 相同的文件夾下:

$ cp ~/buildroot-2012.05/output/images/u-boot.bin ~/nand/

啟動U-boot以便進行NAND的初始化:

$ qemu-system-arm -M mini2440 -serial stdio -mtdblocknand/nand.bin

U-boot啟動了,並且會顯示一些Warning信息:

NAND: Bad block table not found for chip 0

Bad block table not found for chip 0

64 MiB

*** Warning - bad CRC or NAND, using default environment

別擔心,顯示這些信息很正常,因為我們的NAND文件還沒初始化呢。接下來初始化:

MINI2440 # nand scrub

MINI2440 # nand createbbt

MINI2440 # reset

至此,我們的NAND文件已經准備好了。現在可以將其從tmpfs拷貝到電腦硬盤,然后卸載掉tmpfs。

$ cp nand/nand.bin .

$ sudo umount nand/

$ rmdir nand

 

b)       基於NFS啟動

這里插進一段用NFS啟動的實做。

在嵌入式開發階段,通常我們會操作一個掛載在NFS上的系統,這樣更加方便,快捷,無需每次都燒寫NAND或NOR文件。接下來我們用NFS啟動系統:

之前在~/buildroot-2012.05/output/images/  這個目錄里,除了生成rootfs.jffs2文件外,還生成了rootfs.tar文件,是根文件系統的壓縮文件包。我們在/srv 文件夾下新建一個nfsroot文件夾以儲存解壓的根文件系統:

$ sudo mkdir /srv/nfsroot/

$ cd /srv/nfsroot/

$ sudo tar xvf ~/buildroot-2012.05/output/images/rootfs.tar

接着需要在/etc/exportfs 文件里增加以下一行,使NFS能認識/srv/nfsroot/這個目錄:

/srv/nfsroot/ 192.168.42.0/24(rw,sync,no_root_squash,no_subtree_check)

使其生效:

$ sudo exportfs -r

然后,我們生成並配置一個 tap0 接口:

$ sudo tunctl -u $USER -t tap0

$ sudo ifconfig tap0 192.168.42.1

此時ifconfig發現多了一塊網卡。

(當啟動qemu使用了-net nic -nettap,ifname=tap0參數時,報錯warning: could not configure /dev/net/tun: no virtual network emulationCould not initialize device 'tap',就需要按照上面方法配置一下網卡,這才是正解,網上給出的答案又麻煩又無效;但是記住,經過此設置后,ubuntu是無法連接外網的,此設置重啟后無效)

現在我們已經可以來啟動QEMU了,不過在此之前,還要將uImage也拷貝到HOME目錄(nand.bin 已經在HOME目錄了):

$ cd ~

$ cp ~/buildroot-2012.05/output/images/uImage .

Ok,我們啟動QEMU+NFS:

$ qemu-system-arm -M mini2440 -serial stdio -mtdblocknand.bin -kernel uImage -net nic -net tap,ifname=tap0,script=no,downscript=no

MINI2440 # setenv bootargs root=/dev/nfs rw nfsroot=192.168.42.1:/srv/nfsroot/ip=192.168.42.2

MINI2440 # bootm

輸入Buildroot的密碼,默認是root, 此時系統啟動了,可以看到QEMU的窗口和可愛的Linux小企鵝。

 

c)        基於NAND鏡像啟動

因為以之前的a)生成的nand.bin來繼續生成最終版的nand.bin(還要往里面添加u-boot.bin,uImage和rootfs.jffs2)過程太過繁瑣且容易出錯,在此我就不贅述了,可以參看網上的相關文章。我們直接用一個更強大的工具來生成最終版的nand.bin 。更方便,且不容易出錯。

 

d)       強大的工具 -- Flashimg

如前面時提到的,flashimg是一個由網友FabriceJouhaud 開發的軟件,可以很快捷地生成NAND或NOR鏡像文件。我們首先下載flashimg:

$ git clone git://gitorious.org/flashimg/flashimg.git

編譯安裝

$ ./autogen.sh

$ ./configure

$ make

$ sudo make install

 

要生成NAND或NOR鏡像文件,可以先把之前Buildroot替我們生成的三個文件:u-boot.bin, uImage和rootfs.jffs2 拷貝到flashimg文件夾下,生成NAND或NOR鏡像文件:

$       flashimg -s64M -t nand -f nand.bin -p uboot.part -w boot,u-boot.bin -w kernel,uImage -w root,rootfs.jffs2-z 512

$       flashimg-s 2M -t nor -f nor.bin -p uboot.part -w boot,u-boot.bin -w kernel,uImage -w root,rootfs.jffs2

 

最后,啟動系統,我們以NAND文件為例:

$       qemu-system-arm-M mini2440 -serial stdio -mtdblock nand.bin -usbdevice mouse

 

啟動之后,還需要配置一下(其中mini2440=3tb 是為了使屏幕分辨率成為320*240,橫向顯示。默認是240*320,是豎着的)

MINI2440 # nboot kernel

MINI2440 # setenv bootargs root=/dev/mtdblock3rootfstype=jffs2 console=ttySAC0,115200 mini2440=3tb

MINI2440 # saveenv

MINI2440 # bootm

 

輸入Buildroot的密碼,默認是    root

我們再一次看到了親切的小企鵝。

 

(用Vmware 6.5.2build-156735 | ubuntu-10.04.2-dvd-i386.iso | qemu-system-arm QEMU PC emulator version0.10.50 | buildroot-2012.05.tar.gz測試通過,如果不使用圖形界面運行正常,需要使用圖形界面就要用ssh登陸后啟動2440系統一次,然后虛擬機中啟動2440系統,才能成功看見小企鵝,交替運行,否則報錯:Floating point exception;

使用buildroot-2013.08.1.tar.bz2時,kernel中后不斷出錯:WARNING:at drivers/mtd/nand/nand_base.c:846 nand_wait+0x14c/0x16c()  [<c0148ff8>] (jffs2_flush_wbuf_gc+0xb8/0x13c)from [<c002a9b0>] (process_one_work+0x10c/0x350))

 

 

實際使用過程中的說明:

1、qemu-system-arm -M mini2440 -serial stdio -mtdblock nand.bin -usbdevicemouse 在nand.bin中可以不需要u-boot.bin,在當前執行這條命令的文件夾下有u-boot.bin即可,一開始進入的u-boot是當前目錄下的u-boot.bin。

2、用jz2440的u-boot.bin可以在menu中f選項格式化nandflash文件nand.bin。

3、u-boot中可以使用tftp下載文件到內存,使用tftp是只需要設置服務器IP即可,自己的ip設置后無法ping通。使用u-boot中的tftp前提是按照b)中設置網卡和啟動方式。

4、在啟動qemu時如果出現錯誤Floating point exception (core dumped),可以添加-nographic選項,在通常情況下,Qemu使用SDL來顯示VGA輸出.使用這個選項,我們可以禁止所有的圖形輸出,這樣Qemu只是一個簡單的命令行程序.模擬的串口將會重定向到命令行.所以,我們仍然可以在Qemu平台上使用串口命令來調試Linux內核.

5、帶網絡功能,不帶圖形界面的啟動命令:qemu-system-arm -M mini2440-serial stdio -mtdblock nand.bin -usbdevice mouse -kernel uImage -net nic -net tap,ifname=tap0,script=no,downscript=no-nographic

我真發現我是個天才!!嘿嘿嘿嘿,qemu上模擬2440開發基本全部搞定,u-boot/kernel/nfs文件系統10/12/2013 8:58:58 PM

6、u-boot可以與主機tftp的設置為:ipaddr=10.0.0.111           serverip=10.27.100.117           tap0 10.27.100.200                   不在一個網段,不知道為什么,現在能用就行了

7、開發板nfs訪問虛擬機,ifconfig 10.0.0.111                    mount -t nfs -o nolock 10.27.100.117:/work/nfs/nfsroot/work                   如果mount:mounting 10.27.100.117:/work/nfs/nfsroot on /mnt failed: Permission denied       則修改服務器的/work/nfs/nfsroot/10.27.100.117/24(rw,sync,no_root_squash,no_subtree_check)    的ip地址為*即可。

8、進入u-boot后以nfs掛載跟文件系統:setenv bootargs 'noinitrdmem=64M console=ttySAC0 root=/dev/nfs nfsroot=10.27.100.117:/work/nfs/nfsrootip=10.0.0.111'      以后開發應用程序或者驅動模塊就方便了。

9、

 

 

 

 

 

 

 

 

 

qemu 調試
調試U-Boot

 

當調用QEMU時添加 -s 和-S 選項

•-s -gdbtcp::1234 的所寫

•-S 在啟動時停止CPU (鍵入'c'才會開始執行)

$ qemu-system-arm -M versatilepb -nographic-kernel u-boot -s -S

 

調試U-Boot時,加載文件'u-boot'到gdb(記住不是'u-boot.bin'),'u-boot'是一個ELF格式的文件,它含有所有調試時會用到的符號信息,不像'u-boot.bin'是在執行"stripe"命令后,剔除了調試信息的文件。另開一個控制台窗口執行ARM的交叉調試工具並加載文件'u-boot':

$ arm-none-linux-gnueabi-gdb u-boot

(gdb) target remote :1234

(gdb) b do_printenv

Breakpoint 1 at 0x10080f4: file cmd_nvedit.c, line 147.

(gdb) c

Continuing.

 

此時在QEMU的控制台窗口中, 將會有如下顯示:

         U-Boot 2010.06 (Aug 312010 - 16:23:16)

DRAM:  0 Bytes

Flash: 64 MiB

*** Warning - bad CRC, using default environment

In:    serial

Out:   serial

Err:   serial

Net:   SMC91111-0

VersatilePB #

 

在提示符"VersatilePB#"后輸入U-Boot命令"printenv",它的執行將會被gdb中斷:

VersatilePB # printenv

 

在gdb的控制台窗口中, 將會顯示:

Breakpoint 1, do_printenv (cmdtp=0x1015520, flag=0, argc=1,argv=0xfddee4)

at cmd_nvedit.c:147

147            if (argc == 1) {

(gdb)

 

從這兒開始我們就可以使用普通的gdb調試命令進行調試了, 不錯!

 

 

 

 

qemu-common
在Linux下編譯安裝QEMU在Linux下編譯安裝QEMU

1.系統環境及版本

Linux發行版本:ubuntu 8.04

安裝QEMU-0.9.1

2.准備工作

在QEMU主頁http://wiki.qemu.org/Index.html下載源代碼並解壓

建立編譯環境:

$       sudo apt-get install build-essential

編譯安裝QEMU,最重要的工具就是gcc。在大多數主機,特別是x86架構的PC機上,gcc 4.x是不被QEMU所支持的。build-essential中包含的是gcc 4.x,為了正確編譯,需要低版本的gcc 3.x(gcc32 或gcc34),低版本安裝后,QEMU的配置腳本(configure script)在配置時會自動搜尋到。我安裝的是gcc 3.4:

$       sudo apt-get install gcc-3.4cpp-3.4

安裝QEMU需要SDL開發庫的支持,可以在其下載頁面上下載源代碼編譯安裝,但是推薦在apt中安裝,不容易出問題:

$       sudo apt-get install libsdl1.2-dev

另外,還需要安裝zlib和ESD:

sudo apt-get install zlib1g-dev zlib1g-dbg libesd0-dev

3       編譯安裝QEMU

$       ./configure --prefix=/usr/local/qemu

不加上prefix選項也是可以的。這個選項的作用是指定安裝目錄。如果不指定prefix,則可執行文件默認放在/usr/local/bin,庫文件默認放在/usr/local/lib,配置文件默認放在/usr/local/etc。由於QEMU不能用make uninstall的方法卸載,指定安裝目錄可以便於卸載(其實就是刪掉整個安裝目錄)。

然后

$       make

$       sudo make install

至此,QEMU安裝完成。

 

4.設置環境變量

如果./configure時使用了prefix選項,還需要設置環境變量PATH,否則bash是找不到qemu的命令的(除非你輸入該命令的具體路徑,如/usr/local/qemu/bin/qemu)。編輯/etc/profile

 

$       sudo vim /etc/profile

在文件中添加

PATH="$PATH:/usr/local/qemu/bin"export PATH

保存,退出,並用Ctrl+Alt+Backspace重新啟動X Window。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM