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,那麼我們可以看到其支援的板子裡面是有這個板子的:
針對這個板子在Yocto中的模擬,官方也有一個網頁:Yocto for znyqmp,我們可以參考這個網頁,但是根據這個網頁做其實是行不通的。下面我主要說明一下需要更改和注意的地方。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)
構建與使用步驟
先根據官方的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): Yocto中qemu模擬器的使用,以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密碼