嵌入式開發板模擬器:QEMU

前兩天看微信公眾號時發現了一個嵌入式模擬器,感覺很不錯,自己動手安裝了一個,折騰了幾天,下載一直是個問題,特此記錄如下

模擬器大家應該都聽說過,有的小伙伴打游戲也會安裝模擬器,今天我們介紹的主角QMEU就是一個可以用在嵌入式的模擬器,如果你想學習嵌入式,但身邊沒有開發板,這時候你可以嘗試使用它來模擬Linux內核的啟動,當然它還可以模擬ARM、MIPS等各種CPU架構,本文主要介紹模擬ARM的啟動流程

(一)環境介紹

? ? ? ? 虛擬機:VMware

? ? ? ? Ubuntu 16.04LTS

(二)安裝QEMU

我們常用的VMware和virtualBox只能在X86架構上,虛擬一臺X86計算機,但是QEMU能用在X86架構下虛擬出ARM計算機。QEMU時一個支持跨平臺的虛擬機,有兩種模式:user mode和system mode,在system mode下能夠模擬出整個計算機,可以在qemu上運行 操作系統,在user mode下,可以運行和當前平臺指令集不同的可執行程序。例如可以用qemu在x86上運行ARM的可執行程序,但是兩個平臺必須是同一種操作系統,比如Linux。

