<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          用ZYNQ MPSoC玩DOOM

          作者: 時間:2018-08-08 來源:網(wǎng)絡(luò) 收藏

          賽靈思和 DornerWorks 的系統(tǒng)軟件團隊在賽靈思的 Zynq® Ultrascale+™ MPSoC 上啟動 Xen Project 管理程序時,我們發(fā)現(xiàn)可通過運行當年叱詫一時的流行電子游戲 Doom 來演示和測試系統(tǒng)。

          本文引用地址:http://www.ex-cimer.com/article/201808/385964.htm

          神馬?!你不知道 DOOM??(CS 你總知道吧 -__-||)

          如何針對 Zynq UltraScale+ MPSoC 通過 QEMU 在 Xen 上運行 Doom 呢,在詳細介紹具體步驟之前,我們先來了解什么是管理程序,以及它們?nèi)绾闻c Zynq UltraScale+ MPSoC 上的處理器協(xié)同工作。

          管理程序及其工作原理

          管理程序是一種可虛擬化處理器的計算機程序。運行在虛擬化處理器上的應(yīng)用程序和操作系統(tǒng)似乎完全擁有系統(tǒng),但事實上管理程序負責(zé)管理虛擬處理器對物理機資源(例如存儲器和處理內(nèi)核)的訪問。管理程序之所以流行,是因為能實現(xiàn)設(shè)計分區(qū)以及系統(tǒng)上運行的獨立軟件元素之間的隔離。

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

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

          · MOVFROM Register2 Register1 將 Register1 的內(nèi)容移動到 Register2 中地址所指向的存儲器。

          · ENTERSUPER 進入處理器的 SUPER 模式。

          · EXITSUPER 退出 SUPER 模式并進入 USER 模式。

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

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

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

          采用帶模式的處理器,使我們可以利用設(shè)計分區(qū)來更簡單地解決軟件工程設(shè)計問題。以上實例中,只有一種方法進入 SUPER 模式:執(zhí)行 ENTERSUPER 指令。同樣,只有一種方法退出 SUPER 模式:執(zhí)行 EXITSUPER。此外,在 USER 模式下程序只能訪問機器的部分存儲器。有了這種方案,我們可編寫一個程序讓處理器同時運行多個 USER 模式程序。這個”操作系統(tǒng)”(OS) 程序運行在 SUPER 模式,并管理在 USER 模式中運行的程序。

          當 OS 運行時,會查看需要運行的所有 USER 模式程序,選擇一個運行,然后使用 EXITSUPER 這樣的指令通知處理器切換到 USER 模式以運行程序。所選的程序會一直運行,直到有事件導(dǎo)致處理器切回 SUPER 模式。這類事件可以是來自 USER 模式程序的 ENTERSUPER 指令,或外部事件,例如定時器,它可以不提醒正在 USER 模式下運行的程序?qū)⑻幚砥髑袚Q到 SUPER 模式。無論切換如何發(fā)生,每當事件發(fā)生時,我們都可構(gòu)建 OS 以根據(jù)相應(yīng)策略相繼選擇和運行程序。當切換快速進行時,用戶認為 USER 程序同時運行。

          USER HYPER 模式的用處是讓很多 SUPER 程序運行。SUPER 模式下的每個程序都可以是 OS;這些 OS 本身會讓很多 USER 程序并行運行。

          SUPER 處理器模式還能防止 USER 程序干擾運行在 SUPER 模式的程序或其他 USER 模式程序。USER 模式程序的任何錯誤或違規(guī)都可被控制在該程序自身的實例中,不會破壞或干擾為 SUPER 模式操作保留的系統(tǒng)存儲器和寄存器。

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

          對我們的機器稍加擴展,就可以引入 HYPER 模式。HYPER 模式可以讀/寫所有初始寄存器(RegisterA、RegisterB、RegisterC、UserProgramCounter、RegisterSuper 和 SuperProgramCounter)以及兩個附加寄存器:RegisterHyper 和 HyperProgramCounter。HYPER 模式下的指令包括初始集以及下面的斜體字。

          ADD Register3 Register1 Register2 將 Register1 與 Register2 相加并把結(jié)果放在 Register3 中,即 Register3 = Register1 + Register2。

          · MOVTO Register2 Register1 將 Register1 中地址所指向的存儲器內(nèi)容移到 Register2。

          · MOVFROM Register2 Register1 將 Register1 的內(nèi)容移到 Register2 中地址所指向的存儲器。

          · MOVTOPHYS Register2 Register1 將 Register1 中物理地址指向的存儲器內(nèi)容移到 Register2。

          · MOVFROMPHYS Register2 Register1 將 Register1 的內(nèi)容移到 Register2 中地址指向的物理存儲器。

          · ENTERSUPER 進入處理器的 SUPER 模式。

          · EXITSUPER 退出 SUPER 模式并進入 USER 模式。

          · ENTERHYPER 進入處理器的 HYPER 模式。

          · EXITHYPER 退出處理器的 HYPER 模式。

          · SWITCHSUPER RegisterHyper 切換到 SUPER 程序,該程序?qū)⑹褂?RegisterHyper 中的值來執(zhí)行下一個 SUPER 程序。

          HYPER 模式中的附加指令和寄存器允許處理器切換哪個程序在 SUPER 模式中運行,就像 SUPER 模式允許處理器切換哪個程序在 USER 模式中運行一樣。HYPER 模式的一個特性是能夠切換哪個存儲器 SUPER 模式能看到;當一個在 HYPER 模式中運行的程序執(zhí)行 SWITCHSUPER RegisterHyper 時,底層存儲器完全斷開。這就是說當 HYPER 模式中的程序執(zhí)行了 EXITHYPER 之后,下個 SUPER 程序運行之時,SUPER 模式看到的實際物理存儲器與運行在 SUPER 模式中的另一個程序使用的物理存儲器不同。SUPER 模式程序仍使用相同地址訪問存儲器,但是該地址指向不同的物理位置。圖 1 顯示了執(zhí)行 SWITCHSUPER RegisterHyper 前后的處理器存儲器視圖。

          HYPER 模式很有用,是因為它允許很多個 SUPER 程序運行。SUPER 模式中每個程序都可以是 OS;這些 OS 本身可以讓很多 USER 程序并列運行.這意味著,我們可以在相同硬件上運行多個 OS,例如 Windows 和 Linux;在一個處理器上運行 20 個 Linux 實例;或者之間的任意組合。由于每個虛擬 OS 實例無法看到另一個 OS 實例,因此如果一個崩潰,不會使另一個實例也崩潰。HYPER 模式的特性還有其他應(yīng)用:我們可以在多個 OS 之間對系統(tǒng)資源分區(qū);監(jiān)測 HYPER 模式下每個 OS 的執(zhí)行,以在崩潰時重啟;以及在虛擬 OS 運行時密切關(guān)注系統(tǒng)狀態(tài)。

          圖 1:HYPER 模式下執(zhí)行 SWITCHSUPER RegisterHyper 的前后區(qū)別

          隨著處理器從 USER 切換到 SUPER 模式,再從 SUPER 切換到 HYPER 模式,機器會賦予執(zhí)行代碼更多特權(quán)。本例中,USER 模式程序只有權(quán)使用四個寄存器(RegisterA、RegisterB、RegisterC 和 UserProgramCounter)和四個指令:(ADD、MOVTO、MOVFROM和ENTER-SUPER)。此外,USER 程序只能讀寫 0x0000_0100 至 0x0FFF_ FFFF 的存儲器。一旦進入 SUPER 模式,處理器允許指令與 RegisterSuper 和 SuperProgramCounter 對話,并允許執(zhí)行 EXITSUPER 和 ENTERHYPER。此外,SUPER 程序可以訪問從 0x0000_0000 至 0x7FFF_FFFF 的存儲器。

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

          圖 2:各種模式如環(huán)形所示

          HYPER 模式還允許處理器讀寫所有虛擬存儲器,0x0000_0000 至 0xFFFF_FFFF,以及讀寫實際物理存儲器。這些特權(quán)等級通常被直觀地用環(huán)形來描述(圖 2)。主環(huán),即 HYPER 環(huán)為特權(quán)等級較低的環(huán)賦予權(quán)限,最終可控制整個系統(tǒng)。

          理論結(jié)合實踐

          ARM® 創(chuàng)建處理器設(shè)計,供 ARM 合作伙伴構(gòu)建芯片用。ARM 處理器包含一個或多個內(nèi)核。每個內(nèi)核實現(xiàn)一個 ARM 架構(gòu)。例如,Zynq UltraScale+ MPSoC 包含一個 ARM Cortex™-A53 處理器及四個 ARMv8-A 物理內(nèi)核(圖 3)。

          當查看 ARM 處理器的文檔和代碼時,這種區(qū)別很重要;為了全面理解具有一個 ARM 內(nèi)核的”芯片”,可參考有關(guān)架構(gòu) (如 ARMv8-A) 和處理器 (如 Cortex-A53) 的文檔。ARMv8 架構(gòu)中有四個例外等級 (來源:ARM 架構(gòu)參考手冊,D1-1404):

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

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

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

          4、例外等級 3 (EL3),允許在安全與非安全處理器狀態(tài)之間切換。

          以下程序通常在這些模式下運行,如ARM 架構(gòu)參考手冊 (D1–1404)中所述:EL0,應(yīng)用程序;EL1,OS 內(nèi)核以及通常所描述的相關(guān)特權(quán)函數(shù);EL2,管理程序;EL3,安全監(jiān)控器。我們的理論實例直接對應(yīng) ARMv8 執(zhí)行模式 EL0 至 EL2:USER 對應(yīng) EL0,SUPER 對應(yīng) EL1,HYPER 對應(yīng) EL2。ARM 添加第四個特權(quán)等級,即 EL3;利用這個特權(quán)等級,我們可在安全與非安全環(huán)境之間切換 EL0 和 EL1。盡管 EL3 的使用是一個很重要的論題,能夠為架構(gòu)增加大量的功能,但是在本實例中我們將其忽略,并著重介紹 EL0-EL2(利用管理程序的虛擬化)。如果對計算機如何保護金融交易感興趣,可以參閱 ARMv8 EL3 文檔(免費提供,需注冊)。這是非常好的參考文檔,從中可以獲得極為詳細的介紹。

          圖 3:Zynq UltraScale+ MPSoC 架構(gòu)

          進入和退出例外模式

          在真實系統(tǒng)中,模式之間的切換比我們的實例更復(fù)雜一些。ARM 總結(jié)了 ARMv8-A 架構(gòu)的行為并在參考手冊中給出。手冊中介紹,只有在接到例外或從例外返回時,才能改變執(zhí)行所處的例外等級。在接到例外時,例外等級只能升高或保持不變;在從例外返回時,例外等級只能降低或保持不變。只有三個指令能生成針對下個例外等級的例外:SVC (Supervisor Call),生成針對 EL1 的例外;HVC (Hypervisor Call),生成針對 EL2 的例外;SMC (Secure Monitor Call),生成針對 EL3 的例外。這些指令取值范圍為 0-65,555,允許每個例外等級有 216 個系統(tǒng)調(diào)用。這些指令針對下個例外等級,而且是唯一可供運行在較低例外等級的程序從運行在較高例外等級的程序請求某些內(nèi)容的機制。在我們的理論實例中,SVC 是 SWITCHSUPER,HVC 是 SWITCHHYPER。

          PetaLinux 工具包含一組命令,以供用戶在賽靈思 FPGA 和 SoC 上輕松創(chuàng)建和擴展 Linux 系統(tǒng)。

          在前一個部分,我們介紹了能夠讓運行在 USER 模式(EL0)的程序進入 SUPER 模式 (EL1) 的事件。大多數(shù)運行在 USER 模式的程序生成的事件是請求存儲器。當運行在 EL0 中的用戶空間程序從運行在 EL1 中的 OS 請求存儲器時,這個用戶空間程序的 C 代碼可能調(diào)用函數(shù) malloc(),再由該函數(shù)調(diào)用 mmap() 或 sbrk(),以從 OS 請求一個指向可用存儲器的指針。在 ARMv8-A 架構(gòu)中的 Linux 上,這個過程在幕后轉(zhuǎn)化為 SVC 系統(tǒng)調(diào)用。該系統(tǒng)調(diào)用會把處理器轉(zhuǎn)換為 EL1,從而將控制權(quán)送回 OS,后者會解讀調(diào)用內(nèi)容并提供正確的響應(yīng)——本例中是指向所請求存儲器區(qū)域的指針,或者是一個錯誤,用以指出沒有可用存儲器。

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

          現(xiàn)在我們來介紹我們團隊在 Zynq UltraScale+ QEMU Model 上運行 Doom 時所采用的步驟。這些步驟展示了如何獲得和構(gòu)建運行演示所需的每個組件,如何運行以及以什么順序運行每個組件,以及如何與演示交互。成功完成該演示之后,你會獲得一個環(huán)境,用來在上面進行實驗,以了解 Xen 管理程序在仿真的 Zynq UltraScale+ MPSoC 上的運行情況。還需要將此遷移植 Zynq UltraScale+ MPSoC 芯片,這可作為練習(xí)由用戶來完成。

          想玩 DOOM 嗎?

          為了讓過程更簡單,賽靈思提供基礎(chǔ)的根文件系統(tǒng),這樣用戶就無需花時間和精力自己構(gòu)建。此演示所需的所有下載內(nèi)容在以下網(wǎng)址中均有提供: www.wiki.xil- inx.com/Doom+on+Xen+Demo。

          該演示首先通過更新由賽靈思提供的預(yù)編譯根文件系統(tǒng) (rootFS),可包含所需的組件。然后,利用賽靈思的 PetaLinux 工具運行演示。rootFS 包含運行于 Linux 系統(tǒng)上的大部分程序——具體來說就是用來啟動系統(tǒng)的一組腳本,以及用來實現(xiàn)系統(tǒng)的應(yīng)用程序與函數(shù)庫集。我們用來擴展演示中的基礎(chǔ) rootFS 所使用的兩個工具分別是 Buildroot 和 PetaLinux。我們使用 Buildroot 為賽靈思提供的基礎(chǔ) rootFS 構(gòu)建 Doom 二進制文件,同時使用 PetaLinux 創(chuàng)建 rootFS 的剩余部分并引導(dǎo)演示。

          Buildroot

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

          PetaLinux

          PetaLinux 工具包含一個命令集,以便讓用戶在賽靈思 FPGA 和 SoC 上輕松創(chuàng)建和擴展 Linux 系統(tǒng)。該演示使用 petalinux-build 和 petalinux-boot 命令。petalinux-build 命令用于創(chuàng)建全部所需的組件。petalinux-boot 命令(外加幾個變量)用于啟動在 QEMU 仿真器上運行的所有組件。介紹 PetaLinux 工具中的所有命令超出了本文的范圍,但是通過此演示系統(tǒng)應(yīng)該很容易發(fā)掘這兩個命令和其他命令的功能。參考PetaLinux 工具文檔 — 參考指南 UG1144 (v2015.4) 了解更多信息。

          項目先決條件

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

          一旦 Doom 啟動,你就可以使用鍵盤和鼠標控制游戲。應(yīng)記住,可能需要點擊 ESC 鍵來開始游戲。開始游戲咯!

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

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

          解壓文檔。

          $ cd

          $ tar -xzf doom_demo.tar.gz cd doom_demo

          我們會看到一個文件夾,我們將把它存到根文件系統(tǒng)(一個用于 Dom0,另一個用于 DomU)?,F(xiàn)在,我們需要構(gòu)建 PrBoom,并復(fù)制到 rootFS。


          上一頁 1 2 下一頁

          關(guān)鍵詞: 嵌入式

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();