qemu模拟arm系统vexpress-a9—uboot+uImage

来源:互联网 发布:古力娜扎五官分析知乎 编辑:程序博客网 时间:2024/06/14 05:05

1 概述

上一篇文件介绍了qemu环境搭建,用内核镜像zImage运行模拟器,可以很方便调试内核。但现在嵌入式arm处理器厂商都会发布uboot+uImagesdk形式给产品公司,有时候需要调试uboot代码运行情况或是传入到内核参数是否生效等等,所以模拟uboot+uImage运行也是很有必要的,qemu官方也给出了环境搭建的步骤,但是比较老了,如果按照那些步骤运行vexpress-a9会有很多问题。当然网上也有很多关于vexpress-a9这方面的文章,大家可以多搜搜,我写这些东西一是给自己加深印象,二是希望把遇到的问题和解决方法给大家列的更详细点,可以更快的对qemu熟悉起来。

若是实际的开发板,在uboot运行以后,通过命令行可以使用mmc接口usb接口或是网络把编译好的uImage加载到内存中运行。对于模拟器,网络引导是个方便的选择,首先要需要一个tftp服务器,网络下载uImage然后引导。下面一步一步介绍这个过程。


2 环境说明

主机系统:ubuntu 12.04 32bit

交叉编译工具链:arm-linux-gnueabi-

uboot版本:git clone最新版本

Kernel版本:3.16


3 uboot下载、编译、配置

3.1 boot最新源码下载

git clone git://git.denx.de/u-boot.git

 

3.2 配置工具连环境变量环境变量

export ARCH=arm

export CROSS_COMPILE=arm-linux-gnueabi-

交叉编译工具的安装参照上篇文章《零基础qemu模拟arm系统环境搭建 linux内核编译一节

地址http://blog.csdn.net/sxw1002/article/details/52841671

 

3.3 设置uboot参数ip地址和tftp server地址以及引导方式,patch如下

diff --gita/include/configs/vexpress_common.h b/include/configs/vexpress_common.hindex a8eba31..9cfb1db 100644--- a/include/configs/vexpress_common.h+++ b/include/configs/vexpress_common.h@@ -48,6 +48,11 @@ #define CONFIG_SYS_TEXT_BASE   0x80800000 #endif +/* netmask */+#define CONFIG_IPADDR   192.168.1.49+#define CONFIG_NETMASK  255.255.255.0+#define CONFIG_SERVERIP 192.168.1.88+ /*  *Physical addresses, offset from V2M_PA_CS0-3  */@@ -183,12 +188,14 @@                                         GENERATED_GBL_DATA_SIZE) #define CONFIG_SYS_INIT_SP_ADDR                CONFIG_SYS_GBL_DATA_OFFSET +#define CONFIG_BOOTFILE                "uImage" #include <config_distro_defaults.h>- /*Basic environment settings */-#define CONFIG_BOOTCOMMAND \+/*#define CONFIG_BOOTCOMMAND \       "run distro_bootcmd; " \       "run bootflash; "+*/+#define CONFIG_BOOTCOMMAND  "tftp 0x60003000 uImage; setenv bootargs'root=/dev/mmcblk0 console=ttyAMA0'; bootm 0x60003000"  #define BOOT_TARGET_DEVICES(func) \        func(MMC, mmc, 1) \@@ -221,7 +228,6 @@ #define CONFIG_EXTRA_ENV_SETTINGS \                CONFIG_PLATFORM_ENV_SETTINGS \                 BOOTENV \-              "console=ttyAMA0,38400n8\0" \               "dram=1024M\0" \                "root=/dev/sda1 rw\0"\               "mtd=armflash:1M@0x800000(uboot),7M@0x1000000(kernel)," \


3.4 编译

make vexpress_ca9x4_defconfig

make –j2

 

4 Linux kernel编译

makevexpress_defconfig

make uImage LOADADDR=0x60003000 –j2

