在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在x86平臺,如何用Qemu來模擬ARM系統

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-10-26 10:01 ? 次閱讀

前言

前一段時間因為工作需要,我對ARM模擬器進行了一番調研。調研目的是:由于項目參與人員比較多,如果人手一塊ARM開發板,資源比較緊張,希望能夠用模擬器來代替。

在調研期間,花費了很多時間去查資料、測試驗證。在實際驗證的時候,發現一個現象:很多文章雖然給出了或簡單、或詳細的操作步驟,但是大部分都沒有寫清楚操作的背景、各個軟件的版本,這就導致需要把整個文章看完了、把所有的操作步驟都做了一遍,才明白作者想表達的是什么意思,操作的目的是什么

我覺得,任何一篇文章,首先要讓讀者知道為什么要讀這篇文章,或者說讀了這篇文章能夠有什么收獲

如果是操作性比較強的文章,那么就有必要交代清楚工作平臺的背景是什么,要達到的目的是什么,總體步驟是怎么樣的。只有這樣,閱讀文章的人在心中首先建立一個宏觀的框架,在理解框架的基礎上,再去實際操作,這樣的話就更容易理解。

當然了,每個人的學習和閱讀習慣都不一樣,上面只是我個人的感受,或者說我喜歡這樣比較有條理的文章,這樣才不至于迷茫。

回到Qemu的主題上來,這篇文章主要是把調研的結果進行梳理、匯總,包括如下內容:

為什么需要ARM模擬系統?
Qemu是什么?
Qemu 能做什么?或者說適合做什么?
在 Ubuntu16.04 系統中,利用 Qemu 搭建一個ARM虛擬機操作步驟是什么?
編寫一個HelloWorld程序,放到虛擬機中執行。

為什么需要ARM模擬系統

ARM平臺的軟件開發工作,可以劃分為2類:

應用程序的開發
系統開發(內核、文件系統、驅動程序)

應用程序的開發

我們在開發嵌入式項目的時候,一般都是先在x86平臺上把大部分的功能開發完成,然后再交叉編譯,得到在ARM平臺的可執行程序或者庫文件。再通過scp指令或者NFS遠程掛載的方式,把這些文件復制到ARM板子上之后執行。

一般而言,應用程序就是利用硬件產品的各種資源、外設,來完成特定的功能,比如:數據采集、控制外部設備、網絡傳輸等等。主要的特征就是與外部的各種設備進行交互。

系統開發(BSP)

系統開發的最終目的是:為應用程序的執行準備一個基本的執行環境,內容包括:系統引導程序bootloader,內核kernel,文件系統rootfs,系統中所有設備的驅動程序。在實際的項目開發中,系統開發難度更大一些,一旦開發完成,對于一塊板子來說基本上不會輕易變動,代碼的使用生命周期更長。

以上這兩種分類,主要是從開發工作的內容角度來進行劃分的。可以看出:

應用程序開發:靈活性更大、需求變動會更多(產品經理或項目經理經常給你改需求)。
系統軟件開發:需求更穩定、很多代碼都是官方提供或者開源的,工作內容就是進行定制、裁剪。

對于系統軟件開發來說,如果每次編譯出一個bootloader、或者kernel,都上一個ARM開發板進行驗證,的確比較麻煩。如果能有一個ARM模擬系統,直接在x86上進行模擬,工作效率就會提高很多

Qemu是什么?

Qemu是一個開源的托管虛擬機,通過純軟件來實現虛擬化模擬器,幾乎可以模擬任何硬件設備。比如:Qemu可以模擬出一個ARM系統中的:CPU、內存、IO設備等,然后在這個模擬層之上,可以跑一臺ARM虛擬機,這個ARM虛擬機認為自己在和硬件進行打交道,但實際上這些硬件都是Qemu模擬出來的

9b536e18-54ce-11ed-a3b6-dac502259ad0.png

正因為Qemu是純軟件實現的,所有的指令都要經過它的轉換,所以性能非常低。所以在生產環境中,大多數的做法都是配合KVM來完成虛擬化工作,因為KVM是硬件輔助的虛擬化技術,主要負責比較繁瑣的CPU和內存虛擬化,而Qemu則負責I/O虛擬化,兩者合作各自發揮自身的優勢,相得益彰。這部分不是重點,就不具體深入介紹了。

