當(dāng)前位置:首頁 > 嵌入式 > 嵌入式動(dòng)態(tài)
[導(dǎo)讀]通過這篇有趣的教程,熟悉運(yùn)行在賽靈思 Zynq UltraScale+ MPSoC 上的 Xen 管理程序。

通過這篇有趣的教程,熟悉運(yùn)行在賽靈思 Zynq UltraScale+ MPSoC 上的 Xen 管理程序。

賽靈思和 DornerWorks 的系統(tǒng)軟件團(tuán)隊(duì)在賽靈思的 Zynq® Ultrascale+™ MPSoC 上啟動(dòng) Xen Project 管理程序時(shí),我們發(fā)現(xiàn)可通過運(yùn)行 1993 年的流行電子游戲 Doom 來演示和測(cè)試系統(tǒng)。這款射擊游戲使團(tuán)隊(duì)可以探討 Xen 工程設(shè)計(jì)話題,以求將知識(shí)和經(jīng)驗(yàn)傳授給以后的管理程序使用者。

我們團(tuán)隊(duì)使用適用于 QEMU (開源 Quick Emulator)的 Zynq UltraScale+ MPSoC 仿真模型為軟件進(jìn)行 Doom 演示做好準(zhǔn)備,當(dāng)芯片到達(dá)時(shí),只需數(shù)小時(shí)就能啟動(dòng)運(yùn)行,不再需要等上數(shù)天。

如何針對(duì) Zynq UltraScale+ MPSoC 通過 QEMU 在 Xen 上運(yùn)行 Doom 呢,在詳細(xì)介紹具體步驟之前,我們先來了解什么是管理程序,以及它們?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)核)的訪問。管理程序之所以流行,是因?yàn)槟軐?shí)現(xiàn)設(shè)計(jì)分區(qū)以及系統(tǒng)上運(yùn)行的獨(dú)立軟件元素之間的隔離。

為了支持虛擬化,物理處理器必須提供一個(gè)供管理程序運(yùn)行的特殊“模式”。因此,介紹處理器模式有助于理解管理程序如何完成處理器魔法。

所有處理器都有一些指令,這些指令可操作寄存器中存儲(chǔ)的值,并可讀寫存儲(chǔ)器。處理器的模式是指令和寄存器的集合,以及利用指令訪問寄存器和存儲(chǔ)器時(shí)要遵守的規(guī)則。為了便于解釋,我們以通用處理器為例來介紹,并使用與結(jié)構(gòu)無關(guān)的術(shù)語。在這個(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 模式。

此外,在 USER 模式下,所有指令只能讀和寫一部分存儲(chǔ)器,例如從地址 0x0000_0100 到 0x0FFF_FFFF。在 USER 模式下,如果程序嘗試執(zhí)行不應(yīng)該執(zhí)行的指令,或者訪問無權(quán)訪問的寄存器或存儲(chǔ)器位置,那么處理器將暫停出錯(cuò)指令 (offending instruction)。

SUPER 模式下,處理器的指令可以讀/寫上述所有寄存器,包括 RegisterSuper 和 SuperProgramCounter。以上所列的所有指令,包括 EXITSUPER,都可以執(zhí)行,另外,附加的指令 ENTERHYPER 也可執(zhí)行(后面詳細(xì)介紹該指令)。此外,在 SUPER 模式下,指令可以訪問系統(tǒng)中的全部存儲(chǔ)器(從 0x0000_0000 到 0x7FFF_ FFFF)。

采用帶模式的處理器,使我們可以利用設(shè)計(jì)分區(qū)來更簡(jiǎn)單地解決軟件工程設(shè)計(jì)問題。以上實(shí)例中,只有一種方法進(jìn)入 SUPER 模式:執(zhí)行 ENTERSUPER 指令。同樣,只有一種方法退出 SUPER 模式:執(zhí)行 EXITSUPER。此外,在 USER 模式下程序只能訪問機(jī)器的部分存儲(chǔ)器。有了這種方案,我們可編寫一個(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 模式。這類事件可以是來自 USER 模式程序的 ENTERSUPER 指令,或外部事件,例如定時(shí)器,它可以不提醒正在 USER 模式下運(yùn)行的程序?qū)⑻幚砥髑袚Q到 SUPER 模式。無論切換如何發(fā)生,每當(dāng)事件發(fā)生時(shí),我們都可構(gòu)建 OS 以根據(jù)相應(yīng)策略相繼選擇和運(yùn)行 USER程序。當(dāng)切換快速進(jìn)行時(shí),用戶認(rèn)為 USER 程序同時(shí)運(yùn)行。

EXITSUPER 退出 SUPER 模式并進(jìn)入 USER 模式。

在 USER 模式下,處理器的指令的功能受到限制。本例中,指令可對(duì)除 RegisterSuper 和 SuperProgramCounter 以外的所有寄存器進(jìn)行讀和寫操作,處理器可執(zhí)行除EXITSUPER 以外的所有指令。

HYPER 模式的用處是讓很多 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ǔ)器和寄存器。

