進入和退出例外模式
在真實系統(tǒng)中,模式之間的切換比我們的實例更復雜一些。ARM 總結了 ARMv8-A 架構的行為并在參考手冊中給出。手冊中介紹,只有在接到例外或從例外返回時,才能改變執(zhí)行所處的例外等級。在接到例外時,例外等級只能升高或保持不變;在從例外返回時,例外等級只能降低或保持不變。只有三個指令能生成針對下個例外等級的例外:SVC (Supervisor Call),生成針對 EL1 的例外;HVC (Hypervisor Call),生成針對 EL2 的例外;SMC (Secure Monitor Call),生成針對 EL3 的例外。這些指令取值范圍為 0-65,555,允許每個例外等級有 216 個系統(tǒng)調用。這些指令針對下個例外等級,而且是唯一可供運行在較低例外等級的程序從運行在較高例外等級的程序請求某些內容的機制。在我們的理論實例中,SVC 是 SWITCHSUPER,HVC 是 SWITCHHYPER。
PetaLinux 工具包含一組命令,以供用戶在賽靈思 FPGA 和 SoC 上輕松創(chuàng)建和擴展 Linux 系統(tǒng)。
在前一個部分,我們介紹了能夠讓運行在 USER 模式(EL0)的程序進入 SUPER 模式 (EL1) 的事件。大多數(shù)運行在 USER 模式的程序生成的事件是請求存儲器。當運行在 EL0 中的用戶空間程序從運行在 EL1 中的 OS 請求存儲器時,這個用戶空間程序的 C 代碼可能調用函數(shù) malloc(),再由該函數(shù)調用 mmap() 或 sbrk(),以從 OS 請求一個指向可用存儲器的指針。在 ARMv8-A 架構中的 Linux 上,這個過程在幕后轉化為 SVC 系統(tǒng)調用。該系統(tǒng)調用會把處理器轉換為 EL1,從而將控制權送回 OS,后者會解讀調用內容并提供正確的響應——本例中是指向所請求存儲器區(qū)域的指針,或者是一個錯誤,用以指出沒有可用存儲器。
演示創(chuàng)建和工具
現(xiàn)在我們來介紹我們團隊在 Zynq UltraScale+ QEMU Model 上運行 Doom 時所采用的步驟。這些步驟展示了如何獲得和構建運行演示所需的每個組件,如何運行以及以什么順序運行每個組件,以及如何與演示交互。成功完成該演示之后,你會獲得一個環(huán)境,用來在上面進行實驗,以了解 Xen 管理程序在仿真的 Zynq UltraScale+ MPSoC 上的運行情況。還需要將此遷移植 Zynq UltraScale+ MPSoC 芯片,這可作為練習由用戶來完成。
想玩 DOOM 嗎?
為了讓過程更簡單,賽靈思提供基礎的根文件系統(tǒng),這樣用戶就無需花時間和精力自己構建。此演示所需的所有下載內容在以下網(wǎng)址中均有提供: inx.com/Doom+on+Xen+Demo。
該演示首先通過更新由賽靈思提供的預編譯根文件系統(tǒng) (rootFS),可包含所需的組件。然后,利用賽靈思的 PetaLinux 工具運行演示。rootFS 包含運行于 Linux 系統(tǒng)上的大部分程序——具體來說就是用來啟動系統(tǒng)的一組腳本,以及用來實現(xiàn)系統(tǒng)的應用程序與函數(shù)庫集。我們用來擴展演示中的基礎 rootFS 所使用的兩個工具分別是 Buildroot 和 PetaLinux。我們使用 Buildroot 為賽靈思提供的基礎 rootFS 構建 Doom 二進制文件,同時使用 PetaLinux 創(chuàng)建 rootFS 的剩余部分并引導演示。
Buildroot
Buildroot 是一個簡單的構建系統(tǒng),用于為 Linux 系統(tǒng)創(chuàng)建 rootFS。它使用 make menuconfig 接口,這是一個用來配置 Linux 內核本身的常用方法。Buildroot 包含對 PrBoom 的默認支持,這對于本演示很有幫助。(PrBoom 是我們所使用的 Doom 游戲的 GNU 通用公共許可證 [GPL] 版本。這里我們會穿插使用 PrBoom 和 Doom 這兩個術語。 )Buildroot 對 Xen 構建不提供本地支持(盡管它可創(chuàng)建用于構建 Xen 所需的所有庫和工具鏈),因此賽靈思提供 Xen、Xen 工具和為用戶預編譯的 Xen 庫以及其他一些所需的庫,以讓過程簡單直觀。
PetaLinux
PetaLinux 工具包含一個命令集,以便讓用戶在賽靈思 FPGA 和 SoC 上輕松創(chuàng)建和擴展 Linux 系統(tǒng)。該演示使用 petalinux-build 和 petalinux-boot 命令。petalinux-build 命令用于創(chuàng)建全部所需的組件。petalinux-boot 命令(外加幾個變量)用于啟動在 QEMU 仿真器上運行的所有組件。介紹 PetaLinux 工具中的所有命令超出了本文的范圍,但是通過此演示系統(tǒng)應該很容易發(fā)掘這兩個命令和其他命令的功能。參考PetaLinux 工具文檔 — 參考指南 UG1144 (v2015.4) 了解更多信息。
項目先決條件
該項目需要一個運行 Linux 的工作站或虛擬機,具有滿足 UG1144 (v2015.4) 中所列的 PetaLinux 工具安裝要求的環(huán)境,而且環(huán)境中需要安裝賽靈思 PetaLinux Tools v2015.4 版本。
一旦 Doom 啟動,你就可以使用鍵盤和鼠標控制游戲。應記住,可能需要點擊 ESC 鍵來開始游戲。開始游戲咯!
步驟 1:構建 ROOTFS
首先,我們需要構建 rootFS。從賽靈思下載 doom_demo.tar.gz,打開下載目錄中的一個 terminal;你可在以下網(wǎng)址中找到全部所需文件: +on+Xen+Demo。我們將該目錄稱為 。
解壓文檔。
$ cd
$ tar -xzf doom_demo.tar.gz && cd doom_demo
我們會看到一個文件夾,我們將把它存到根文件系統(tǒng)(一個用于 Dom0,另一個用于 DomU)?,F(xiàn)在,我們需要構建 PrBoom,并復制到 rootFS。
首先,需要下載 Linux 內核,這樣我們隨后就可以構建 rootFS。我們使用 v4.3 標簽。
$ 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,以構建可以使用的套件。
$ make menuconfig
我們選擇以下選項:
Target options ---> Target Architecture ---> AArch64 (little endian)
Target packages —> Games ---> prboom ---> [*]
Target packages —> Games ---> shareware Doom WAD file ---> [*]
應自動選擇全部所需的庫。
$ make # (這需要幾分鐘時間,取決于機器。)
現(xiàn)在,我們將所有 PrBoom 相關文件復制到 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.(這需要幾分鐘時間,取決于你的機器。)
注意:可能還存在額外配置選項,這主要取決于使用的內核版本。這些額外配置選項未被我們提供的配置預先選擇。使用默認選項即可(需點擊回車鍵)。
步驟 2:構建基礎設置
接下來,我們?yōu)槠脚_構建嵌入式系統(tǒng)軟件的剩余部分,包括引導裝載程序、ARM Trusted Firmware (ATF)、Linux 內核和設備樹。賽靈思的 PetaLinux 工具讓這個過程簡單直觀。我們創(chuàng)建一個針對賽靈思 ZCU102 開發(fā)板的 PetaLinux 項目。參考 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 項目。
我們轉到 PetaLinux 項目,并構建 PetaLinux。
$ cd /doom_demo_zynqMP
$ petalinux-build
現(xiàn)在,我們需要為本用例手動編輯設備樹。
編輯 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)在,手動構建 Xen 設備樹。
$ 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 構建的 rootFS 替換為我們此前構建的 rootFS。之所以這樣做,是因為 PetaLinux 不包含 PrBoom,因為我們提供自己的 rootFS。我們還需要將 xen.ub 鏡像替換為賽靈思預先構建的鏡像,因為 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 引導加載程序引導。
$ 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)絡計算 (VNC) 查看器,并在運行 QEMU 的機器上連接 localhost:5900 以觀看 Doom 游戲。(注意:以上命令行只能重定向 5900 端口,因此當開始演示時只能連接到第一個 Doom 實例。如果想連接多個實例,需要為 QEMU 添加更多 hostfwd 變量,并連接到下個可用的端口[5901 用于下個實例,5902 用于第三個實例,以此類推],然后將這些實例連接。)
一旦 Doom 啟動,你就可以使用鍵盤和鼠標控制游戲。應記住,可能需要點擊 ESC 鍵來開始游戲。還應記住,你已經很長時間沒玩 Doom 游戲了,因此你可能走不了多遠。 別氣餒。使用自己構建的系統(tǒng)絕對“可行”。
XEN 深入探討
正如“Zynq MPSoC 獲得 Xen 管理程序支持”(賽靈思中國通訊,第 93 期)中所介紹, Type 1 管理程序在本機硬件上運行,Type 2 管理程序不是軟件的最底層,而是托管在 OS 上。Xen 屬于 Type 1 管理程序(圖 4)。
?
圖 4:作為 Type 1 管理程序,Xen 在本機硬件上運行,虛擬機在 Xen 之上運行
以前,我們提到了虛擬處理器(也稱虛擬機)。在 Xen 中,這些被稱為域。特權最高的域被稱為 Dom0;無特權的客戶域是 DomU 域。
Dom0 是 Xen 管理程序在引導時創(chuàng)建的初始域。它是特權域,并驅動平臺上的設備。Xen 將 CPU、存儲器、中斷和定時器虛擬化,為虛擬機提供一個或多個虛擬 CPU、系統(tǒng)存儲器的一部分、一個虛擬中斷控制器和一個虛擬定時器。除非配置為其他方式,否則 Dom0 可直接訪問所有設備并驅動它們。Dom0 還運行一組名為半虛擬化 (PV) 后端的驅動,為無特權虛擬機提供對磁盤、網(wǎng)絡等設備的訪問權。Xen 提供用于發(fā)現(xiàn)和初始通信設置的所有工具。作為 DomU 的 OS 通過運行相應的 PV 前端驅動程序來獲得對一組通用虛擬設備的訪問權。根據(jù) DomU 的數(shù)量,單個后端可服務多個前端。有一對適用于所有最常見設備類型(磁盤、網(wǎng)絡、控制臺、幀緩沖器、鼠標、鍵盤等)的 PV 驅動程序。PV 驅動程序通常位于 OS 內核(即 Linux)中。幾個 PV 后端也可以在用戶空間中運行,通常在 QEMU 中。前端在存儲器的共享頁上使用簡單的環(huán)協(xié)議連接后端。從 Dom0 與管理程序交互要求程序使用定義的管理程序調用(類似于系統(tǒng)調用)。Xen 提供一個名為 Xen Tools (也可寫成 xen-tools)的、帶有庫的參考工具箱。xen-tools 包含一個名為 xl 的程序,該程序可與其他程序一起檢查狀態(tài)和創(chuàng)建客戶機。
利用設備半虛擬化,可在管理程序與客戶機之間就如何進行通信達成協(xié)議。常見的通信協(xié)議為 Xen Bus 和 VirtIO。
xl 中的“create”命令要用到描述客戶機的配置文件,如果配置文件規(guī)定客戶機需要一個由 VNC 會話支持的虛擬幀緩沖器 (VFB),那么 xl 會在 Dom0 用戶空間中自動啟動虛擬化代碼(本演示中,為每個客戶機啟動一個)。
評論