在 Zynq MPSoC 上運(yùn)行 DOOM 游戲
最后,一旦處理器進(jìn)入 HYPER 模式,其指令就可以操作 RegisterHyper 和 HyperProgramCounter,而且程序可執(zhí)行 SWITCH-SUPER 和 EXITHYPER。
本文引用地址:http://cafeforensic.com/article/201608/294978.htm
圖 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):
1、例外等級(jí) 0 (EL0),無(wú)需特權(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(利用管理程序的虛擬化)。如果對(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 工具包含一組命令,以供用戶在賽靈思 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è)過(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í)由用戶來(lái)完成。
想玩 DOOM 嗎?
為了讓過(guò)程更簡(jiǎn)單,賽靈思提供基礎(chǔ)的根文件系統(tǒng),這樣用戶就無(wú)需花時(shí)間和精力自己構(gòu)建。此演示所需的所有下載內(nèi)容在以下網(wǎng)址中均有提供: www.wiki.xil- inx.com/Doom+on+Xen+Demo。
該演示首先通過(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 工具和為用戶預(yù)編譯的 Xen 庫(kù)以及其他一些所需的庫(kù),以讓過(guò)程簡(jiǎn)單直觀。
評(píng)論