聽起來很好,但能否用另一個(gè)模式實(shí)現(xiàn)一些功能?

對(duì)我們的機(jī)器稍加擴(kuò)展,就可以引入 HYPER 模式。HYPER 模式可以讀/寫所有初始寄存器(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 模式。

此外,在 USER 模式下,所有指令只能讀和寫一部分存儲(chǔ)器,例如從地址 0x0000_0100 到 0x0FFF_FFFF。在 USER 模式下,如果程序嘗試執(zhí)行不應(yīng)該執(zhí)行的指令,或者訪問無權(quán)訪問的寄存器或存儲(chǔ)器位置,那么處理器將暫停出錯(cuò)指令 (offending instruction)。

SUPER 模式下,處理器的指令可以讀/寫上述所有寄存器,包括 RegisterSuper 和 SuperProgramCounter。以上所列的所有指令,包括 EXITSUPER,都可以執(zhí)行,另外,附加的指令 ENTERHYPER 也可執(zhí)行(后面詳細(xì)介紹該指令)。此外,在 SUPER 模式下,指令可以訪問系統(tǒng)中的全部存儲(chǔ)器(從 0x0000_0000 到 0x7FFF_ FFFF)。

采用帶模式的處理器,使我們可以利用設(shè)計(jì)分區(qū)來更簡(jiǎn)單地解決軟件工程設(shè)計(jì)問題。以上實(shí)例中,只有一種方法進(jìn)入 SUPER 模式:執(zhí)行 ENTERSUPER 指令。同樣,只有一種方法退出 SUPER 模式:執(zhí)行 EXITSUPER。此外,在 USER 模式下程序只能訪問機(jī)器的部分存儲(chǔ)器。有了這種方案,我們可編寫一個(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 模式。這類事件可以是來自 USER 模式程序的 ENTERSUPER 指令,或外部事件,例如定時(shí)器,它可以不提醒正在 USER 模式下運(yùn)行的程序?qū)⑻幚砥髑袚Q到 SUPER 模式。無論切換如何發(fā)生,每當(dāng)事件發(fā)生時(shí),我們都可構(gòu)建 OS 以根據(jù)相應(yīng)策略相繼選擇和運(yùn)行程序。當(dāng)切換快速進(jìn)行時(shí),用戶認(rèn)為 USER 程序同時(shí)運(yùn)行。

EXITHYPER 退出處理器的 HYPER 模式。

SWITCHSUPER RegisterHyper 切換到 SUPER 程序,該程序?qū)⑹褂?RegisterHyper 中的值來執(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ǔ)器完全斷開。這就是說當(dāng) HYPER 模式中的程序執(zhí)行了 EXITHYPER 之后,下個(gè) SUPER 程序運(yùn)行之時(shí),SUPER 模式看到的實(shí)際物理存儲(chǔ)器與運(yùn)行在 SUPER 模式中的另一個(gè)程序使用的物理存儲(chǔ)器不同。SUPER 模式程序仍使用相同地址訪問存儲(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í)例無法看到另一個(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)。

隨著處理器從 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 程序只能讀寫 0x0000_0100 至 0x0FFF_ FFFF 的存儲(chǔ)器。一旦進(jìn)入 SUPER 模式,處理器允許指令與 RegisterSuper 和 SuperProgramCounter 對(duì)話,并允許執(zhí)行 EXITSUPER 和 ENTERHYPER。此外,SUPER 程序可以訪問從 0x0000_0000 至 0x7FFF_FFFF 的存儲(chǔ)器。

最后,一旦處理器進(jìn)入 HYPER 模式,其指令就可以操作 RegisterHyper 和 HyperProgramCounter,而且程序可執(zhí)行 SWITCH-SUPER 和 EXITHYPER。

HYPER 模式還允許處理器讀寫所有虛擬存儲(chǔ)器,0x0000_0000 至 0xFFFF_FFFF,以及讀寫實(shí)際物理存儲(chǔ)器。這些特權(quán)等級(jí)通常被直觀地用環(huán)形來描述(圖 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í)(來源:ARM 架構(gòu)參考手冊(cè),D1-1404):

