Yocto tips (20): Yocto中qemu模拟器的使用,以zynq Cortex-A9为例

在以前的文章《使用Buildroot与Qemu学习ARM
linux IIC驱动
》中,写到过使用qemu来模拟使用ARM Linux,那个时候借助的是buildroot,这次我们使用Yocto来做同样的事情。

优点

使用Qemu的好处在于,当我们在开发Userspace的程序时,可以在没有硬件的情况下完成测试。

同时不像以前一样我们需要自己去编译qemu,这次我们使用Yocto编译出来的native qemu来模拟。省去了我们手动编译可能出现的问题。

选择

这里的选择指的是,我们在local.conf中指定MACHINE变量的值。我将其分成两种:

1. 默认的qemuarm

以前我一直使用这个,但是这个模拟的是一个ARM9的处理器,各种外设功能不足,我们希望可以模拟一个更高ARM架构的SoC。

2. Xilinx的zynq-9:xilinx-zynq-a9

在Qemu的模拟中,据个人有限经验对不同的板子的模拟情况的了解,zynq在Qemu中有较好的支持。同时xilinx对此也有不少的文档,同时xilinx的一些板子的支持属于Qemu默认的测试与支持Machine,因此选择Xilinx的板子来模拟比较合适。

同时,我们关注的是ARM相关,因此使用Cortex-A9比较好,对此,我们选择xilinx-zynq-a9。

在我们的Host PC中如果安装了qemu-system-arm,那么我们可以看到其支持的板子里面是有这个板子的:

qemu-system-arm -M ?
Supported machines are:
versatileab          ARM Versatile/AB (ARM926EJ-S)
versatilepb          ARM Versatile/PB (ARM926EJ-S)
lm3s811evb           Stellaris LM3S811EVB
z2                   Zipit Z2 (PXA27x)
connex               Gumstix Connex (PXA255)
sx1                  Siemens SX1 (OMAP310) V2
realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
cubieboard           cubietech cubieboard
vexpress-a9          ARM Versatile Express for Cortex-A9
lm3s6965evb          Stellaris LM3S6965EVB
realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
mainstone            Mainstone II (PXA27x)
terrier              Terrier PDA (PXA270)
n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
<span style="color:#ff6666;">xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9</span>
nuri                 Samsung NURI board (Exynos4210)
realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
verdex               Gumstix Verdex (PXA270)
spitz                Spitz PDA (PXA270)
canon-a1100          Canon PowerShot A1100 IS
akita                Akita PDA (PXA270)
smdkc210             Samsung SMDKC210 board (Exynos4210)
integratorcp         ARM Integrator/CP (ARM926EJ-S)
sx1-v1               Siemens SX1 (OMAP310) V1
kzm                  ARM KZM Emulation Baseboard (ARM1136)
highbank             Calxeda Highbank (ECX-1000)
n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
collie               Collie PDA (SA-1110)
realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
vexpress-a15         ARM Versatile Express for Cortex-A15
none                 empty machine
cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
tosa                 Tosa PDA (PXA255)
midway               Calxeda Midway (ECX-2000)
virt                 ARM Virtual Machine
borzoi               Borzoi PDA (PXA270)

针对这个板子在Yocto中的模拟,官方也有一个网页:Yocto for znyqmp,我们可以参考这个网页,但是根据这个网页做其实是行不通的。下面我主要说明一下需要更改和注意的地方。

构建与使用步骤

先根据官方的step1到step6来编译出需要的image。需要注意的是我们这里使用单核的A9,因此machine应该为qemuzynq,即在local.conf中应该为:

# This sets the default machine to be qemux86 if no other machine is selected:
MACHINE ??= "qemuzynq"

这个machine的定义位于其layer中的config中:

