qemu模拟arm系统vexpress-a9—uboot+uImage
来源:互联网 发布:古力娜扎五官分析知乎 编辑:程序博客网 时间:2024/06/14 05:05
1 概述
上一篇文件介绍了qemu环境搭建,用内核镜像zImage运行模拟器,可以很方便调试内核。但现在嵌入式arm处理器厂商都会发布uboot+uImage的sdk形式给产品公司,有时候需要调试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-ifup和qemu-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运行
准备工作已就绪,可以运行了
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平台用virtualbox或vmware点点鼠标就搞定,未免有些错误或不详细的描述,同学们有兴趣可以在我的微信公众号上多多交流。
参考:
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
- qemu模拟arm系统vexpress-a9—uboot+uImage
- QEMU之初始化——ARM vexpress-a9(一)
- 用Qemu模拟vexpress-a9 (二) --- 创建根文件系统
- QEMU模拟vexpress-a9 搭建Linux kernel运行环境
- 用Qemu模拟vexpress-a9 (一) --- 搭建Linux kernel调试环境
- 第二期 QEMU模拟vexpress-a9开发板 《虚拟机就是开发板》
- 第二期 QEMU模拟vexpress-a9开发板 《虚拟机就是开发板》
- 基于QEMU的ARM Cortex-A9开发板Vexpress-ca9的Linux内核的编译和运行
- 基于QEMU的ARM Cortex-A9开发板Vexpress-ca9的Linux内核的编译和运行
- qemu模拟A9/A15运行Linux4.2.3
- qemu & arm debug uboot kernel
- 使用 QEMU 模拟 ARM
- 用Qemu模拟ARM
- 用Qemu模拟ARM
- 用QEMU模拟ARM
- 零基础qemu模拟arm系统环境搭建
- ubuntu下使用qemu模拟ARM(七)-----uboot从sd卡启动内核
- 使用Qemu模拟Cortex-A9运行U-boot和Linux
- text的翻译传输问题
- vs error C4996 : -D_SCL_SECURE_NO_WARNINGS
- Android通知栏Notification的实现
- JS基础知识应用之瀑布流扩展
- 深度探索c++对象模型之类全局对象的初始化与析构
- qemu模拟arm系统vexpress-a9—uboot+uImage
- HDU-3938-Portal
- gem5配置DRAMSim2跑Android benchmark遇到的问题
- Hungry Sequence(水题)
- JAVA 学习日记(2).面向对象,对象,类,封装,构造方法,重载
- BZOJ 4391/Luogu3129[Usaco2015 dec]High Card Low Card
- noip模拟题 11.2
- HQL--面向对象查询语言
- E&M信令详细介绍