由于本文介紹ARM版本,我們可以在Ubuntu里使用sudo apt install qemu-system-arm命令去安裝,但是不太推薦此方法,Ubuntu里安裝源更新比較慢,安裝版本不確定,另外就是從官網(https://www.qemu.org/)下載源碼包來安裝,如果想了解更多,可以從閱讀官網上相關信息。

(1)從官網下載好安裝包,或者用我下載好的:qemu

wget https://download.qemu.org/qemu-5.1.0.tar.xz

(2)執行下面的命令

$: tar -xvJf qemu-5.0.1.tar.xz 
$: cd qemu-5.0.1
$: ./configure
$: make & make install //如果報錯要安裝兩個文件:apt-get install libglib2.0-devapt-get install libpixman-1-dev

通過上面的安裝了32位(qemu-system-arm)和64位(qemu-system-aarch64)的模擬器,使用help命令查看支持的開發板,這里面有很多我們的開發版選項,本文以vexpress-a9 (ARM Versatile Express for Cortex-A9) 為例進行講解。

(三)編譯操作系統

?(1)編譯u-boot

? ? ? 下載u-boot代碼:


git clone https://gitlab.denx.de/u-boot/u-boot.git
//注意這個有時候會比較慢,找個合適的時間下載(比如早上),或者鏡像上下載

下載完成后可以在u-boot的configs目錄下查看配置文件,我們選擇的vexpress-a9 配置文件是vexpress_ca9x4_defconfig,

make  vexpress_ca9x4_defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- all//make的時候可能出錯,按照出錯提示百度相關錯誤,可能由于沒有相關命令支持,例如我安裝時提示flex找不到,執行apt-get install flex在make就成功了
//需要交叉編譯工具的可以在這里下載http://releases.linaro.org/components/toolchain/binaries/
注意:如果指定交叉編譯器的路徑一定要使用絕對路徑

?

(2)制作文件系統

以前都是使用busybox編譯,然后手動創建跟文件目錄,但是現在我們使用bulidroot可以很輕松容易的構建跟文件系統(這里感謝下文鏈接的作者提供了這么方便的工具)

buildroot下載

git clone git://git.buildroot.net/buildroot

?

上面下載的代碼并不是真正下載跟文件系統,真正下載跟文件系統是在我們配置好后,編譯時下載的。

? 執行make menuconfig來配置選項:

然后在Target opions選擇相應的目標平臺,我們這里點進去選擇arm(little-endian)即ARM架構小端模式

build options選項我這里不修改保持默認,有需要的可以自行修改

編譯工具鏈toolchain選擇外部,找到自己的編譯工具鏈位置,具體參考我的配置情況

上面的配置要注意內核頭文件和編譯工具鏈版本一樣,不知道的可以在相應選項上按h查看幫助信息

選擇對應的控制臺信息:

為了減少跟文件系統鏡像,這里在filesystem images里面選擇如下,意思是使壓縮文件系統(lz4),內核啟動時解析文件系統。

其他配置先保持默認,有需要我們再修改

執行make savedefconfig命令,就會生成新的 defconfig 文件,然后執行make命令(執行make時會連接網絡下載相關資源,注意網絡暢通)

(3)編譯kernel

? 代碼下載:

git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

? 不推薦使用上面的方法,下載太慢了,可以在網上直接搜相關鏡像下載,這里我使用正點原子提供的kernel作為演示,使用imx的配置文件imx_v7_defconfig

然后把上面buildroot編譯的文件系統拷貝過來

 cp /opt/buildroot/output/images/rootfs.cpio .make ARCH=arm  vexpress_defconfigmake ARCH=arm  menuconfig

make ARCH=arm CROSS_COMPILE=/交叉編譯器路徑/bin/arm-linux-gnueabihf-  -j8

注意:上面一定要指定架構為arm架構

(4)系統啟動

下面我們模仿sd卡啟動過程

制作sd卡鏡像:

dd if=/dev/zero of=sd.img bs=4096 count=4096
mkfs.vfat sd.img

把編譯好的 kernel zImage 和 dtb 文件拷貝到 sd.img 中

mount?sd.img?/mnt/?-o?loop,rw
cp?arch/arm/boot/zImage?/mnt/
cp?arch/arm/boot/dts/vexpress-v2p-ca9.dtb?/mnt/
umount?/mnt

啟動qemu

qemu-system-arm -M vexpress-a9 -m 512M -kernel ../u-boot/u-boot -nographic  -sd sd.img

可以看到uboot啟動了:

但是沒有找到內核,我們還需要下面的操作

查看內核執行地址相對內存的偏移地址:0x8000

在 u-boot 命令行中輸入bdinfo命令,可以查到這塊開發板內存的起始地址:

//讀取內核文件到開發板內存中
fatload mmc 0:0 0x62008000 zImage
fatload mmc 0:0 0x64008000 vexpress-v2p-ca9.dtb//啟動內核
bootz 0x62008000 - 0x64008000

(四) 總結

? 通過上面的操作我們完成了模擬內核啟動的流程,有幾個問題也折騰了好久說一下注意的幾點:

(1)編譯uboot、kernel時注意架構的選擇

(2)在內核啟動不成功,可能是sd.img沒有制作成功

? 當然qemu并不能完全替代開發板,更多的功能可以自己發掘哈哈~

?

參考文章:Linux利器:QEMU!用它模擬開發板能替代真開發板?

? ? ? ? ? ? ? ? ??QEMU編譯安裝

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531366.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531366.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gcc: weak_alias如何使用

本文主要說明weak和alias是什么和如何使用它 __attribute__是用來說明函數的屬性,weak和alias分別是兩個屬性。 (一)強符號和弱符號: 強符號:已經初始化的全局變量和未被weak修飾的函數弱符號:未初始化的全…

靜態Include和動態Include測試并總結

主要代碼 hjzgg.css .center-div{width:auto;margin-left: 40%;margin-right: 40%;display: block;position: absolute;top:0px;left:0px; }.text-div{margin-top: 80px; }.hjzgg-div{color:transparent;font-size:20px;font-weight: bold;letter-spacing:2px;-webkit-animatio…

linux終端常用快捷鍵

CTRLALTT 打開終端 CTRLD 關閉終端 CTRL SHIFT "" 放大終端字體 CTRL “-” 縮小終端字體 CTRL r 查找歷史命令 CTRLu 刪除光標前面所有內容 CTRLw 刪除光標左邊的單詞 CTRL k 刪除光標后面的所有內容 CTRLL 清除當前屏幕內容 CTRLa 光標移到開始位置 CTRLe 光標移到…

ueditor的配置和使用

ueditor下載好之后直接復制到項目的WebContent目錄下,并將ueditor\jsp\lib下的jar包復制或者剪切到項目的lib目錄下。先看一下效果,如下: 1.文件的上傳 首先在ueditor/jsp目錄下找到config.json文件,就拿Image上傳來說吧。 "…

windows上搭建NFS服務器

在進行嵌入式開發的時候,我們常用的做法是搭建NFS服務器,然后使把文件系統、調試程序放在NFS服務器上,這樣可以方便調試,以前都是在linux里面開啟NFS服務器,今天來說下window里的nfs服務器–haneWin 一、軟件安裝和使…

計算機是如何啟動的?從未上電到操作系統啟動

計算機是如何啟動的,網絡上很多博文1都從 BIOS 程序的加載開始說起,有的也跳到 BIOS 程序加載 Bootloader 階段。個人認為把這個過程稱為操作系統是如何被加載并啟動應該更加貼切一點。同時,也有計算機硬件大神的文章[1][5]詳細分析計算機加電…

Hibernate注解

前言: 最近正在學習Hibernate通過注解(annotation)來管理映射關系,以前都是通過XML映射文件。下面拿個小例子說一下。 數據庫物理模型: 數據庫的描述: 一篇博客隨筆可以分到不同的類中,一個類中…

js表單動態添加數據并提交

情景1&#xff1a;已經存在form對象了&#xff0c;動態為form增加對象并提交 function formAppendSubmit(){var myform$(#newArticleForm); //得到form對象var tmpInput$("<input typetext nameblogArticleForm.articleContent/>");tmpInput.attr("value&…

*++p和*p++的區別

首先你應該明白* 和 的優先級是相同的&#xff0c;而且他們的結合性是從又往左的 #include <stdio.h>int main(int argc ,char * argv[]) {int str[]{1,2,3,4,5,6,7,8,9,10};int *p str;int a *p;//a*p ,pp1即a1&#xff0c;p&str[1]int b *p;//pp1,b*p即p&s…

zyUpload+struct2完成文件上傳

前言&#xff1a; 最近在寫自己的博客網站&#xff0c;算是強化一下自己對s2sh框架的理解。期間遇到了很多問題&#xff0c;這些問題在寫之前都考慮過&#xff0c;感覺也就是那樣吧。但正真遇到了&#xff0c;也挺讓人難受的。就利用zyUpload這個js插件實現文件的上傳&#xff…

gbd的簡單使用(一)

這篇文章將gdb的簡單使用&#xff0c;通過此篇文章你能學習到使用gdb進行調試程序 在Linux中編寫程序時&#xff0c;如何進行程序的debug工作呢&#xff1f;今天來介紹下gdb這個工具&#xff0c;可以在Linux下直接man gdb查看幫助信息 &#xff08;一&#xff09;gdb命令介紹 …

java發送內嵌圖片郵件

前言&#xff1a; 博客系統中需要郵件服務的功能&#xff0c;以前寫過類似的功能&#xff0c;不過功能太簡單了&#xff0c;僅僅是發送文本內容&#xff0c;現在嘗試一下發送內嵌圖片郵件&#xff01; 準備工作&#xff1a; 請參考&#xff1a;http://www.cnblogs.com/hujunzhe…

調試跟蹤利器---strace

通過這篇文章你會學習到strace的用法&#xff0c;strace可以幫助你高效地定位進程中的一些錯誤&#xff0c;關于strace的用處有很多&#xff0c;可以自行發掘 前面我們講解了gdb調試程序,這篇文章介紹另一個調試跟蹤工具strace&#xff0c;同樣你可以在linux下執行man strace查…

MBR、DBR、FAT32基礎小知識

MBR-------主引導記錄 1.創建時間&#xff1a;由分區軟件&#xff08;Fdisk/PartitionMagic/Windows 2000/Windows XP安裝 工具等&#xff09;給 硬盤分區時建立的。 2.功能 &#xff1a;存放硬盤分區信息和引導系統時檢查分區。 3.作用范圍&#xff1a;MBR和虛擬MBR控制著整個…

java使用Executor(執行器)管理線程

一.一個實現了Runnable接口的類 class MyThread implements Runnable{private static int num 0;Overridepublic void run() {while(true){synchronized(MyThread.class){num;try{Thread.sleep(500);} catch(Exception e){System.out.println(e.toString());}System.out.print…

JMM和happens-before原則

JMM&#xff1a; Java Memory Model(Java內存模型)&#xff0c;圍繞著在并發過程中如何處理可見性、原子性、有序性這三個特性而建立的模型。 可見性&#xff1a; JMM提供了volatile變量定義、final、synchronized塊來保證可見性。  例如&#xff1a;線程a在將共享變量x1寫入…

SD卡移植FAT32文件系統無MBR

問題&#xff1a;在研究SD卡和FAT32文件系統的時候&#xff0c;發現SD卡有的有MBR&#xff0c;有的沒有MBR&#xff0c;這個為什么呢&#xff1f; 分析&#xff1a;MBR是主引導記錄&#xff0c;是在給磁盤分區的時候建立的&#xff0c;我們的SD卡沒有這個可能就是沒有進行過分區…

java獲取類的信息

關鍵技術剖析 1.java.lang.reflect包實現了java的反射機制&#xff0c;在使用反射機制時&#xff0c;需要導入該包。 2.Class類的forName方法能夠根據類名加載類&#xff0c;獲得類的Class對象。 Class類的getSuperclass方法獲得父類的Class對象&#xff1b;getDeclaredFields方…

FAT32文件系統介紹

FAT32文件系統&#xff08;一&#xff09;為什么要有文件系統&#xff08;二&#xff09;FAT32文件系統組成&#xff08;三&#xff09;分步介紹各部分(1) 首先介紹一下MBR(2)DBR介紹(3)FAT表介紹(4) 數據區&#xff08;一&#xff09;為什么要有文件系統 文件系統是操作系統用…

java中動態代理實現機制

前言&#xff1a; 代理模式是常用的java設計模式&#xff0c;它的特征是代理類與委托類有同樣的接口&#xff0c;代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類&#xff0c;以及事后處理消息等。代理類與委托類之間通常會存在關聯關系&#xff0c;一個代理類…