$ ls ../meta-xilinx/conf/machine/ -l
total 52
drwxrwxr-x 11 hexiongjun hexiongjun 4096 May 16 10:38 boards
-rw-rw-r--  1 hexiongjun hexiongjun  593 May 16 10:38 ep108-zynqmp.conf
drwxrwxr-x  3 hexiongjun hexiongjun 4096 May 16 10:38 include
-rw-rw-r--  1 hexiongjun hexiongjun 1049 May 16 10:38 kc705-trd-microblazeel.conf
-rw-rw-r--  1 hexiongjun hexiongjun  623 May 16 10:38 microzed-zynq7.conf
-rw-rw-r--  1 hexiongjun hexiongjun  804 May 16 10:38 picozed-zynq7.conf
-rw-rw-r--  1 hexiongjun hexiongjun  564 May 16 10:16 qemumicroblaze.conf
-rw-rw-r--  1 hexiongjun hexiongjun  512 May 16 10:16 qemumicroblaze-s3adsp1800.conf
-rw-rw-r--  1 hexiongjun hexiongjun  496 May 16 10:38 qemuzynq.conf
-rw-rw-r--  1 hexiongjun hexiongjun 1059 May 16 10:38 zc702-zynq7.conf
-rw-rw-r--  1 hexiongjun hexiongjun 1008 May 16 10:38 zc706-zynq7.conf
-rw-rw-r--  1 hexiongjun hexiongjun  847 May 16 10:38 zedboard-zynq7.conf
-rw-rw-r--  1 hexiongjun hexiongjun  627 May 16 10:38 zybo-zynq7.conf

同时还需要配置output的initrd type为cpio:

IMAGE_FSTYPES = "jffs2 tar.bz2 cpio"

否则我们在后面的qemu中指定initrd的时候无法指定。

至此,我们就准备好了所有的材料。

运行模拟器

直接使用runqemu即可:

$ runqemu qemuzynq

Continuing with the following parameters:
KERNEL: [/home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/deploy/images/qemuzynq/uImage]
ROOTFS: [/home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/deploy/images/qemuzynq/core-image-minimal-qemuzynq-20160516035635.rootfs.cpio]
FSTYPE: [cpio]
Setting up tap interface under sudo
Acquiring lockfile for tap0...
Running qemu-system-arm...
/home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/sysroots/x86_64-linux/usr/bin/qemu-system-arm -kernel /home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/deploy/images/qemuzynq/uImage -net nic,model=virtio -net tap,vlan=0,ifname=tap0,script=no,downscript=no -M xilinx-zynq-a9 -serial null -serial mon:stdio -dtb /home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/deploy/images/qemuzynq/uImage-qemuzynq.dtb -initrd /home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/deploy/images/qemuzynq/core-image-minimal-qemuzynq-20160516035635.rootfs.cpio -no-reboot -m 1024 --append "earlyprintk root=/dev/ram rw ip=192.168.7.2::192.168.7.1:255.255.255.0 mem=1024M "
qemu-system-arm: Unsupported NIC model: virtio
Set 'tap0' nonpersistent
Releasing lockfile of preconfigured tap device 'tap0'

然后遇到了问题:qemu-system-arm: Unsupported NIC model: virtio

对此,有多种处理方法,最为简单的是我们直接使用qemu至此的 NIC model即可,因此先查询一下:

$ /home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/sysroots/x86_64-linux/usr/bin/qemu-system-arm -M xilinx-zynq-a9 -net nic,model=?
qemu: Supported NIC models: cadence_gem

可以看到支持的是cadence_gem,因此我们需要更改成这个。

runqemu的更改

runqemu的脚本位于:

poky/scripts/runqemu-internal中,在里面我们可以看到其指定了NIC
model,因此我们将其改成cadence_gem即可:

        KERNEL_NETWORK_CMD="ip=192.168.7.$n2::192.168.7.$n1:255.255.255.0"
        QEMU_TAP_CMD="-net tap,vlan=0,ifname=$TAP,script=no,downscript=no"
        if [ "$VHOST_ACTIVE" = "yes" ]; then
            QEMU_NETWORK_CMD="-net nic,model=<span style="color:#ff6666;">virtio</span> $QEMU_TAP_CMD,vhost=on"
        else
            QEMU_NETWORK_CMD="-net nic,model=<span style="color:#ff6666;">virtio</span> $QEMU_TAP_CMD"
        fi

然后再次运行,就可以工作了,可以看到其部分log如下:

$ runqemu qemuzynq

Continuing with the following parameters:
KERNEL: [/home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/deploy/images/qemuzynq/uImage]
ROOTFS: [/home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/deploy/images/qemuzynq/core-image-minimal-qemuzynq-20160516035635.rootfs.cpio]
FSTYPE: [cpio]
Setting up tap interface under sudo
Acquiring lockfile for tap0...
Running qemu-system-arm...
/home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/sysroots/x86_64-linux/usr/bin/qemu-system-arm -kernel /home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/deploy/images/qemuzynq/uImage -net nic,model=cadence_gem -net tap,vlan=0,ifname=tap0,script=no,downscript=no -M xilinx-zynq-a9 -serial null -serial mon:stdio -dtb /home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/deploy/images/qemuzynq/uImage-qemuzynq.dtb -initrd /home/hexiongjun/EmbProj/am335X_Yocto/qemuzynq/tmp/deploy/images/qemuzynq/core-image-minimal-qemuzynq-20160516035635.rootfs.cpio -no-reboot -m 1024 --append "earlyprintk root=/dev/ram rw ip=192.168.7.2::192.168.7.1:255.255.255.0 mem=1024M "
Warning: nic cadence_gem.1 has no peer
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 3.19.0-xilinx ([email protected]) (gcc version 5.2.0 (GCC) ) #1 SMP PREEMPT Mon May 16 11:54:40 CST 2016
[    0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[    0.000000] Machine model: xilinx-zynq-a9
[    0.000000] Memory policy: Data cache writeback
[    0.000000] CPU: All CPU(s) started in SVC mode.
[    0.000000] PERCPU: Embedded 9 pages/cpu @eefd8000 s8128 r8192 d20544 u36864
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 260624
[    0.000000] Kernel command line: earlyprintk root=/dev/ram rw ip=192.168.7.2::192.168.7.1:255.255.255.0 mem=1024M
[    0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)
[    0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
[    0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] Memory: 1028324K/1048576K available (4457K kernel code, 234K rwdata, 1408K rodata, 220K init, 198K bss, 20252K reserved, 0K cma-reserved, 270336K highmem)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
[    0.000000]     vmalloc : 0xf0000000 - 0xff000000   ( 240 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xef800000   ( 760 MB)
[    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
[    0.000000]     modules : 0xbf000000 - 0xbfe00000   (  14 MB)
[    0.000000]       .text : 0xc0008000 - 0xc05c28f4   (5867 kB)
[    0.000000]       .init : 0xc05c3000 - 0xc05fa000   ( 220 kB)
[    0.000000]       .data : 0xc05fa000 - 0xc06349e0   ( 235 kB)
[    0.000000]        .bss : 0xc06349e0 - 0xc0666470   ( 199 kB)
[    0.000000] Preemptible hierarchical RCU implementation.
[    0.000000] 	RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.

退出Qemu

输入Ctrl + A C,并输入q回车即可,Ctrl+C是无法退出的。

runqemu的其他工具

所有的工具有:

$ runqemu
runqemu                  runqemu-addptable2image  runqemu-export-rootfs    runqemu-extract-sdk  
runqemu-gen-tapdevs      runqemu-ifdown           runqemu-ifup             runqemu-internal

可以看到主要涉及到TAP功能的up down与create,与nfsroot相关的两个工具。

参考

http://www.wiki.xilinx.com/QEMU

http://zedboard.org/content/qemu-deep-dive-0

https://lists.gnu.org/archive/html/qemu-devel/2015-10/msg00755.html

时间: 2024-10-17 14:14:57

Yocto tips (20): Yocto中qemu模拟器的使用,以zynq Cortex-A9为例的相关文章

Yocto tips (15): Yocto中的包管理器

使用包管理器 在local.conf中使能就可以: 然后编译后就会有rpm包了: 配置文件server 能够使用ngix和apache.可是我们也能够仅仅用使用python: python -m SimpleHTTPServer 打开浏览器能够看到: 在机器上面查看包的status smart status 在机器上面配置channel 对于rpm使用的smart工具,加入channel: smart channel --add all type=rpm-md baseurl=http://19

Yocto tips (10): Yocto hellworld 加入一个软件包

Yocto中一个软件包是放在bb文件里的,然后非常多的bb文件集成一个recipe(配方),然后很多的recipe又组成一个meta layer.因此,要加入一个包事实上就是在recipe以下加入一个bb(bitbake配置文件).以下使用helloworld作为一个样例. clone bb文件 首先是进入到一个recipe文件夹下,比如以下就是到了recipes-graphics: $ pwd /media/work/iMX6/Yocto/sources/meta-fsl-arm/recipe

Yocto tips (19): Yocto SDK Toolchian的使用

在使用之前须要先source env,导入各种环境变量(注意将路径变更成你自己的): source ../qt5_sdk/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi 然后我们能够查看一下bash的env了.以下是多出来的一些env,直接在bash中输入export就可以看到: declare -x AR="arm-poky-linux-gnueabi-ar" declare -x ARCH="arm&quo

从零使用qemu模拟器搭建arm运行环境

为什么会有这篇文章 早在2011年的时候,跟当时同事一起讨论,做Linux系统开发正处于整个Linux开发中间层,没有上层的C/C++业务和数据库的开发经验,也没有底层的内核和驱动开发经验,到底路该如何走--基于对Linux系统开发的理解和内核的兴趣,认为选择Linux内核开发更适合自己.于是到淘宝上买了块三星s3c2440(arm 9)开发板,学起内核开发.没有过多久,机缘巧合,正式加入了公司的内核开发部.就这样跟内核和arm打上交道了. 没有想到这一做就是3年了,arm芯片只有在公司才能使用

[Xcode10 实际操作]一、博主领进门-(5)检测运行中的模拟器在各个方向上的切换

本文将演示Xcode的设备模拟器在各个方向上的切换和检测. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 检测运行中的模拟器在各个方向上的切换. 1 import UIKit 2 3 class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading

eclipse中Android模拟器,DDMS看不到设备

在eclipse中启动模拟器AVD后,刚启动的时候,在控制台会看到相关的设备,在DDMS中也会有设备列表,只不过是offline的,但等到完全启动开的时候,DDMS中什么也没有,而且用adb命令adb devices查看设备,也没有任何设备. 一般情况下,重启电脑就可解决.我要说的是不重启电脑的方法:1. 打开cmd命令行,切换到adb命令目录,如果你已经加入了环境变量,切换目录就省了. 2. 输入命令:adb kill-server,adb被杀死了. 3. 接着输入命令:adb start-s

【转】android开发中关于模拟器emulation的常见问题

[转]android开发中关于模拟器emulation的常见问题 Trouble: 无法启动android模拟器,提示 XDM authorization key matches an existing client! SDL init failure, reason is: No available video device Oneway: 打开电脑的 Terminal 终端, 以当前图形界面用户的身份执行命令 xhost localhost 即可,如果想实现登录后自动执行这个命令,可以做以下

ios开发中iphone模拟器中程序文件和数据库的存放位置

1.使用命令: chflags nohidden ~/library/ 使隐藏的资源库文件夹显示出来.如果想要隐藏掉,使用:chflags hidden ~/library/ 2.finder中找到:用户->mwsn(这是我的用户名)->资源库->Application Support->iPhone Simulator->7.0(根据你的版本确定是哪个)->Applications 里面有一堆目录,挨个查看,找到你需要的工程的目录->Documents文件夹,你

SQL点滴20—T-SQL中的排名函数

原文:SQL点滴20-T-SQL中的排名函数 提到排名函数我们首先可能想到的是order by,这个是排序,不是排名,排名需要在前面加个名次序号的,order by是没有这个功能的.还可能会想到identity(1,1),它也给了一个序号,但是不能保证给出的序号是连续升序的.除非能够保证所有的Insert语句都能够正确成功地完成,并且没有删除操作,实际的使用中大多数的表都不能保证这样. 好在SQL Server中提供了一些排名函数来辅助实现这些功能.排名函数按照需要的顺序对数据进行排名,并提供一