1. 程式人生 > >Yocto tips (20): Yocto中qemu模擬器的使用,以zynq Cortex-A9為例

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

在以前的文章《》中,寫到過使用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

相關推薦

Yocto tips (20): Yoctoqemu模擬器的使用,zynq Cortex-A9

在以前的文章《》中,寫到過使用qemu來模擬使用ARM Linux,那個時候藉助的是buildroot,這次我們使用Yocto來做同樣的事情。 優點 使用Qemu的好處在於,當我們在開發Userspace的程式時,可以在沒有硬體的情況下完成測試。 同時不像以前一樣我們需要自

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

med track .net ins imp 管理 ann 包管理 管理器 使用包管理器 在local.conf中使能就可以: 然後編譯後就會有rpm包了: 配置文件server 能夠使用ngix和apache。可是我們也能夠僅僅用使用pyt

Net Core數據庫事務隔離詳解——Dapper和Mysql

事務 ring 增刪改 tostring 測試 stc efault 多個 log Net Core中數據庫事務隔離詳解——以Dapper和Mysql為例 事務隔離級別 準備工作 Read uncommitted 讀未提交 Read committed 讀取提交內

關於vue 使用 webuploader 遇到的坑及解決方案,本文分片上傳解說,上傳壓縮包大小2G左右在專案實測

首先說一下vue中使用webuploader該如何引入呼叫   1. 肯定是安裝操作, 本人用的是淘寶映象 cnpm i webuploader -S  如果你沒有安裝淘寶映象,則使用 npm i webuploader -S   2. 引入操作,在具體的vue元件中引入 , import We

Nginx學習之路(八)Nginx的事件驅動過程詳解-----listenfd註冊過程

Nginx的高效得益於它的事件驅動機制,整個事件驅動機制基本框架就是linux下的select,poll,epoll這幾個IO多路複用模式,但是nginx絕不單單只是使用它們這麼簡單,今天以epoll模式為例,從nginx最開始的listenfd的監聽的過程來說明nginx是

Ubuntu安裝和配置 Java JDK,並解除安裝自帶OpenJDK(Ubuntu 12.04

1.下載jdk-7u25-linux-i586.tar.gz 2.修改jdk-7u25-linux-i586.tar.gz的可執行許可權,最簡單的方法是賦予許可權,即: chmod 755 jdk

springboot過濾器的使用(logback-日誌記錄

過濾器和攔截器的區別,過濾器和攔截器的用途,面試經常被問到:https://blog.csdn.net/qq_36411874/article/details/53996873,這篇部落格寫的很詳細。 使用攔截器記錄日誌的案例:https://blog.csdn.net/qq_3128918

Net Core資料庫事務隔離詳解——Dapper和Mysql

原文: Net Core中資料庫事務隔離詳解——以Dapper和Mysql為例 Net Core中資料庫事務隔離詳解——以Dapper和Mysql為例 事務隔離級別 準備工作 Read uncommitted 讀未提交 Read

MFC註冊熱鍵操作--CHotKeyCtrl設定熱鍵

使用CHotKeyCtrl為程式新增熱鍵功能,進行主介面的顯示隱藏,類似於老闆鍵,具體操作如下:第一:獲取設定的熱鍵並使用RegisterHotKey進行熱鍵的註冊,程式碼如下://獲取熱鍵鍵值 CHotKeyCtrl* photk=(CHotKeyCtrl*)GetDlgI

向qt新增庫檔案(ffmpeg靜態庫

在Qt中工程通過.pro檔案管理,所以庫檔案要在.pro檔案中新增。 1.新增庫檔案 靜態庫 linux:LIBS += your_lib_path/your_lib 動態庫 linux:LIBS += -L your_lib_path -lyour_lib//經過測試

如何將資料庫存的樹轉化樹形列表(easyui的tree)

很多時候,我們會把一棵樹存放到資料庫中,當前臺需要展示一個樹形列表時,將這棵樹讀取出來並顯示,這個過程是怎麼實現的呢? 這篇文章是以構造一棵easyui前臺框架的一個樹形列表為例,後臺框架是spring MVC+JPA。 首先看一下資料庫中這顆樹是怎麼存的: 樹的結構一目

ajax無重新整理呼叫struts2框架的Action,使用者登入驗證

前提條件:搭建好SSH框架; 本功能依賴jar包:struts2-json-plugin-2.3.24(例); 步驟:1、匯入依賴jar包;2、編寫action;3、配置spring;4、配置struts.xml;5、編寫ajax指令碼; 說明:本例關鍵詞:ajax、jqu

如何在 Java 正確使用 wait, notify 和 notifyAll – 生產者消費者模型

wait, notify 和 notifyAll,這些在多執行緒中被經常用到的保留關鍵字,在實際開發的時候很多時候卻並沒有被大家重視。本文對這些關鍵字的使用進行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 來實現執行緒間的通訊。。舉個例

關於Android手機MTP模式連接的一些設置(win7和ubuntu下,紅米1s

sta start .net eno bcm htm web date ati 有些手機的MTP模式在電腦上識別不了,須要一些設置才幹夠,以下就網上收集來的一些設置方法集中貼過來: 一、 win7下 參考:http://blog.ammrli.com/?p=11

linux 磁盤分區,主分區,擴展分區,邏輯分區sata接口

sat pos linux內核 tracking 限制 設置 art lin pop ?? 以sata接口(依據linux內核檢測其順序 sda,sdb...)為例, 1, 硬盤的限制,最多僅僅能設置4個分區(主分區+擴展分區),路徑例如以下, /dev/sda1

又見關系並查集 POJ 1182 食物鏈

for _id scanf rac sin merge als ++ mod 簡單的關系並查集一般非常easy依據給出的關系搞出一個有向的環,那麽兩者之間的關系就變成了兩者之間的距離。 對於此題: 若u。v不在一個集合內,則顯然此條語句會合法(暫且忽略後兩條。下

基於HttpClient實現網絡爬蟲~百度新聞

rom pcl 音頻 lba 瀏覽器中 sts 更新 @override erro 轉載請註明出處:http://blog.csdn.net/xiaojimanman/article/details/40891791 基於HttpClient4.5實現網絡爬蟲

關於端口被占用的問題(61440端口

internet 其他 直接 按鍵 str es2017 查看 window 原因   先來說一下寫這篇blog的原因吧,本人今天下午回到宿舍打開電腦準備上網下載開發Python的環境,結果發現下載速度和以前相比是大大的不如。然後看了一下室友的網絡一切ok,然後我突然只能登

當你輸入一個網址/點擊一個鏈接,發生了什麽?(www.baidu.com

var aid 查找 style str 在服務器 開始 傳輸 http響應 >>>點擊網址後,應用層的DNS協議會將網址解析為IP地址; DNS查找過程: 瀏覽器會檢查緩存中有沒有這個域名對應的解析過的IP地址,如果緩存中有,這個解析過程就將結束。 如果

linux 忘記root(這裏centos 6.5)密碼的解決辦法

理發 我們 bsp ext sso 用戶模式 正常 修改 啟動 在使用linux的過程中有時候會忘記root用戶的密碼(尤其是進行交接而文檔內容不全的時候),這個時候我們就可以進入單用戶模式來重置root用戶密碼。下面來講解重置root密碼的方式,也可以說是破解root密碼