如果不加入LOADADDR编译会失败,否则可能产生下面的错误:

图4.1 uImage编译错误


编译好以后放入自己设置的tftp目录。ubuntu主机配置tftp服务器的文章网上很多,有问题找度娘。


5. qemu网络配置

5.1 支持TUN/TAP

qemu的网络配置网上有很多变种版本,都是基于TAP接口的(不了解TAP的同学找度娘),我是参考的qemu官方给出的方法,实现了qemu-ifupqemu-ifdown两个脚本。不过需要ubuntu主机系统支持TUN/TAP,具体支持方法参考文章《qemu的网络配置方法2则(转) 

http://blog.chinaunix.net/uid-280391-id-2449925.html

 

如果你的内核已经支持了TUN/TAP,可以找到如下节点

/dev/net/tun

 

5.2 qemu-ifup和qemu-ifdown

qemu-ifup脚本

#!/bin/sh## script to bring up the tun device in QEMUin bridged mode# first parameter is name of tap device(e.g. tap0)## some constants specific to the local host- change to suit your host#echo "config tun0"echo $1ETH0IPADDR=192.168.1.88MASK=255.255.255.0GATEWAY=192.168.1.1BROADCAST=192.168.1.255## First take eth0 down, then bring it upwith IP address 0.0.0.0#ifconfig eth0 downifconfig eth0 0.0.0.0 promisc up## Bring up the tap device (name specifiedas first argument, by QEMU)#openvpn --mktun --dev $1 --user `id -un`ifconfig $1 0.0.0.0 promisc up## create the bridge between eth0 and thetap device#brctl addbr br0brctl addif br0 eth0brctl addif br0 $1## only a single bridge so loops are notpossible, turn off spanning tree protocol#brctl stp br0 off## Bring up the bridge with ETH0IPADDR andadd the default route#ifconfig br0 $ETH0IPADDR netmask $MASKbroadcast $BROADCASTroute add default gw $GATEWAY## stop firewall - comment this out if youdon't use Firestarter#service firestarter stop

 

qemu-ifdown脚本

#!/bin/sh## Script to bring down and delete bridgebr0 when QEMU exits## Bring down eth0 and br0#ifconfig eth0 downifconfig br0 downifconfig br0 down## Delete the bridge#brctl delbr br0## bring up eth0 in "normal" mode#ifconfig eth0 -promiscifconfig eth0 upifconfig eth0 192.168.1.88## delete the tap device#openvpn --rmtun --dev $1## start firewall again#service firestarter start


 

上述两个脚本放到主机的/etc/目录,加可执行权限

sudo cp qemu-ifup qemu-ifcown /etc

sudo chmod +x qemu-if*

需要注意的是这两个脚本是自动运行的,不必要手动操作,只要在运行虚拟机的过程中加入网络的相关参数即可。


6 qemu运行


根文件系统的镜像制作请参考
http://blog.csdn.net/sxw1002/article/details/53646731

准备工作已就绪,可以运行了

sudo qemu-system-arm -M vexpress-a9 \

    -kernel /home/marquis/src/bootloader/u-boot/u-boot \

    -nographic \

    -m 512M \

    -net nic -net tap,ifname=tap0,script=/etc/qemu-ifup \

    -sd /home/marquis/src/qemu_vir_image/a9rootfs.ext3

运行结果:

 

图6.1 uboot启动通过tftp加载内核



图6.2内核运行



qemu弄起来比较繁琐,不像在windows平台用virtualboxvmware点点鼠标就搞定,未免有些错误或不详细的描述,同学们有兴趣可以在我的微信公众号上多多交流。

 

参考:

http://www.cnblogs.com/pengdonglin137/p/5023704.html?utm_source=tuicool&utm_medium=referral

https://en.wikibooks.org/wiki/QEMU/Networking

http://www.elinux.org/Virtual_Development_Board

http://blog.chinaunix.net/uid-280391-id-2449925.htm

0 0
原创粉丝点击