1. 例外等級(jí) 0 (EL0),無需特權(quán)即可執(zhí)行;

2. 例外等級(jí) 1 (EL1),執(zhí)行 OS 以及任何執(zhí)行特權(quán)指令的內(nèi)容;

3. 例外等級(jí) 2 (EL2),允許硬件被虛擬化;以及

4. 例外等級(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(利用管理程序的虛擬化)。

進(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 工具包含一組命令,以供用戶在賽靈思 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 中的用戶空間程序從運(yùn)行在 EL1 中的 OS 請(qǐng)求存儲(chǔ)器時(shí),這個(gè)用戶空間程序的 C 代碼可能調(diào)用函數(shù) malloc(),再由該函數(shù)調(diào)用 mmap() 或 sbrk(),以從 OS 請(qǐng)求一個(gè)指向可用存儲(chǔ)器的指針。在 ARMv8-A 架構(gòu)中的 Linux 上,這個(gè)過程在幕后轉(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ò)誤,用以指出沒有可用存儲(chǔ)器。

演示創(chuàng)建和工具

現(xiàn)在我們來介紹我們團(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)境,用來在上面進(jìn)行實(shí)驗(yàn),以了解 Xen 管理程序在仿真的 Zynq UltraScale+ MPSoC 上的運(yùn)行情況。還需要將此遷移植 Zynq UltraScale+ MPSoC 芯片,這可作為練習(xí)由用戶來完成。

為了讓過程更簡(jiǎn)單,賽靈思提供基礎(chǔ)的根文件系統(tǒng),這樣用戶就無需花時(shí)間和精力自己構(gòu)建。

Buildroot

Buildroot 是一個(gè)簡(jiǎn)單的構(gòu)建系統(tǒng),用于為 Linux 系統(tǒng)創(chuàng)建 rootFS。它使用 make menuconfig 接口,這是一個(gè)用來配置 Linux 內(nèi)核本身的常用方法。Buildroot 包含對(duì) PrBoom 的默認(rèn)支持,這對(duì)于本演示很有幫助。(PrBoom 是我們所使用的 Doom 游戲的 GNU 通用公共許可證 [GPL] 版本。這里我們會(huì)穿插使用 PrBoom 和 Doom 這兩個(gè)術(shù)語。 )Buildroot 對(duì) Xen 構(gòu)建不提供本地支持(盡管它可創(chuàng)建用于構(gòu)建 Xen 所需的所有庫和工具鏈),因此賽靈思提供 Xen、Xen 工具和為用戶預(yù)編譯的 Xen 庫以及其他一些所需的庫,以讓過程簡(jiǎn)單直觀。

PetaLinux

PetaLinux 工具包含一個(gè)命令集,以便讓用戶在賽靈思 FPGA 和 SoC 上輕松創(chuàng)建和擴(kuò)展 Linux 系統(tǒng)。該演示使用 petalinux-build 和 petalinux-boot 命令。petalinux-build 命令用于創(chuàng)建全部所需的組件。petalinux-boot 命令(外加幾個(gè)變量)用于啟動(dòng)在 QEMU 仿真器上運(yùn)行的所有組件。

項(xiàng)目先決條件

該項(xiàng)目需要一個(gè)運(yùn)行 Linux 的工作站或虛擬機(jī),具有滿足 UG1144 (v2015.4) 中所列的 PetaLinux 工具安裝要求的環(huán)境,而且環(huán)境中需要安裝賽靈思 PetaLinux Tools v2015.4 版本。

一旦 Doom 啟動(dòng),你就可以使用鍵盤和鼠標(biāo)控制游戲。應(yīng)記住,可能需要點(diǎn)擊 ESC 鍵來開始游戲。

步驟 1:構(gòu)建 ROOTFS

首先,我們需要構(gòu)建 rootFS。從賽靈思下載 doom_demo.tar.gz,打開下載目錄中的一個(gè) terminal;你可在以下網(wǎng)址中找到全部所需文件: www.wiki.xilinx.com/Doom+on+Xen+Demo。我們將該目錄稱為 。

解壓文檔。

$ cd

$ tar -xzf doom_demo.tar.gz && cd doom_demo

我們會(huì)看到一個(gè)文件夾,我們將把它存到根文件系統(tǒng)(一個(gè)用于 Dom0,另一個(gè)用于 DomU)?,F(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)選擇全部所需的庫。

$ 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)擊回車鍵)。

