通過(guò)這篇有趣的教程,熟悉運(yùn)行在賽靈思 Zynq UltraScale+ MPSoC 上的Xen管理程序。
賽靈思和 DornerWorks 的系統(tǒng)軟件團(tuán)隊(duì)在賽靈思的 Zynq Ultrascale+ MPSoC 上啟動(dòng) Xen Project 管理程序時(shí),我們發(fā)現(xiàn)可通過(guò)運(yùn)行當(dāng)年叱詫一時(shí)的流行電子游戲 Doom 來(lái)演示和測(cè)試系統(tǒng)。
如何針對(duì) Zynq UltraScale+ MPSoC 通過(guò) QEMU 在 Xen 上運(yùn)行 Doom 呢,在詳細(xì)介紹具體步驟之前,我們先來(lái)了解什么是管理程序,以及它們?nèi)绾闻c Zynq UltraScale+ MPSoC 上的處理器協(xié)同工作。
管理程序及其工作原理
管理程序是一種可虛擬化處理器的計(jì)算機(jī)程序。運(yùn)行在虛擬化處理器上的應(yīng)用程序和操作系統(tǒng)似乎完全擁有系統(tǒng),但事實(shí)上管理程序負(fù)責(zé)管理虛擬處理器對(duì)物理機(jī)資源(例如存儲(chǔ)器和處理內(nèi)核)的訪(fǎng)問(wèn)。管理程序之所以流行,是因?yàn)槟軐?shí)現(xiàn)設(shè)計(jì)分區(qū)以及系統(tǒng)上運(yùn)行的獨(dú)立軟件元素之間的隔離。
為了支持虛擬化,物理處理器必須提供一個(gè)供管理程序運(yùn)行的特殊“模式”。因此,介紹處理器模式有助于理解管理程序如何完成處理器魔法。
所有處理器都有一些指令,這些指令可操作寄存器中存儲(chǔ)的值,并可讀寫(xiě)存儲(chǔ)器。處理器的模式是指令和寄存器的集合,以及利用指令訪(fǎng)問(wèn)寄存器和存儲(chǔ)器時(shí)要遵守的規(guī)則。為了便于解釋?zhuān)覀円酝ㄓ锰幚砥鳛槔齺?lái)介紹,并使用與結(jié)構(gòu)無(wú)關(guān)的術(shù)語(yǔ)。在這個(gè)實(shí)例中,處理器具有特定的寄存器、指令和模式。寄存器包括 RegisterA、RegisterB、RegisterC、UserProgramCounter、Register-Super 和 SuperProgramCounter。指令包括以下內(nèi)容。
ADD Register3 Register1 Register2將 Register1 與 Register2 相加,并把結(jié)果存入 Register3,即 Register3 = Register1 + Register2。
MOVTO Register2 Register1將 Register1 中地址所指向的存儲(chǔ)器內(nèi)容移動(dòng)到 Register2。
MOVFROM Register2 Register1將 Register1 的內(nèi)容移動(dòng)到 Register2 中地址所指向的存儲(chǔ)器。
ENTERSUPER進(jìn)入處理器的 SUPER 模式。
EXITSUPER退出 SUPER 模式并進(jìn)入 USER 模式。
在 USER 模式下,處理器的指令的功能受到限制。本例中,指令可對(duì)除 RegisterSuper 和 SuperProgramCounter 以外的所有寄存器進(jìn)行讀和寫(xiě)操作,處理器可執(zhí)行除 EXITSUPER 以外的所有指令。
此外,在 USER 模式下,所有指令只能讀和寫(xiě)一部分存儲(chǔ)器,例如從地址 0x0000_0100 到 0x0FFF_FFFF。在 USER 模式下,如果程序嘗試執(zhí)行不應(yīng)該執(zhí)行的指令,或者訪(fǎng)問(wèn)無(wú)權(quán)訪(fǎng)問(wèn)的寄存器或存儲(chǔ)器位置,那么處理器將暫停出錯(cuò)指令 (offending instruction)。
SUPER 模式下,處理器的指令可以讀/寫(xiě)上述所有寄存器,包括 RegisterSuper 和 SuperProgramCounter。以上所列的所有指令,包括 EXITSUPER,都可以執(zhí)行,另外,附加的指令 ENTERHYPER 也可執(zhí)行(后面詳細(xì)介紹該指令)。此外,在 SUPER 模式下,指令可以訪(fǎng)問(wèn)系統(tǒng)中的全部存儲(chǔ)器(從 0x0000_0000 到 0x7FFF_ FFFF)。
采用帶模式的處理器,使我們可以利用設(shè)計(jì)分區(qū)來(lái)更簡(jiǎn)單地解決軟件工程設(shè)計(jì)問(wèn)題。以上實(shí)例中,只有一種方法進(jìn)入 SUPER 模式:執(zhí)行 ENTERSUPER 指令。同樣,只有一種方法退出 SUPER 模式:執(zhí)行 EXITSUPER。此外,在 USER 模式下程序只能訪(fǎng)問(wèn)機(jī)器的部分存儲(chǔ)器。有了這種方案,我們可編寫(xiě)一個(gè)程序讓處理器同時(shí)運(yùn)行多個(gè) USER 模式程序。這個(gè)“操作系統(tǒng)”(OS) 程序運(yùn)行在 SUPER 模式,并管理在 USER 模式中運(yùn)行的程序。
當(dāng) OS 運(yùn)行時(shí),會(huì)查看需要運(yùn)行的所有 USER 模式程序,選擇一個(gè)運(yùn)行,然后使用 EXITSUPER 這樣的指令通知處理器切換到 USER 模式以運(yùn)行程序。所選的程序會(huì)一直運(yùn)行,直到有事件導(dǎo)致處理器切回 SUPER 模式。這類(lèi)事件可以是來(lái)自 USER 模式程序的 ENTERSUPER 指令,或外部事件,例如定時(shí)器,它可以不提醒正在 USER 模式下運(yùn)行的程序?qū)⑻幚砥髑袚Q到 SUPER 模式。無(wú)論切換如何發(fā)生,每當(dāng)事件發(fā)生時(shí),我們都可構(gòu)建 OS 以根據(jù)相應(yīng)策略相繼選擇和運(yùn)行程序。當(dāng)切換快速進(jìn)行時(shí),用戶(hù)認(rèn)為 USER 程序同時(shí)運(yùn)行。
USERHYPER 模式的用處是讓很多 SUPER 程序運(yùn)行。SUPER 模式下的每個(gè)程序都可以是 OS;這些 OS 本身會(huì)讓很多 USER 程序并行運(yùn)行。
SUPER 處理器模式還能防止 USER 程序干擾運(yùn)行在 SUPER 模式的程序或其他 USER 模式程序。USER 模式程序的任何錯(cuò)誤或違規(guī)都可被控制在該程序自身的實(shí)例中,不會(huì)破壞或干擾為 SUPER 模式操作保留的系統(tǒng)存儲(chǔ)器和寄存器。
聽(tīng)起來(lái)很好,但能否用另一個(gè)模式實(shí)現(xiàn)一些功能?
對(duì)我們的機(jī)器稍加擴(kuò)展,就可以引入 HYPER 模式。HYPER 模式可以讀/寫(xiě)所有初始寄存器(RegisterA、RegisterB、RegisterC、UserProgramCounter、RegisterSuper 和 SuperProgramCounter)以及兩個(gè)附加寄存器:RegisterHyper 和 HyperProgramCounter。HYPER 模式下的指令包括初始集以及下面的斜體字。
ADD Register3 Register1 Register2 將 Register1 與 Register2 相加并把結(jié)果放在 Register3 中,即 Register3 = Register1 + Register2。
MOVTO Register2 Register1將 Register1 中地址所指向的存儲(chǔ)器內(nèi)容移到 Register2。
MOVFROM Register2 Register1將 Register1 的內(nèi)容移到 Register2 中地址所指向的存儲(chǔ)器。
MOVTOPHYS Register2 Register1將 Register1 中物理地址指向的存儲(chǔ)器內(nèi)容移到 Register2。
MOVFROMPHYS Register2 Register1將 Register1 的內(nèi)容移到 Register2 中地址指向的物理存儲(chǔ)器。
ENTERSUPER進(jìn)入處理器的 SUPER 模式。
EXITSUPER退出 SUPER 模式并進(jìn)入 USER 模式。
ENTERHYPER進(jìn)入處理器的 HYPER 模式。
EXITHYPER退出處理器的 HYPER 模式。
SWITCHSUPER RegisterHyper 切換到 SUPER 程序,該程序?qū)⑹褂?RegisterHyper 中的值來(lái)執(zhí)行下一個(gè) SUPER 程序。
HYPER 模式中的附加指令和寄存器允許處理器切換哪個(gè)程序在 SUPER 模式中運(yùn)行,就像 SUPER 模式允許處理器切換哪個(gè)程序在 USER 模式中運(yùn)行一樣。HYPER 模式的一個(gè)特性是能夠切換哪個(gè)存儲(chǔ)器 SUPER 模式能看到;當(dāng)一個(gè)在 HYPER 模式中運(yùn)行的程序執(zhí)行 SWITCHSUPER RegisterHyper 時(shí),底層存儲(chǔ)器完全斷開(kāi)。這就是說(shuō)當(dāng) HYPER 模式中的程序執(zhí)行了 EXITHYPER 之后,下個(gè) SUPER 程序運(yùn)行之時(shí),SUPER 模式看到的實(shí)際物理存儲(chǔ)器與運(yùn)行在 SUPER 模式中的另一個(gè)程序使用的物理存儲(chǔ)器不同。SUPER 模式程序仍使用相同地址訪(fǎng)問(wèn)存儲(chǔ)器,但是該地址指向不同的物理位置。圖 1 顯示了執(zhí)行 SWITCHSUPER RegisterHyper 前后的處理器存儲(chǔ)器視圖。
HYPER 模式很有用,是因?yàn)樗试S很多個(gè) SUPER 程序運(yùn)行。SUPER 模式中每個(gè)程序都可以是 OS;這些 OS 本身可以讓很多 USER 程序并列運(yùn)行.這意味著,我們可以在相同硬件上運(yùn)行多個(gè) OS,例如 Windows 和 Linux;在一個(gè)處理器上運(yùn)行 20 個(gè) Linux 實(shí)例;或者之間的任意組合。由于每個(gè)虛擬 OS 實(shí)例無(wú)法看到另一個(gè) OS 實(shí)例,因此如果一個(gè)崩潰,不會(huì)使另一個(gè)實(shí)例也崩潰。HYPER 模式的特性還有其他應(yīng)用:我們可以在多個(gè) OS 之間對(duì)系統(tǒng)資源分區(qū);監(jiān)測(cè) HYPER 模式下每個(gè) OS 的執(zhí)行,以在崩潰時(shí)重啟;以及在虛擬 OS 運(yùn)行時(shí)密切關(guān)注系統(tǒng)狀態(tài)。
圖 1:HYPER 模式下執(zhí)行 SWITCHSUPER RegisterHyper 的前后區(qū)別
隨著處理器從 USER 切換到 SUPER 模式,再?gòu)?SUPER 切換到 HYPER 模式,機(jī)器會(huì)賦予執(zhí)行代碼更多特權(quán)。本例中,USER 模式程序只有權(quán)使用四個(gè)寄存器(RegisterA、RegisterB、RegisterC 和 UserProgramCounter)和四個(gè)指令:(ADD、MOVTO、MOVFROM和ENTER-SUPER)。此外,USER 程序只能讀寫(xiě) 0x0000_0100 至 0x0FFF_ FFFF 的存儲(chǔ)器。一旦進(jìn)入 SUPER 模式,處理器允許指令與 RegisterSuper 和 SuperProgramCounter 對(duì)話(huà),并允許執(zhí)行 EXITSUPER 和 ENTERHYPER。此外,SUPER 程序可以訪(fǎng)問(wèn)從 0x0000_0000 至 0x7FFF_FFFF 的存儲(chǔ)器。
最后,一旦處理器進(jìn)入 HYPER 模式,其指令就可以操作 RegisterHyper 和 HyperProgramCounter,而且程序可執(zhí)行 SWITCH-SUPER 和 EXITHYPER。
圖 2:各種模式如環(huán)形所示
HYPER 模式還允許處理器讀寫(xiě)所有虛擬存儲(chǔ)器,0x0000_0000 至 0xFFFF_FFFF,以及讀寫(xiě)實(shí)際物理存儲(chǔ)器。這些特權(quán)等級(jí)通常被直觀地用環(huán)形來(lái)描述(圖 2)。主環(huán),即 HYPER 環(huán)為特權(quán)等級(jí)較低的環(huán)賦予權(quán)限,最終可控制整個(gè)系統(tǒng)。
理論結(jié)合實(shí)踐
ARM 創(chuàng)建處理器設(shè)計(jì),供 ARM 合作伙伴構(gòu)建芯片用。ARM 處理器包含一個(gè)或多個(gè)內(nèi)核。每個(gè)內(nèi)核實(shí)現(xiàn)一個(gè) ARM 架構(gòu)。例如,Zynq UltraScale+ MPSoC 包含一個(gè) ARM Cortex-A53 處理器及四個(gè) ARMv8-A 物理內(nèi)核(圖 3)。
當(dāng)查看 ARM 處理器的文檔和代碼時(shí),這種區(qū)別很重要;為了全面理解具有一個(gè) ARM 內(nèi)核的“芯片”,可參考有關(guān)架構(gòu)(如 ARMv8-A) 和處理器 (如 Cortex-A53) 的文檔。ARMv8 架構(gòu)中有四個(gè)例外等級(jí) (來(lái)源:ARM 架構(gòu)參考手冊(cè),D1-1404):
例外等級(jí) 0 (EL0),無(wú)需特權(quán)即可執(zhí)行;
例外等級(jí) 1 (EL1),執(zhí)行 OS 以及任何執(zhí)行特權(quán)指令的內(nèi)容;
例外等級(jí) 2 (EL2),允許硬件被虛擬化;以及
例外等級(jí) 3 (EL3),允許在安全與非安全處理器狀態(tài)之間切換。
以下程序通常在這些模式下運(yùn)行,如ARM 架構(gòu)參考手冊(cè) (D1–1404)中所述:EL0,應(yīng)用程序;EL1,OS 內(nèi)核以及通常所描述的相關(guān)特權(quán)函數(shù);EL2,管理程序;EL3,安全監(jiān)控器。我們的理論實(shí)例直接對(duì)應(yīng) ARMv8 執(zhí)行模式 EL0 至 EL2:USER 對(duì)應(yīng) EL0,SUPER 對(duì)應(yīng) EL1,HYPER 對(duì)應(yīng) EL2。ARM 添加第四個(gè)特權(quán)等級(jí),即 EL3;利用這個(gè)特權(quán)等級(jí),我們可在安全與非安全環(huán)境之間切換 EL0 和 EL1。盡管 EL3 的使用是一個(gè)很重要的論題,能夠?yàn)榧軜?gòu)增加大量的功能,但是在本實(shí)例中我們將其忽略,并著重介紹 EL0-EL2(利用管理程序的虛擬化)。如果對(duì)計(jì)算機(jī)如何保護(hù)金融交易感興趣,可以參閱 ARMv8 EL3 文檔(免費(fèi)提供,需注冊(cè))。這是非常好的參考文檔,從中可以獲得極為詳細(xì)的介紹。
圖 3:Zynq UltraScale+ MPSoC 架構(gòu)
進(jìn)入和退出例外模式
在真實(shí)系統(tǒng)中,模式之間的切換比我們的實(shí)例更復(fù)雜一些。ARM 總結(jié)了 ARMv8-A 架構(gòu)的行為并在參考手冊(cè)中給出。手冊(cè)中介紹,只有在接到例外或從例外返回時(shí),才能改變執(zhí)行所處的例外等級(jí)。在接到例外時(shí),例外等級(jí)只能升高或保持不變;在從例外返回時(shí),例外等級(jí)只能降低或保持不變。只有三個(gè)指令能生成針對(duì)下個(gè)例外等級(jí)的例外:SVC (Supervisor Call),生成針對(duì) EL1 的例外;HVC (Hypervisor Call),生成針對(duì) EL2 的例外;SMC (Secure Monitor Call),生成針對(duì) EL3 的例外。這些指令取值范圍為 0-65,555,允許每個(gè)例外等級(jí)有 216 個(gè)系統(tǒng)調(diào)用。這些指令針對(duì)下個(gè)例外等級(jí),而且是唯一可供運(yùn)行在較低例外等級(jí)的程序從運(yùn)行在較高例外等級(jí)的程序請(qǐng)求某些內(nèi)容的機(jī)制。在我們的理論實(shí)例中,SVC 是 SWITCHSUPER,HVC 是 SWITCHHYPER。
PetaLinux 工具包含一組命令,以供用戶(hù)在賽靈思 FPGA 和 SoC 上輕松創(chuàng)建和擴(kuò)展 Linux 系統(tǒng)。
在前一個(gè)部分,我們介紹了能夠讓運(yùn)行在 USER 模式(EL0)的程序進(jìn)入 SUPER 模式 (EL1) 的事件。大多數(shù)運(yùn)行在 USER 模式的程序生成的事件是請(qǐng)求存儲(chǔ)器。當(dāng)運(yùn)行在 EL0 中的用戶(hù)空間程序從運(yùn)行在 EL1 中的 OS 請(qǐng)求存儲(chǔ)器時(shí),這個(gè)用戶(hù)空間程序的 C 代碼可能調(diào)用函數(shù) malloc(),再由該函數(shù)調(diào)用 mmap() 或 sbrk(),以從 OS 請(qǐng)求一個(gè)指向可用存儲(chǔ)器的指針。在 ARMv8-A 架構(gòu)中的 Linux 上,這個(gè)過(guò)程在幕后轉(zhuǎn)化為 SVC 系統(tǒng)調(diào)用。該系統(tǒng)調(diào)用會(huì)把處理器轉(zhuǎn)換為 EL1,從而將控制權(quán)送回 OS,后者會(huì)解讀調(diào)用內(nèi)容并提供正確的響應(yīng)——本例中是指向所請(qǐng)求存儲(chǔ)器區(qū)域的指針,或者是一個(gè)錯(cuò)誤,用以指出沒(méi)有可用存儲(chǔ)器。
演示創(chuàng)建和工具
現(xiàn)在我們來(lái)介紹我們團(tuán)隊(duì)在 Zynq UltraScale+ QEMU Model 上運(yùn)行 Doom 時(shí)所采用的步驟。這些步驟展示了如何獲得和構(gòu)建運(yùn)行演示所需的每個(gè)組件,如何運(yùn)行以及以什么順序運(yùn)行每個(gè)組件,以及如何與演示交互。成功完成該演示之后,你會(huì)獲得一個(gè)環(huán)境,用來(lái)在上面進(jìn)行實(shí)驗(yàn),以了解 Xen 管理程序在仿真的 Zynq UltraScale+ MPSoC 上的運(yùn)行情況。還需要將此遷移植 Zynq UltraScale+ MPSoC 芯片,這可作為練習(xí)由用戶(hù)來(lái)完成。
想玩 DOOM 嗎?
為了讓過(guò)程更簡(jiǎn)單,賽靈思提供基礎(chǔ)的根文件系統(tǒng),這樣用戶(hù)就無(wú)需花時(shí)間和精力自己構(gòu)建。
該演示首先通過(guò)更新由賽靈思提供的預(yù)編譯根文件系統(tǒng) (rootFS),可包含所需的組件。然后,利用賽靈思的 PetaLinux 工具運(yùn)行演示。rootFS 包含運(yùn)行于 Linux 系統(tǒng)上的大部分程序——具體來(lái)說(shuō)就是用來(lái)啟動(dòng)系統(tǒng)的一組腳本,以及用來(lái)實(shí)現(xiàn)系統(tǒng)的應(yīng)用程序與函數(shù)庫(kù)集。我們用來(lái)擴(kuò)展演示中的基礎(chǔ) rootFS所使用的兩個(gè)工具分別是 Buildroot 和 PetaLinux。我們使用 Buildroot 為賽靈思提供的基礎(chǔ) rootFS 構(gòu)建 Doom 二進(jìn)制文件,同時(shí)使用 PetaLinux 創(chuàng)建 rootFS 的剩余部分并引導(dǎo)演示。
Buildroot
Buildroot 是一個(gè)簡(jiǎn)單的構(gòu)建系統(tǒng),用于為 Linux 系統(tǒng)創(chuàng)建 rootFS。它使用 make menuconfig 接口,這是一個(gè)用來(lái)配置 Linux 內(nèi)核本身的常用方法。Buildroot 包含對(duì) PrBoom 的默認(rèn)支持,這對(duì)于本演示很有幫助。(PrBoom 是我們所使用的 Doom 游戲的 GNU 通用公共許可證 [GPL] 版本。這里我們會(huì)穿插使用 PrBoom 和 Doom 這兩個(gè)術(shù)語(yǔ)。 )Buildroot 對(duì) Xen 構(gòu)建不提供本地支持(盡管它可創(chuàng)建用于構(gòu)建 Xen 所需的所有庫(kù)和工具鏈),因此賽靈思提供 Xen、Xen 工具和為用戶(hù)預(yù)編譯的 Xen 庫(kù)以及其他一些所需的庫(kù),以讓過(guò)程簡(jiǎn)單直觀。
PetaLinux
PetaLinux 工具包含一個(gè)命令集,以便讓用戶(hù)在賽靈思 FPGA 和 SoC 上輕松創(chuàng)建和擴(kuò)展 Linux 系統(tǒng)。該演示使用 petalinux-build 和 petalinux-boot 命令。petalinux-build 命令用于創(chuàng)建全部所需的組件。petalinux-boot 命令(外加幾個(gè)變量)用于啟動(dòng)在 QEMU 仿真器上運(yùn)行的所有組件。介紹 PetaLinux 工具中的所有命令超出了本文的范圍,但是通過(guò)此演示系統(tǒng)應(yīng)該很容易發(fā)掘這兩個(gè)命令和其他命令的功能。參考PetaLinux 工具文檔 — 參考指南 UG1144 (v2015.4) 了解更多信息。
項(xiàng)目先決條件
該項(xiàng)目需要一個(gè)運(yùn)行 Linux 的工作站或虛擬機(jī),具有滿(mǎn)足 UG1144 (v2015.4) 中所列的 PetaLinux 工具安裝要求的環(huán)境,而且環(huán)境中需要安裝賽靈思 PetaLinux Tools v2015.4 版本。
一旦 Doom 啟動(dòng),你就可以使用鍵盤(pán)和鼠標(biāo)控制游戲。應(yīng)記住,可能需要點(diǎn)擊 ESC 鍵來(lái)開(kāi)始游戲。開(kāi)始游戲咯!
步驟 1:構(gòu)建 ROOTFS
首先,我們需要構(gòu)建 rootFS。從賽靈思下載 doom_demo.tar.gz,打開(kāi)下載目錄中的一個(gè) terminal;你可在以下網(wǎng)址中找到全部所需文件: www.wiki.xilinx.com/Doom+on+Xen+Demo。我們將該目錄稱(chēng)為 。
解壓文檔。
$ cd
$ tar -xzf doom_demo.tar.gz && cd doom_demo
我們會(huì)看到一個(gè)文件夾,我們將把它存到根文件系統(tǒng)(一個(gè)用于 Dom0,另一個(gè)用于 DomU)。現(xiàn)在,我們需要構(gòu)建 PrBoom,并復(fù)制到 rootFS。
首先,需要下載 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)自動(dòng)選擇全部所需的庫(kù)。
$ make #(這需要幾分鐘時(shí)間,取決于機(jī)器。)
現(xiàn)在,我們將所有 PrBoom 相關(guān)文件復(fù)制到 targetfs 目錄,確保我們?cè)?buildroot 目錄下的 ./output/target/ 目錄。
$ for i in $(find ./-name ‘*oom*’); do cp ${i}
/doom_demo/targetfs/${i}; done
現(xiàn)在,我們完成了 Buildroot 操作。我們移到上一個(gè)目錄 doom_demo 目錄。
$ make # Build the host and guest rootFS.(這需要幾分鐘時(shí)間,取決于你的機(jī)器。)
注意:可能還存在額外配置選項(xiàng),這主要取決于使用的內(nèi)核版本。這些額外配置選項(xiàng)未被我們提供的配置預(yù)先選擇。使用默認(rèn)選項(xiàng)即可(需點(diǎn)擊回車(chē)鍵)。
步驟 2:構(gòu)建基礎(chǔ)設(shè)置
接下來(lái),我們?yōu)槠脚_(tái)構(gòu)建嵌入式系統(tǒng)軟件的剩余部分,包括引導(dǎo)裝載程序、ARM Trusted Firmware (ATF)、Linux 內(nèi)核和設(shè)備樹(shù)。賽靈思的 PetaLinux 工具讓這個(gè)過(guò)程簡(jiǎn)單直觀。我們創(chuàng)建一個(gè)針對(duì)賽靈思 ZCU102 開(kāi)發(fā)板的 PetaLinux 項(xiàng)目。參考 2015.4 UG1144 和 AR#66249 中 QEMU 和 MPSoC PetaLinux 的快速入門(mén)材料。訪(fǎng)問(wèn)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)在,我們需要為本用例手動(dòng)編輯設(shè)備樹(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)在,手動(dòng)構(gòu)建 Xen 設(shè)備樹(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 cp5900-192.168.129.50:5900"
> setenv serverip 192.168.129.1
> tftpb 4000000 xen.dtb; tftpb 0x80000 Image; tftpb6000000 xen.ub; bootm 6000000 - 4000000
# /boot.sh
# /xen-doom.sh 1
步驟 3:開(kāi)始演示
現(xiàn)在,我們可以打開(kāi)虛擬網(wǎng)絡(luò)計(jì)算 (VNC) 查看器,并在運(yùn)行 QEMU 的機(jī)器上連接 localhost:5900 以觀看 Doom 游戲。(注意:以上命令行只能重定向 5900 端口,因此當(dāng)開(kāi)始演示時(shí)只能連接到第一個(gè) Doom 實(shí)例。如果想連接多個(gè)實(shí)例,需要為 QEMU 添加更多 hostfwd 變量,并連接到下個(gè)可用的端口[5901 用于下個(gè)實(shí)例,5902 用于第三個(gè)實(shí)例,以此類(lèi)推],然后將這些實(shí)例連接。)
一旦 Doom 啟動(dòng),你就可以使用鍵盤(pán)和鼠標(biāo)控制游戲。應(yīng)記住,可能需要點(diǎn)擊 ESC 鍵來(lái)開(kāi)始游戲。還應(yīng)記住,你已經(jīng)很長(zhǎng)時(shí)間沒(méi)玩 Doom 游戲了,因此你可能走不了多遠(yuǎn)。別氣餒。使用自己構(gòu)建的系統(tǒng)絕對(duì)“可行”。
XEN 深入探討
正如“Zynq MPSoC 獲得 Xen 管理程序支持”(賽靈思中國(guó)通訊,第 93 期)中所介紹, Type 1 管理程序在本機(jī)硬件上運(yùn)行,Type 2 管理程序不是軟件的最底層,而是托管在 OS 上。Xen 屬于 Type 1 管理程序(圖 4)。
圖 4:作為 Type 1 管理程序,Xen 在本機(jī)硬件上運(yùn)行,虛擬機(jī)在 Xen 之上運(yùn)行 (來(lái)源:“帶虛擬化擴(kuò)展的 Xen ARM” 白皮書(shū))。
以前,我們提到了虛擬處理器(也稱(chēng)虛擬機(jī))。在 Xen 中,這些被稱(chēng)為域。特權(quán)最高的域被稱(chēng)為 Dom0;無(wú)特權(quán)的客戶(hù)域是 DomU 域。
Dom0 是 Xen 管理程序在引導(dǎo)時(shí)創(chuàng)建的初始域。它是特權(quán)域,并驅(qū)動(dòng)平臺(tái)上的設(shè)備。Xen 將 CPU、存儲(chǔ)器、中斷和定時(shí)器虛擬化,為虛擬機(jī)提供一個(gè)或多個(gè)虛擬 CPU、系統(tǒng)存儲(chǔ)器的一部分、一個(gè)虛擬中斷控制器和一個(gè)虛擬定時(shí)器。除非配置為其他方式,否則 Dom0 可直接訪(fǎng)問(wèn)所有設(shè)備并驅(qū)動(dòng)它們。Dom0還運(yùn)行一組名為半虛擬化 (PV) 后端的驅(qū)動(dòng),為無(wú)特權(quán)虛擬機(jī)提供對(duì)磁盤(pán)、網(wǎng)絡(luò)等設(shè)備的訪(fǎng)問(wèn)權(quán)。Xen 提供用于發(fā)現(xiàn)和初始通信設(shè)置的所有工具。作為 DomU 的 OS 通過(guò)運(yùn)行相應(yīng)的 PV 前端驅(qū)動(dòng)程序來(lái)獲得對(duì)一組通用虛擬設(shè)備的訪(fǎng)問(wèn)權(quán)。根據(jù) DomU 的數(shù)量,單個(gè)后端可服務(wù)多個(gè)前端。有一對(duì)適用于所有最常見(jiàn)設(shè)備類(lèi)型(磁盤(pán)、網(wǎng)絡(luò)、控制臺(tái)、幀緩沖器、鼠標(biāo)、鍵盤(pán)等)的 PV 驅(qū)動(dòng)程序。PV 驅(qū)動(dòng)程序通常位于 OS 內(nèi)核(即 Linux)中。幾個(gè) PV 后端也可以在用戶(hù)空間中運(yùn)行,通常在 QEMU 中。前端在存儲(chǔ)器的共享頁(yè)上使用簡(jiǎn)單的環(huán)協(xié)議連接后端。從 Dom0 與管理程序交互要求程序使用定義的管理程序調(diào)用(類(lèi)似于系統(tǒng)調(diào)用)。Xen 提供一個(gè)名為 Xen Tools (也可寫(xiě)成 xen-tools)的、帶有庫(kù)的參考工具箱。xen-tools 包含一個(gè)名為 xl 的程序,該程序可與其他程序一起檢查狀態(tài)和創(chuàng)建客戶(hù)機(jī)。
利用設(shè)備半虛擬化,可在管理程序與客戶(hù)機(jī)之間就如何進(jìn)行通信達(dá)成協(xié)議。常見(jiàn)的通信協(xié)議為 Xen Bus 和 VirtIO。
xl 中的“create”命令要用到描述客戶(hù)機(jī)的配置文件,如果配置文件規(guī)定客戶(hù)機(jī)需要一個(gè)由 VNC 會(huì)話(huà)支持的虛擬幀緩沖器 (VFB),那么 xl 會(huì)在 Dom0 用戶(hù)空間中自動(dòng)啟動(dòng)虛擬化代碼(本演示中,為每個(gè)客戶(hù)機(jī)啟動(dòng)一個(gè))。
doom VM 的配置文件如下所示:
# 客戶(hù)機(jī)名稱(chēng)
name = "guest1"
# 要引導(dǎo)的內(nèi)核鏡像
kernel = "/boot/Image"
# 內(nèi)核命令行選項(xiàng)
extra = "console=hvc0 rdinit=/doom.sh"
# 最初存儲(chǔ)器分配 (MB)
memory = 56
# VCPUS 數(shù)量
vcpus = 1
vfb = ['type=vnc, vnclisten=0.0.0.0']
XEN 中的設(shè)備
為客戶(hù)機(jī)提供設(shè)備有三種常用方法:仿真、半虛擬化和直通 (圖 5)。對(duì)于設(shè)備仿真,當(dāng)客戶(hù)機(jī)向仿真設(shè)備的存儲(chǔ)器寫(xiě)入時(shí),寫(xiě)入操作會(huì)觸發(fā)陷阱。陷阱通常就是頁(yè)面錯(cuò)誤。陷阱使處理器能夠切換到管理程序,以仿真設(shè)備。仿真是靈活的,但速度慢,因?yàn)橐幚硭邢葳澹乙腥藶樗行枰抡娴脑O(shè)備編寫(xiě)模型。而且,很難找到方法來(lái)加速仿真,因?yàn)閹缀鯖](méi)有硬件加速;完全是軟件方法。
圖 5:方案、半虛擬化和直通方案的對(duì)比
利用設(shè)備半虛擬化,可在管理程序與客戶(hù)機(jī)之間就如何進(jìn)行通信達(dá)成協(xié)議。通常有一個(gè)共享的存儲(chǔ)器區(qū)域(以及協(xié)議),這看起來(lái)像一個(gè)設(shè)備,而且管理程序在該區(qū)域處理請(qǐng)求。例如,為了在 Linux 上支持半虛擬化幀緩沖器,Linux 前端驅(qū)動(dòng)會(huì)把從用戶(hù)空間獲得的幀緩沖器寫(xiě)入共享存儲(chǔ)器區(qū)域;然后使用管理程序調(diào)用向管理程序發(fā)信號(hào),以通過(guò)后端驅(qū)動(dòng)來(lái)輸出幀??蛻?hù)機(jī)只能通過(guò)半虛擬化驅(qū)動(dòng)程序與主機(jī) (Dom0)和其他客戶(hù)機(jī) (DomU) 對(duì)話(huà)。這種方案的優(yōu)勢(shì)是:用戶(hù)可以在很多客戶(hù)機(jī)之間共享設(shè)備;運(yùn)行快速;客戶(hù)機(jī)可以運(yùn)行大部分都沒(méi)修改的內(nèi)核。要求的變動(dòng)在標(biāo)準(zhǔn)接口下面,因此對(duì)于應(yīng)用程序以及內(nèi)核其余部分來(lái)說(shuō),前端驅(qū)動(dòng)程序看起來(lái)就像正常的網(wǎng)絡(luò)接口、磁盤(pán)或其他設(shè)備。支持客戶(hù)機(jī)通信的兩個(gè)常用協(xié)議是 Xen Bus 和 VirtIO。
在直通模式下,主機(jī)將設(shè)備“交給”一個(gè)客戶(hù)機(jī)。這意味著每次只有一個(gè)客戶(hù)機(jī)可以使用該設(shè)備。
設(shè)備性能與安全
一般來(lái)說(shuō),與通過(guò)直通方式提供的設(shè)備相比,仿真的設(shè)備性能比較低;半虛擬化方案則趨向于具備足夠性能。半虛擬化方案和仿真方案的優(yōu)勢(shì)在于管理程序可以讓設(shè)備訪(fǎng)問(wèn)多個(gè)實(shí)體,而不會(huì)將這些實(shí)體相互暴露。
原理簡(jiǎn)介
Doom-on-Zynq UltraScale+ MPSoC 的處理上下文環(huán)境就像洋蔥一樣有很多層(圖 6)。Cortex-A53 中是四個(gè) ARMv8 內(nèi)核。在每個(gè)內(nèi)核上,管理程序運(yùn)行在EL2 中,客戶(hù)機(jī)(Dom0 或 DomU)運(yùn)行在 EL0/EL1 中。每個(gè) DomU 客戶(hù)機(jī)都運(yùn)行 Linux;Doom (PrBoom) 運(yùn)行在用戶(hù)空間中。Doom 使用簡(jiǎn)單直接媒體層 (SDL),通過(guò) SVC 指令(最終)與幀緩沖器前端驅(qū)動(dòng)對(duì)話(huà)。幀緩沖器前端將緩沖器寫(xiě)入 Dom0 建立的共享存儲(chǔ)器區(qū)域。前端驅(qū)動(dòng)通過(guò)協(xié)議(例如 Xen Bus 或 VirtIO)使用 HVC 指令(最終)與 Dom0 上運(yùn)行的虛擬化代碼通信。在 Dom0 上運(yùn)行的虛擬化代碼提供一個(gè)用于顯示的后端,然后該后端由虛擬化代碼的 VNC 服務(wù)器進(jìn)行編碼,并通過(guò)網(wǎng)絡(luò)送到 VNC 客戶(hù)端。
圖6:X86 架構(gòu)上從 PetaLinux 工具啟動(dòng) QEMU
此信息和演示能夠?yàn)楣芾沓绦虻倪M(jìn)一步研究和實(shí)驗(yàn)提供很好的基礎(chǔ)。當(dāng)你能夠在 QEMU 上用仿真來(lái)運(yùn)行演示之后,就可使用 PetaLinux 工具在 Zynq UltraScale+ MPSoC 芯片上運(yùn)行。
-
處理器
+關(guān)注
關(guān)注
68文章
19293瀏覽量
229964 -
賽靈思
+關(guān)注
關(guān)注
32文章
1794瀏覽量
131290 -
程序
+關(guān)注
關(guān)注
117文章
3787瀏覽量
81074
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論