Qemu的兩種模式

Qemu有兩種執行模式

  1. 用戶模式(User mode):利用動態代碼翻譯機制來執行不同主機架構的代碼,例如:在x86平臺上模擬執行ARM代碼,也就是說:我們寫一條ARM指令,傳入整個模擬器中,模擬器會把整個指令翻譯成x86平臺的指令,然后在x86的CPU中執行。
9b6b5cf8-54ce-11ed-a3b6-dac502259ad0.png
  1. 系統模式(System mode):模擬整個電腦系統,利用其它VMM(Xen, KVM)來使用硬件提供的虛擬化支持,創建接近于主機性能的全功能虛擬機。
9b77f5a8-54ce-11ed-a3b6-dac502259ad0.png

Qemu 能做什么?或者說適合做什么?

因為Qemu是使用純軟件模擬的,它的強項是模擬那些不涉及到外部的具體硬件設備的場景,比如:

想學習如何定制bootloader;
想在Arm系統中進行文件系統的裁剪,學習文件系統的掛載過程;
想體驗一下如何配置、裁剪linux kernel;想學習Linux系統中的設備樹;
...

以上這些場景中,都非常適合使用Qemu來模擬ARM系統。

在 Ubuntu16.04 系統中,利用 Qemu 搭建一個ARM虛擬機

使用Qemu虛擬機的幾種選擇

利用Qemu來運行ARM虛擬機,你有2個選擇

  1. 簡單方式:直接下載別人編譯好的映像文件(包含了內核,根文件系統),直接執行即可。
    缺點是:別人編譯好的也許不適合你的需求,沒法定制。
  2. 復雜方式:自己下載內核代碼、根文件系統代碼(例如:busybox),然后進行編譯。
    優點是:可以按照自己的實際需求,對內核、根文件系統機型裁剪。

在第2種復雜模式中,又可以有2個選擇

2-1. 內核代碼、根文件系統代碼全部自己手動編譯,最后把這些編譯結果手動組織在一個文件夾中,形成自己的根目錄;
2-2. 利用 buildroot 整個框架,只需要手動進行配置(比如:交叉編譯器在本機上的位置、輸出路徑、系統的裁剪),然后就可以一鍵編譯出一個完整的系統,可以直接燒寫到機器!

以上這幾種操作方式的選擇,可以根據自己的實際需要來選擇。如果對構建系統的整個流程已經非常熟悉了,就利用buildroot工具;如果是想更徹底的學習制作一個系統,那就手動一步一步的實際編譯、操作一遍,多練幾次,你就變成大牛了。

下面,我們就按照2-2的方式,進行實際操作一遍。所有的指令部分,我都直接貼代碼,不用截圖,這樣方便復制。

測試平臺

我的工作電腦是Win10,通過VirtualBox安裝了Ubuntu16.04虛擬機,64位系統

下面的操作在Ubuntu16.04虛擬機中可以順利編譯,當然,一些基本的工具(例如:build-essential, make等基礎工具軟件這里就不詳述了)。

安裝交叉編譯器

交叉編譯器的作用就不需要詳細解釋了,因為我們是在x86平臺上進行編譯,而運行的平臺是ARM系統,這2個平臺的指令集不一樣,所以需要交叉編譯得到ARM系統上可以執行的程序。


		
sudo apt-get install gcc-arm-linux-gnueabi

驗證安裝結果


		
dpkg -l gcc-arm-linux-gnueabi

顯示如下:

9baa71b8-54ce-11ed-a3b6-dac502259ad0.png

有些文章建議自己下載交叉編譯器,然后手動設置環境變量。我實際操作了一下,手動下載的交叉編譯工具鏈在編譯內核的時候報錯,所以還是建議直接用apt-get直接安裝

編譯內核kernel

內核kernel的作用也是不言而喻的,就相當于我們的Windows操作系統,沒有這個操作系統,硬件就是一堆廢鐵。當系統啟動的時候,會把內核加載到內存中,然后從內核的入口地址開始執行。

  1. 下載內核版本:linux-4.14.212.tar。在文末,我會列出所有的軟件包下載地址。

  2. 使用現成的vexpress開發板子的config文件


		
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig

這個操作,會把vexpress_defconfig作為配置文件保存為.config,下面在編譯內核時就根據這個config中的配置進行編譯。

如果需要對內核進行裁剪,執行:


		
make menuconfig

根據自己的實際需要,對內核進行定制。比如:可以配置網絡和NFS,在系統啟動的時候就自動掛載宿主機中的某個目錄。

  1. 編譯內核

		
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

編譯得到內核文件arch/arm/boot/zImage,Qemu啟動時需要指定使用這個映像文件。

制作根文件系統

內核在啟動之后、執行到最后步驟時,需要掛載根文件系統,然后執行文件系統中指定的執行程序,例如:/etc/rc.local。

如果沒有跟文件系統,那么內核在執行到最后就提示:panic...

  1. 下載busybox

    版本:busybox-1.20.2.tar.bz2。

  2. 創建rootfs根目錄


		
mkdir -p rootfs/{dev,etc/init.d,lib}

  1. 把busybox-1.20.2中的文件復制到rootfs根目錄下,主要是一些基本的命令

		
cp busybox-1.20.2/_install/* -r rootfs/

  1. 把交叉編譯工具鏈中的庫文件復制到rootfs根目錄的lib文件夾下

		
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

  1. 制作根文件系統鏡像根文件系統鏡像就相當于一個硬盤,就是把上面rootfs根目錄中的所有文件復制到這個硬盤中。

(1) 生成512M大小的磁盤鏡像


		
qemu-img create -f raw disk.img 512M

(2) 把磁盤鏡像格式化成ext4文件系統


		
mkfs -t ext4 ./disk.img

(3) 將rootfs根目錄中的所有文件復制到磁盤鏡像中操作步驟是:創建掛載點-掛載-復制文件-卸載。


		
mkdir tmpfs 
sudo mount -o loop ./disk.img tmpfs/  
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs

(4) 使用file指令檢查一下


		
file disk.img

9bc01270-54ce-11ed-a3b6-dac502259ad0.png

利用Qemu啟動ARM虛擬機

1.啟動虛擬機

這個命令有點長,測試時建議直接復制、粘貼。


		
qemu-system-arm -M vexpress-a9 -m 512M -kernel ./linux-4.14.212/arch/arm/boot/zImage -dtb  ./linux-4.14.212/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd disk.img

2.停止虛擬機在Ubuntu另一個終端窗口中,通過killall指令來停止。


		
killall qemu-system-arm

當然,也可以用ps指令找到qemu-system-arm的進程號,然后通過kill -9來停止虛擬機。

測試HelloWorld應用程序

  1. 在Ubuntu任意一個目錄,編寫HelloWorld可執行程序hello.c:

		
#include  
int main() 
{     
    printf("HelloWorld! 
");
    return 0; 
}

  1. 交叉編譯hello.c,得到可執行程序hello:

		
arm-linux-gnueabi-gcc hello.c -o hello 

通過file指令,查看一下hello程序:


		
file hello

9bd14310-54ce-11ed-a3b6-dac502259ad0.png
  1. 通過kill命令停止虛擬機。

  2. 把hello可執行程序復制到磁盤鏡像disk.img中操作步驟是:掛載-復制文件-卸載。


		
sudo mount -o loop ./disk.img tmpfs/  
cp hello tmpfs/ 
sudo umount tmpfs

  1. 執行hello程序再次啟動虛擬機,此時可以在根目錄下面看到hello文件,直接執行即可看到輸出結果。

總結

在以上的操作步驟中,我們把一個ARM系統在啟動應用程序之前,所需要的程序都手動編譯、操作了一遍。看一遍很容易就明白,親手操作一遍印象會更深刻。

這里的操作過程有些還需要繼續深入,比如:在系統啟動之后,自動掛載宿主機(Ubuntu系統)中的某個文件夾,這樣就可以把hello等可執行程序復制到掛載目錄中,然后在ARM系統中直接執行了,而不用再執行下面在一連串的操作(停止虛擬機-掛載磁盤鏡像-復制文件-卸載-啟動虛擬機)。

最后,希望這篇總結能給你帶來小小的收獲和提升!

軟件下載地址

1. linux-4.14.212.tar.xz

鏈接:https://pan.baidu.com/s/1d8RxjMkYQhPtbZgiybD8Gw

提取碼:b6ft。

2. busybox-1.20.2.tar.bz2

鏈接:https://pan.baidu.com/s/1oPeH7juEWuFR6y1Qpna_BA

提取碼:9kh6

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9121

    瀏覽量

    368233
  • 應用程序
    +關注

    關注

    37

    文章

    3285

    瀏覽量

    57779
  • qemu
    +關注

    關注

    0

    文章

    57

    瀏覽量

    5363

原文標題:一步步教你:在x86平臺,如何用Qemu來模擬ARM系統

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ARMx86:架構對比及其應用

    典型的服務器架構的x86采用模塊化方法,基于帶有可更換組件的主板。CPU和其他組件(如顯卡和GPU、內存控制器、存儲或處理核心)針對特定功能進行了優化,可以輕松更換或擴展。然而,這種便利是有代價
    的頭像 發表于 01-15 15:43 ?37次閱讀
    <b class='flag-5'>ARM</b>與<b class='flag-5'>x86</b>:架構對比及其應用

    Arm主板與x86主板的區別

    等領域中占據了重要地位。本文旨在探討Arm主板與x86主板之間的區別,分析其架構、性能、能效、生態系統以及應用場景等方面的差異,以幫助讀者更好地理解這兩種技術的
    的頭像 發表于 01-07 12:21 ?92次閱讀
    <b class='flag-5'>Arm</b>主板與<b class='flag-5'>x86</b>主板的區別

    英特爾將攜手AMD共同捍衛x86生態

    10月16日,英特爾正式公布了一項重大合作計劃:與AMD攜手成立x86生態系統咨詢小組。該計劃由英特爾CEO帕特·基辛格親自宣布。   x86生態系統咨詢小組(
    的頭像 發表于 10-16 13:49 ?507次閱讀

    ARM 架構工控機與 X86 架構工控機:差異究竟在哪?

    控制系統等行業。本文詳細分析一下ARM工控機與X86架構工控機,供大家參考。 應用領域:ARM控制器適用于小型應用,邊緣計算、自動化控制、物聯網關、智慧城市、智能設備等場景,比如ARM
    的頭像 發表于 09-20 15:13 ?547次閱讀
    <b class='flag-5'>ARM</b> 架構工控機與 <b class='flag-5'>X86</b> 架構工控機:差異究竟在哪?

    樹莓派是x86還是arm

    樹莓派(Raspberry Pi)是一款由英國樹莓派基金會(Raspberry Pi Foundation)開發的微型計算機。它基于ARM架構,而非x86架構。 一、樹莓派的發展歷程 樹莓派的誕生
    的頭像 發表于 08-30 15:42 ?1230次閱讀

    X86架構和ARM架構有什么區別

    X86架構和ARM架構是兩種主流的CPU架構,它們多個方面存在顯著的差異。以下是對這兩種架構的詳細比較,涵蓋了追求目標、應用領域、技術特點、性能功耗比、軟件生態以及未來趨勢等方面。
    的頭像 發表于 08-22 11:21 ?9571次閱讀

    鴻道Intewell工業操作系統ARM平臺生態:飛騰E2000Q

    鴻道Intewell操作系統還具有高度的兼容性和易用性,支持X86架構,能夠與Intel全系列處理器良好配合,同時兼容多種外設和硬件平臺,便于集成和擴展。它還注重用戶體驗,提供友好的開發和調試工具,簡化了
    的頭像 發表于 08-06 17:40 ?584次閱讀
    鴻道Intewell工業操作<b class='flag-5'>系統</b><b class='flag-5'>ARM</b><b class='flag-5'>平臺</b>生態:飛騰E2000Q

    探索RISC-V二進制翻譯,openKylin成功SG2042平臺運行X86架構軟件!

    眾所周知,新的指令集架構發展初期,往往采用兼容其他架構軟件的方法拓展自身生態體系,如蘋果公司的Rosetta2和微軟的Arm64EC,都是將X86架構軟件運行在
    的頭像 發表于 07-24 08:34 ?596次閱讀
    探索RISC-V二進制翻譯,openKylin成功<b class='flag-5'>在</b>SG2042<b class='flag-5'>平臺</b>運行<b class='flag-5'>X86</b>架構軟件!

    觸翔X86工控主板交互機器人中的應用

    X86工控主板交互機器人中的應用主要體現在其高可靠性、抗干擾性和穩定性等方面,為交互機器人的正常運行和精確控制提供了有力支持。以下是關于X86工控主板交互機器人中應用的詳細分析:
    的頭像 發表于 05-28 15:48 ?494次閱讀

    任天堂Switch初代游戲機模擬運行Windows 11 ARM效果展示

    5 月 14 日,某開發者PatRykX平臺發布帖子,展示了將任天堂Switch初代游戲機Linux環境中通過QEMU
    的頭像 發表于 05-14 10:16 ?918次閱讀

    谷歌發布Axion新款數據中心AI芯片,性能超越x86及云端

    谷歌預計將通過Google Cloud提供Axion AI芯片給客戶。谷歌強調這款基于ARM的CPU產品具有優越的性能表現,甚至超越了傳統的x86芯片及云端通用ARM芯片。
    的頭像 發表于 04-10 16:32 ?911次閱讀

    谷歌發布Arm架構CPU,性能超越x86和通用Arm芯片

    據悉,谷歌計劃借助谷歌云提供名為Axion的基于Arm的中央處理器(CPU)。該公司表示,其性能優越,超過同類x86芯片及云端通用Arm芯片。
    的頭像 發表于 04-10 09:25 ?599次閱讀

    x86 SBC vs ARM SBC:選擇適合您的單板計算機

    比較,幫助您決定哪一種適合您。 基礎知識 我們深入比較之前,有必要了解什么是 x86ARM 架構。 x86是一種復雜指令集計算(CISC)架構,是大多數臺式機和筆記本電腦的設計
    的頭像 發表于 03-07 13:26 ?555次閱讀

    康佳特在其x86計算機模塊集成Hypervisor簡化系統整合

    有新的x86計算機模塊。對基于x86的康佳特計算機模塊(COM)而言,Hypervisor是可輕松添加的附加組件。現在,Hypervisor已被集成到固件中,并成為所有x86計算機模塊的標準配置,進而降低
    發表于 02-01 11:25 ?375次閱讀
    康佳特在其<b class='flag-5'>x86</b>計算機模塊集成Hypervisor簡化<b class='flag-5'>系統</b>整合

    arm架構和x86架構區別 linux是x86還是arm

    ARM架構和x86架構是兩種不同的計算機處理器架構,它們體系結構、指令集、應用領域等方面有著明顯的區別。Linux操作系統則具有廣泛的適配性,可以運行在各種架構上,包括
    的頭像 發表于 01-30 13:46 ?1.9w次閱讀
    主站蜘蛛池模板: 手机看片国产福利 | 色偷偷97| 天天综合天天看夜夜添狠狠玩 | 国产传媒在线观看视频免费观看 | 免费的黄色片 | 日本午夜大片 | 狠狠色噜噜狠狠狠狠999米奇 | 午夜免费福利网站 | 日韩精品一级毛片 | 五月激情综合丁香色婷婷 | 免费看欧美一级片 | 簧片地址 | 久久精品国产免费看久久精品 | 国产一卡二卡≡卡四卡无人 | 久久天天躁夜夜躁狠狠躁2015 | 在线免费观看一区二区三区 | 日本免费不卡一区 | 黄色一级大片视频 | 中文字幕一区二区三区精品 | www在线视频| 日韩毛片视频 | 一级特级毛片免费 | 色99视频| 啊用力太猛了啊好深视频免费 | 色噜噜噜噜色 | 人人干天天操 | h视频在线免费 | 伊人天天操 | 护士巨好爽好大乳 | 黄色在线网站 | 东北美女野外bbwbbw免费 | 亚洲免费色视频 | 麻生希痴汉电车avop130 | 欧美aaaaaaaaa| 免费激情网站 | 欧美精品久久天天躁 | 国模私拍一区二区 | 国产午夜视频高清 | 一区二区三区视频免费观看 | 亚洲视频四区 | 精品无码三级在线观看视频 |