步驟 2:構(gòu)建基礎(chǔ)設(shè)置

接下來,我們?yōu)槠脚_(tái)構(gòu)建嵌入式系統(tǒng)軟件的剩余部分,包括引導(dǎo)裝載程序、ARM Trusted Firmware (ATF)、Linux 內(nèi)核和設(shè)備樹。賽靈思的 PetaLinux 工具讓這個(gè)過程簡(jiǎn)單直觀。我們創(chuàng)建一個(gè)針對(duì)賽靈思 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)在,我們需要為本用例手動(dòng)編輯設(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è)備樹。

$ 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)槲覀?/p>

提供自己的 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)開始演示時(shí)只能連接到第一個(gè) Doom 實(shí)例。如果想連接多個(gè)實(shí)例,需要為 QEMU 添加更多 hostfwd 變量,并連接到下個(gè)可用的端口[5901 用于下個(gè)實(shí)例,5902 用于第三個(gè)實(shí)例,以此類推],然后將這些實(shí)例連接。)

一旦 Doom 啟動(dòng),你就可以使用鍵盤和鼠標(biāo)控制游戲。應(yīng)記住,可能需要點(diǎn)擊 ESC 鍵來開始游戲。還應(yīng)記住,你已經(jīng)

很長(zhǎng)時(shí)間沒玩 Doom 游戲了,因此你可能走不了多遠(yuǎn)。別氣餒。使用自己構(gòu)建的系統(tǒng)絕對(duì)“可行”。

XEN 深入探討

正如“Zynq MPSoC 獲得 Xen 管理程序支持” Type 1 管理程序在本機(jī)硬件上運(yùn)行,Type 2 管理程序不是軟件的最底層,而是托管在 OS 上。Xen 屬于 Type 1 管理程序(圖 4)。

以前,我們提到了虛擬處理器(也稱虛擬機(jī))。在 Xen 中,這些被稱為域。特權(quán)最高的域被稱為 Dom0;無特權(quán)的客戶域是 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 可直接訪問所有設(shè)備并驅(qū)動(dòng)它們。Dom0

還運(yùn)行一組名為半虛擬化 (PV) 后端的驅(qū)動(dòng),為無特權(quán)虛擬機(jī)提供對(duì)磁盤、網(wǎng)絡(luò)等設(shè)備的訪問權(quán)。Xen 提供用于發(fā)現(xiàn)和初始通信設(shè)置的所有工具。作為 DomU 的 OS 通過運(yùn)行相應(yīng)的 PV 前端驅(qū)動(dòng)程序來獲得對(duì)一組通用虛擬設(shè)備的訪問權(quán)。根據(jù) DomU 的數(shù)量,單個(gè)后端可服務(wù)多個(gè)前端。有一對(duì)適用于所有最常見設(shè)備類型(磁盤、網(wǎng)絡(luò)、控制臺(tái)、幀緩沖器、鼠標(biāo)、鍵盤等)的 PV 驅(qū)動(dòng)程序。PV 驅(qū)動(dòng)程序通常位于 OS 內(nèi)核(即 Linux)中。幾個(gè) PV 后端也可以在用戶空間中運(yùn)行,通常在 QEMU 中。前端在存儲(chǔ)器的共享頁上使用簡(jiǎn)單的環(huán)協(xié)議連接后端。從 Dom0 與管理程序交互要求程序使用定義的管理程序調(diào)用(類似于系統(tǒng)調(diào)用)。Xen 提供一個(gè)名為 Xen Tools (也可寫成 xen-tools)的、帶有庫的參考工具箱。xen-tools 包含一個(gè)名為 xl 的程序,該程序可與其他程序一起檢查狀態(tài)和創(chuàng)建客戶機(jī)。

利用設(shè)備半虛擬化,可在管理程序與客戶機(jī)之間就如何進(jìn)行通信達(dá)成協(xié)議。常見的通信協(xié)議為 Xen Bus 和 VirtIO。

xl 中的“create”命令要用到描述客戶機(jī)的配置文件,如果配置文件規(guī)定客戶機(jī)需要一個(gè)由 VNC 會(huì)話支持的虛擬幀緩沖器 (VFB),那么 xl 會(huì)在 Dom0 用戶空間中自動(dòng)啟動(dòng)虛擬化代碼(本演示中,為每個(gè)客戶機(jī)啟動(dòng)一個(gè))。

doom VM 的配置文件如下所示:

# 客戶機(jī)名稱 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è)備

