用ZYNQ MPSoC玩DOOM
首先,需要下載 Linux 內(nèi)核,這樣我們隨后就可以構(gòu)建 rootFS。我們使用 v4.3 標(biāo)簽。
$ git clone -b v4.3 https://github.com/tor- valds/linux.git
下載 Buildroot 源文件,并更改到 Buildroot 目錄。
$ git clone https://git.buildroot.net/buildroot cd buildroot
現(xiàn)在我們需要配置 Buildroot,以構(gòu)建可以使用的套件。
$ make menuconfig
我們選擇以下選項(xiàng):
Target options ---> Target Architecture ---> AArch64 (little endian)
Target packages —> Games ---> prboom ---> [*]
Target packages —> Games ---> shareware Doom WAD file ---> [*]
應(yīng)自動選擇全部所需的庫。
$ make # (這需要幾分鐘時間,取決于機(jī)器。)
現(xiàn)在,我們將所有 PrBoom 相關(guān)文件復(fù)制到 targetfs 目錄,確保我們在 buildroot 目錄下的 ./output/target/ 目錄。
$ for i in $(find ./-name ‘*oom*’); do cp ${i}
/doom_demo/targetfs/${i}; done
現(xiàn)在,我們完成了 Buildroot 操作。我們移到上一個目錄 doom_demo 目錄。
$ make # Build the host and guest rootFS.(這需要幾分鐘時間,取決于你的機(jī)器。)
注意:可能還存在額外配置選項(xiàng),這主要取決于使用的內(nèi)核版本。這些額外配置選項(xiàng)未被我們提供的配置預(yù)先選擇。使用默認(rèn)選項(xiàng)即可(需點(diǎn)擊回車鍵)。
步驟 2:構(gòu)建基礎(chǔ)設(shè)置
接下來,我們?yōu)槠脚_構(gòu)建嵌入式系統(tǒng)軟件的剩余部分,包括引導(dǎo)裝載程序、ARM Trusted Firmware (ATF)、Linux 內(nèi)核和設(shè)備樹。賽靈思的 PetaLinux 工具讓這個過程簡單直觀。我們創(chuàng)建一個針對賽靈思 ZCU102 開發(fā)板的 PetaLinux 項(xiàng)目。參考 2015.4 UG1144 和 AR#66249 中 QEMU 和 MPSoC PetaLinux 的快速入門材料。訪問china.xilinx.com ,將 ZCU102 BSP (板支持包)下載到
目錄下。
$ cd
$ petalinux-create --type project -s
/ Xilinx-ZCU102-v2015.4-final.bsp -- name doom_demo_zynqMP
這樣將在 /doom_demo_zynqMP 中創(chuàng)建我們的 PetaLinux 項(xiàng)目。
我們轉(zhuǎn)到 PetaLinux 項(xiàng)目,并構(gòu)建 PetaLinux。
$ cd /doom_demo_zynqMP
$ petalinux-build
現(xiàn)在,我們需要為本用例手動編輯設(shè)備樹。
· 編輯 xen-overlay.dtsi 文件 (subsystems/linux/ configs/device-tree/xen-overlay.dtsi)。
· 將 dom0 下的 ‘reg = 0x0 0x80000 0x3100000>;’ 替換為 ‘reg = 0x0 0x80000 0x4100000>;’
· 將 dom0 下的 ‘xen,xen-bootargs = “console=dtuart dtuart=serial0 dom0_mem=512M bootscrub=0 maxcpus=1 time r_ slop=0”;’ 替換為 ‘xen,xen-bootargs = “console=dtuart dtuart=serial0 dom0_mem=512M bootscrub=0 maxcpus=4 timer_ slop=0”;’
· 將 dom0 下的 ‘xen,dom0-bootargs = “console=hvc0 earlycon=xen earlyprintk=xen maxcpus=1”;’ 替換為 ‘xen,dom0-bootargs = “rdinit=/bin/sh console=hvc0 earlycon=xen earlyprintk=xen maxcpus=4”;’
· 編輯 zynqmp.dtsi 文件 (subsystems/linux/configs/ device-tree/zynqmp.dtsi)。
· 將 dom0 下的 ‘compatible = “cdns,uart-r1p12”;’ 替換為 ‘compatible = “cdns,uart-r1p8”, “cdns,uart-r1p12”;’ 現(xiàn)在,手動構(gòu)建 Xen 設(shè)備樹。
$ dtc -I dts -O dtb -i ./subsystems/linux/con- figs/device-tree/ -o ./images/linux/xen.dtb ./ subsystems/linux/configs/device-tree/xen.dts
最后,我們需要將 Peta- Linux 構(gòu)建的 rootFS 替換為我們此前構(gòu)建的 rootFS。之所以這樣做,是因?yàn)?PetaLinux 不包含 PrBoom,因?yàn)槲覀兲峁┳约旱?rootFS。我們還需要將 xen.ub 鏡像替換為賽靈思預(yù)先構(gòu)建的鏡像,因?yàn)?Xen 和 Xen 工具版本必須匹配。
$ rm /doom_demo_zynqMP/images/linux/ Image rm /doom_demo_zynqMP/images/ linux/xen.ub
$ cp /doom_demo/Image /doom_ demo_zynqMP/images/linux/Image cp / doom_demo/xen.ub/doom_demo_zynqMP/im- ages/linux/xen.ub
使用 u-boot 引導(dǎo)加載程序引導(dǎo)。
$ petalinux-boot --qemu --u-boot --qemuargs= “- net nic -net nic -net nic -net nic -net us- er,net=192.168.129.0,dhcpstart=192.16 8.129.50,host=192.168.129.1,hostfwd=t cp:127.0.0.1:5900-192.168.129.50:5900”
> setenv serverip 192.168.129.1
> tftpb 4000000 xen.dtb; tftpb 0x80000 Image; tftpb 6000000 xen.ub; bootm 6000000 - 4000000
# /boot.sh
# /xen-doom.sh 1
步驟 3:開始演示
現(xiàn)在,我們可以打開虛擬網(wǎng)絡(luò)計(jì)算 (VNC) 查看器,并在運(yùn)行 QEMU 的機(jī)器上連接 localhost:5900 以觀看 Doom 游戲。(注意:以上命令行只能重定向 5900 端口,因此當(dāng)開始演示時只能連接到第一個 Doom 實(shí)例。如果想連接多個實(shí)例,需要為 QEMU 添加更多 hostfwd 變量,并連接到下個可用的端口[5901 用于下個實(shí)例,5902 用于第三個實(shí)例,以此類推],然后將這些實(shí)例連接。)
一旦 Doom 啟動,你就可以使用鍵盤和鼠標(biāo)控制游戲。應(yīng)記住,可能需要點(diǎn)擊 ESC 鍵來開始游戲。還應(yīng)記住,你已經(jīng)很長時間沒玩 Doom 游戲了,因此你可能走不了多遠(yuǎn)。別氣餒。使用自己構(gòu)建的系統(tǒng)絕對”可行”。
XEN 深入探討
正如”Zynq MPSoC 獲得 Xen 管理程序支持”(賽靈思中國通訊,第 93 期)中所介紹, Type 1 管理程序在本機(jī)硬件上運(yùn)行,Type 2 管理程序不是軟件的最底層,而是托管在 OS 上。Xen 屬于 Type 1 管理程序(圖 4)。
圖 4:作為 Type 1 管理程序,Xen 在本機(jī)硬件上運(yùn)行,虛擬機(jī)在 Xen 之上運(yùn)行 (來源:”帶虛擬化擴(kuò)展的 Xen ARM” 白皮書)。
以前,我們提到了虛擬處理器(也稱虛擬機(jī))。在 Xen 中,這些被稱為域。特權(quán)最高的域被稱為 Dom0;無特權(quán)的客戶域是 DomU 域。
Dom0 是 Xen 管理程序在引導(dǎo)時創(chuàng)建的初始域。它是特權(quán)域,并驅(qū)動平臺上的設(shè)備。Xen 將 CPU、存儲器、中斷和定時器虛擬化,為虛擬機(jī)提供一個或多個虛擬 CPU、系統(tǒng)存儲器的一部分、一個虛擬中斷控制器和一個虛擬定時器。除非配置為其他方式,否則 Dom0 可直接訪問所有設(shè)備并驅(qū)動它們。Dom0 還運(yùn)行一組名為半虛擬化 (PV) 后端的驅(qū)動,為無特權(quán)虛擬機(jī)提供對磁盤、網(wǎng)絡(luò)等設(shè)備的訪問權(quán)。Xen 提供用于發(fā)現(xiàn)和初始通信設(shè)置的所有工具。作為 DomU 的 OS 通過運(yùn)行相應(yīng)的 PV 前端驅(qū)動程序來獲得對一組通用虛擬設(shè)備的訪問權(quán)。根據(jù) DomU 的數(shù)量,單個后端可服務(wù)多個前端。有一對適用于所有最常見設(shè)備類型(磁盤、網(wǎng)絡(luò)、控制臺、幀緩沖器、鼠標(biāo)、鍵盤等)的 PV 驅(qū)動程序。PV 驅(qū)動程序通常位于 OS 內(nèi)核(即 Linux)中。幾個 PV 后端也可以在用戶空間中運(yùn)行,通常在 QEMU 中。前端在存儲器的共享頁上使用簡單的環(huán)協(xié)議連接后端。從 Dom0 與管理程序交互要求程序使用定義的管理程序調(diào)用(類似于系統(tǒng)調(diào)用)。Xen 提供一個名為 Xen Tools (也可寫成 xen-tools)的、帶有庫的參考工具箱。xen-tools 包含一個名為 xl 的程序,該程序可與其他程序一起檢查狀態(tài)和創(chuàng)建客戶機(jī)。
利用設(shè)備半虛擬化,可在管理程序與客戶機(jī)之間就如何進(jìn)行通信達(dá)成協(xié)議。常見的通信協(xié)議為 Xen Bus 和 VirtIO。
xl 中的”create”命令要用到描述客戶機(jī)的配置文件,如果配置文件規(guī)定客戶機(jī)需要一個由 VNC 會話支持的虛擬幀緩沖器 (VFB),那么 xl 會在 Dom0 用戶空間中自動啟動虛擬化代碼(本演示中,為每個客戶機(jī)啟動一個)。
doom VM 的配置文件如下所示:
# 客戶機(jī)名稱
name = “guest1”
# 要引導(dǎo)的內(nèi)核鏡像
kernel = “/boot/Image”
# 內(nèi)核命令行選項(xiàng)
extra = “console=hvc0 rdinit=/doom.sh”
# 最初存儲器分配 (MB)
memory = 56
# VCPUS 數(shù)量
vcpus = 1
vfb = [‘type=vnc, vnclisten=0.0.0.0’]
XEN 中的設(shè)備
為客戶機(jī)提供設(shè)備有三種常用方法:仿真、半虛擬化和直通 (圖 5)。對于設(shè)備仿真,當(dāng)客戶機(jī)向仿真設(shè)備的存儲器寫入時,寫入操作會觸發(fā)陷阱。陷阱通常就是頁面錯誤。陷阱使處理器能夠切換到管理程序,以仿真設(shè)備。仿真是靈活的,但速度慢,因?yàn)橐幚硭邢葳澹乙腥藶樗行枰抡娴脑O(shè)備編寫模型。而且,很難找到方法來加速仿真,因?yàn)閹缀鯖]有硬件加速;完全是軟件方法。
圖 5:方案、半虛擬化和直通方案的對比
利用設(shè)備半虛擬化,可在管理程序與客戶機(jī)之間就如何進(jìn)行通信達(dá)成協(xié)議。通常有一個共享的存儲器區(qū)域(以及協(xié)議),這看起來像一個設(shè)備,而且管理程序在該區(qū)域處理請求。例如,為了在 Linux 上支持半虛擬化幀緩沖器,Linux 前端驅(qū)動會把從用戶空間獲得的幀緩沖器寫入共享存儲器區(qū)域;然后使用管理程序調(diào)用向管理程序發(fā)信號,以通過后端驅(qū)動來輸出幀??蛻魴C(jī)只能通過半虛擬化驅(qū)動程序與主機(jī) (Dom0)和其他客戶機(jī) (DomU) 對話。這種方案的優(yōu)勢是:用戶可以在很多客戶機(jī)之間共享設(shè)備;運(yùn)行快速;客戶機(jī)可以運(yùn)行大部分都沒修改的內(nèi)核。要求的變動在標(biāo)準(zhǔn)接口下面,因此對于應(yīng)用程序以及內(nèi)核其余部分來說,前端驅(qū)動程序看起來就像正常的網(wǎng)絡(luò)接口、磁盤或其他設(shè)備。支持客戶機(jī)通信的兩個常用協(xié)議是 Xen Bus 和 VirtIO。
在直通模式下,主機(jī)將設(shè)備”交給”一個客戶機(jī)。這意味著每次只有一個客戶機(jī)可以使用該設(shè)備。
設(shè)備性能與安全
一般來說,與通過直通方式提供的設(shè)備相比,仿真的設(shè)備性能比較低;半虛擬化方案則趨向于具備足夠性能。半虛擬化方案和仿真方案的優(yōu)勢在于管理程序可以讓設(shè)備訪問多個實(shí)體,而不會將這些實(shí)體相互暴露。
原理簡介
Doom-on-Zynq UltraScale+ MPSoC 的處理上下文環(huán)境就像洋蔥一樣有很多層(圖 6)。Cortex-A53 中是四個 ARMv8 內(nèi)核。在每個內(nèi)核上,管理程序運(yùn)行在 EL2 中,客戶機(jī)(Dom0 或 DomU)運(yùn)行在 EL0/EL1 中。每個 DomU 客戶機(jī)都運(yùn)行 Linux;Doom (PrBoom) 運(yùn)行在用戶空間中。Doom 使用簡單直接媒體層 (SDL),通過 SVC 指令(最終)與幀緩沖器前端驅(qū)動對話。幀緩沖器前端將緩沖器寫入 Dom0 建立的共享存儲器區(qū)域。前端驅(qū)動通過協(xié)議(例如 Xen Bus 或 VirtIO)使用 HVC 指令(最終)與 Dom0 上運(yùn)行的虛擬化代碼通信。在 Dom0 上運(yùn)行的虛擬化代碼提供一個用于顯示的后端,然后該后端由虛擬化代碼的 VNC 服務(wù)器進(jìn)行編碼,并通過網(wǎng)絡(luò)送到 VNC 客戶端。
圖6:X86 架構(gòu)上從 PetaLinux 工具啟動 QEMU
此信息和演示能夠?yàn)楣芾沓绦虻倪M(jìn)一步研究和實(shí)驗(yàn)提供很好的基礎(chǔ)。當(dāng)你能夠在 QEMU 上用仿真來運(yùn)行演示之后,就可使用 PetaLinux 工具在 Zynq UltraScale+ MPSoC 芯片上運(yùn)行。
評論