為客戶機(jī)提供設(shè)備有三種常用方法:仿真、半虛擬化和直通(圖 5)。

對(duì)于設(shè)備仿真,當(dāng)客戶機(jī)向仿真設(shè)備的存儲(chǔ)器寫入時(shí),寫入操作會(huì)觸發(fā)陷阱。陷阱通常就是頁面錯(cuò)誤。陷阱使處理器能夠切換到管理程序,以仿真設(shè)備。仿真是靈活的,但速度慢,因?yàn)橐幚硭邢葳?,而且要有人為所有需要仿真的設(shè)備編寫模型。而且,很難找到方法來加速仿真,因?yàn)閹缀鯖]有硬件加速;完全是軟件方法。

利用設(shè)備半虛擬化,可在管理程序與客戶機(jī)之間就如何進(jìn)行通信達(dá)成協(xié)議。通常有一個(gè)共享的存儲(chǔ)器區(qū)域(以及協(xié)議),這看起來像一個(gè)設(shè)備,而且管理程序在該區(qū)域處理請(qǐng)求。例如,為了在 Linux 上支持半虛擬化幀緩沖器,Linux 前端驅(qū)動(dòng)會(huì)把從用戶空間獲得的幀緩沖器寫入共享存儲(chǔ)器區(qū)域;然后使用管理程序調(diào)用向管理程序發(fā)信號(hào),以通過后端驅(qū)動(dòng)來輸出幀??蛻魴C(jī)只能通過半虛擬化驅(qū)動(dòng)程序與主機(jī) (Dom0)和其他客戶機(jī) (DomU) 對(duì)話。這種方案的優(yōu)勢(shì)是:用戶可以在很多客戶機(jī)之間共享設(shè)備;運(yùn)行快速;客戶機(jī)可以運(yùn)行大部分都沒修改的內(nèi)核。要求的變動(dòng)在標(biāo)準(zhǔn)接口下面,因此對(duì)于應(yīng)用程序以及內(nèi)核其余部分來說,前端驅(qū)動(dòng)程序看起來就像正常的網(wǎng)絡(luò)接口、磁盤或其他設(shè)備。支持客戶機(jī)通信的兩個(gè)常用協(xié)議是 Xen Bus 和 VirtIO。

在直通模式下,主機(jī)將設(shè)備“交給”一個(gè)客戶機(jī)。這意味著每次只有一個(gè)客戶機(jī)可以使用該設(shè)備。

設(shè)備性能與安全

一般來說,與通過直通方式提供的設(shè)備相比,仿真的設(shè)備性能比較低;半虛擬化方案則趨向于具備足夠性能。半虛擬化方案和仿真方案的優(yōu)勢(shì)在于管理程序可以讓設(shè)備訪問多個(gè)實(shí)體,而不會(huì)將這些實(shí)體相互暴露。Doom-on-Zynq Ultra- Scale+ MPSoC 的處理上下文環(huán)境就像洋蔥一樣有很多層(圖 6)。Cortex-A53 中是四個(gè) ARMv8 內(nèi)核。在每個(gè)內(nèi)核上,管理程序運(yùn)行在EL2 中,客戶機(jī)(Dom0 或 DomU)運(yùn)行在 EL0/EL1 中。每個(gè) DomU 客戶機(jī)都運(yùn)行 Linux;Doom (PrBoom) 運(yùn)行在用戶空間中。Doom 使用簡(jiǎn)單直接媒體層 (SDL),通過 SVC 指令(最終)與幀緩沖器前端驅(qū)動(dòng)對(duì)話。幀緩沖器前端將緩沖器寫入 Dom0 建立的共享存儲(chǔ)器區(qū)域。前端驅(qū)動(dòng)通過協(xié)議(例如 Xen Bus 或 VirtIO)使用 HVC 指令(最終)與 Dom0 上運(yùn)行的虛擬化代碼通信。在 Dom0 上運(yùn)行的虛擬化代碼提供一個(gè)用于顯示的后端,然后該后端由虛擬化代碼的 VNC 服務(wù)器進(jìn)行編碼,并通過網(wǎng)絡(luò)送到 VNC 客戶端。

此信息和演示能夠?yàn)楣芾沓绦虻倪M(jìn)一步研究和實(shí)驗(yàn)提供很好的基礎(chǔ)。當(dāng)你能夠在 QEMU 上用仿真來運(yùn)行演示之后,就可使用 PetaLinux 工具在 Zynq UltraScale+ MPSoC 芯片上運(yùn)行。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