通過這篇有趣的教程,熟悉運行在賽靈思 Zynq UltraScale+ MPSoC 上的 Xen 管理程序。
賽靈思和 DornerWorks 的系統軟件團隊在賽靈思的 Zynq? Ultrascale+? MPSoC 上啟動 Xen Project 管理程序時,我們發現可通過運行當年叱詫一時的流行電子游戲 Doom 來演示和測試系統。
神馬?!你不知道 DOOM??(CS 你總知道吧 -__-||)
如何針對 Zynq UltraScale+ MPSoC 通過 QEMU 在 Xen 上運行 Doom 呢,在詳細介紹具體步驟之前,我們先來了解什么是管理程序,以及它們如何與 Zynq UltraScale+ MPSoC 上的處理器協同工作。
管理程序及其工作原理
管理程序是一種可虛擬化處理器的計算機程序。運行在虛擬化處理器上的應用程序和操作系統似乎完全擁有系統,但事實上管理程序負責管理虛擬處理器對物理機資源(例如存儲器和處理內核)的訪問。管理程序之所以流行,是因為能實現設計分區以及系統上運行的獨立軟件元素之間的隔離。
為了支持虛擬化,物理處理器必須提供一個供管理程序運行的特殊“模式”。因此,介紹處理器模式有助于理解管理程序如何完成處理器魔法。
所有處理器都有一些指令,這些指令可操作寄存器中存儲的值,并可讀寫存儲器。處理器的模式是指令和寄存器的集合,以及利用指令訪問寄存器和存儲器時要遵守的規則。為了便于解釋,我們以通用處理器為例來介紹,并使用與結構無關的術語。在這個實例中,處理器具有特定的寄存器、指令和模式。寄存器包括 RegisterA、RegisterB、RegisterC、UserProgramCounter、Register-Super 和 SuperProgramCounter。指令包括以下內容。
ADD Register3 Register1 Register2 將 Register1 與 Register2 相加,并把結果存入 Register3,即 Register3 = Register1 + Register2。
MOVTO Register2 Register1 將 Register1 中地址所指向的存儲器內容移動到 Register2。
MOVFROM Register2 Register1 將 Register1 的內容移動到 Register2 中地址所指向的存儲器。
ENTERSUPER 進入處理器的 SUPER 模式。
EXITSUPER 退出 SUPER 模式并進入 USER 模式。
在 USER 模式下,處理器的指令的功能受到限制。本例中,指令可對除 RegisterSuper 和 SuperProgramCounter 以外的所有寄存器進行讀和寫操作,處理器可執行除 EXITSUPER 以外的所有指令。
此外,在 USER 模式下,所有指令只能讀和寫一部分存儲器,例如從地址 0x0000_0100 到 0x0FFF_FFFF。在 USER 模式下,如果程序嘗試執行不應該執行的指令,或者訪問無權訪問的寄存器或存儲器位置,那么處理器將暫停出錯指令 (offending instruction)。
SUPER 模式下,處理器的指令可以讀/寫上述所有寄存器,包括 RegisterSuper 和 SuperProgramCounter。以上所列的所有指令,包括 EXITSUPER,都可以執行,另外,附加的指令 ENTERHYPER 也可執行(后面詳細介紹該指令)。此外,在 SUPER 模式下,指令可以訪問系統中的全部存儲器(從 0x0000_0000 到 0x7FFF_ FFFF)。
采用帶模式的處理器,使我們可以利用設計分區來更簡單地解決軟件工程設計問題。以上實例中,只有一種方法進入 SUPER 模式:執行 ENTERSUPER 指令。同樣,只有一種方法退出 SUPER 模式:執行 EXITSUPER。此外,在 USER 模式下程序只能訪問機器的部分存儲器。有了這種方案,我們可編寫一個程序讓處理器同時運行多個 USER 模式程序。這個“操作系統”(OS) 程序運行在 SUPER 模式,并管理在 USER 模式中運行的程序。
當 OS 運行時,會查看需要運行的所有 USER 模式程序,選擇一個運行,然后使用 EXITSUPER 這樣的指令通知處理器切換到 USER 模式以運行程序。所選的程序會一直運行,直到有事件導致處理器切回 SUPER 模式。這類事件可以是來自 USER 模式程序的 ENTERSUPER 指令,或外部事件,例如定時器,它可以不提醒正在 USER 模式下運行的程序將處理器切換到 SUPER 模式。無論切換如何發生,每當事件發生時,我們都可構建 OS 以根據相應策略相繼選擇和運行程序。當切換快速進行時,用戶認為 USER 程序同時運行。
USER HYPER 模式的用處是讓很多 SUPER 程序運行。SUPER 模式下的每個程序都可以是 OS;這些 OS 本身會讓很多 USER 程序并行運行。
SUPER 處理器模式還能防止 USER 程序干擾運行在 SUPER 模式的程序或其他 USER 模式程序。USER 模式程序的任何錯誤或違規都可被控制在該程序自身的實例中,不會破壞或干擾為 SUPER 模式操作保留的系統存儲器和寄存器。
聽起來很好,但能否用另一個模式實現一些功能?
對我們的機器稍加擴展,就可以引入 HYPER 模式。HYPER 模式可以讀/寫所有初始寄存器(RegisterA、RegisterB、RegisterC、UserProgramCounter、RegisterSuper 和 SuperProgramCounter)以及兩個附加寄存器:RegisterHyper 和 HyperProgramCounter。HYPER 模式下的指令包括初始集以及下面的斜體字。
ADD Register3 Register1 Register2 將 Register1 與 Register2 相加并把結果放在 Register3 中,即 Register3 = Register1 + Register2。
MOVTO Register2 Register1 將 Register1 中地址所指向的存儲器內容移到 Register2。
MOVFROM Register2 Register1 將 Register1 的內容移到 Register2 中地址所指向的存儲器。
MOVTOPHYS Register2 Register1 將 Register1 中物理地址指向的存儲器內容移到 Register2。
MOVFROMPHYS Register2 Register1 將 Register1 的內容移到 Register2 中地址指向的物理存儲器。
ENTERSUPER 進入處理器的 SUPER 模式。
EXITSUPER 退出 SUPER 模式并進入 USER 模式。
ENTERHYPER 進入處理器的 HYPER 模式。
EXITHYPER 退出處理器的 HYPER 模式。
SWITCHSUPER RegisterHyper 切換到 SUPER 程序,該程序將使用 RegisterHyper 中的值來執行下一個 SUPER 程序。
HYPER 模式中的附加指令和寄存器允許處理器切換哪個程序在 SUPER 模式中運行,就像 SUPER 模式允許處理器切換哪個程序在 USER 模式中運行一樣。HYPER 模式的一個特性是能夠切換哪個存儲器 SUPER 模式能看到;當一個在 HYPER 模式中運行的程序執行 SWITCHSUPER RegisterHyper 時,底層存儲器完全斷開。這就是說當 HYPER 模式中的程序執行了 EXITHYPER 之后,下個 SUPER 程序運行之時,SUPER 模式看到的實際物理存儲器與運行在 SUPER 模式中的另一個程序使用的物理存儲器不同。SUPER 模式程序仍使用相同地址訪問存儲器,但是該地址指向不同的物理位置。圖 1 顯示了執行 SWITCHSUPER RegisterHyper 前后的處理器存儲器視圖。
HYPER 模式很有用,是因為它允許很多個 SUPER 程序運行。SUPER 模式中每個程序都可以是 OS;這些 OS 本身可以讓很多 USER 程序并列運行.這意味著,我們可以在相同硬件上運行多個 OS,例如 Windows 和 Linux;在一個處理器上運行 20 個 Linux 實例;或者之間的任意組合。由于每個虛擬 OS 實例無法看到另一個 OS 實例,因此如果一個崩潰,不會使另一個實例也崩潰。HYPER 模式的特性還有其他應用:我們可以在多個 OS 之間對系統資源分區;監測 HYPER 模式下每個 OS 的執行,以在崩潰時重啟;以及在虛擬 OS 運行時密切關注系統狀態。
圖 1:HYPER 模式下執行 SWITCHSUPER RegisterHyper 的前后區別
隨著處理器從 USER 切換到 SUPER 模式,再從 SUPER 切換到 HYPER 模式,機器會賦予執行代碼更多特權。本例中,USER 模式程序只有權使用四個寄存器(RegisterA、RegisterB、RegisterC 和 UserProgramCounter)和四個指令:(ADD、MOVTO、MOVFROM和ENTER-SUPER)。此外,USER 程序只能讀寫 0x0000_0100 至 0x0FFF_ FFFF 的存儲器。一旦進入 SUPER 模式,處理器允許指令與 RegisterSuper 和 SuperProgramCounter 對話,并允許執行 EXITSUPER 和 ENTERHYPER。此外,SUPER 程序可以訪問從 0x0000_0000 至 0x7FFF_FFFF 的存儲器。
最后,一旦處理器進入 HYPER 模式,其指令就可以操作 RegisterHyper 和 HyperProgramCounter,而且程序可執行 SWITCH-SUPER 和 EXITHYPER。
?
圖 2:各種模式如環形所示
HYPER 模式還允許處理器讀寫所有虛擬存儲器,0x0000_0000 至 0xFFFF_FFFF,以及讀寫實際物理存儲器。這些特權等級通常被直觀地用環形來描述(圖 2)。主環,即 HYPER 環為特權等級較低的環賦予權限,最終可控制整個系統。
理論結合實踐
ARM? 創建處理器設計,供 ARM 合作伙伴構建芯片用。ARM 處理器包含一個或多個內核。每個內核實現一個 ARM 架構。例如,Zynq UltraScale+ MPSoC 包含一個 ARM Cortex?-A53 處理器及四個 ARMv8-A 物理內核(圖 3)。
當查看 ARM 處理器的文檔和代碼時,這種區別很重要;為了全面理解具有一個 ARM 內核的“芯片”,可參考有關架構 (如 ARMv8-A) 和處理器 (如 Cortex-A53) 的文檔。ARMv8 架構中有四個例外等級 (來源:ARM 架構參考手冊,D1-1404):
1、例外等級 0 (EL0),無需特權即可執行;
2、例外等級 1 (EL1),執行 OS 以及任何執行特權指令的內容;
3、例外等級 2 (EL2),允許硬件被虛擬化;以及
4、例外等級 3 (EL3),允許在安全與非安全處理器狀態之間切換。
以下程序通常在這些模式下運行,如ARM 架構參考手冊 (D1–1404)中所述:EL0,應用程序;EL1,OS 內核以及通常所描述的相關特權函數;EL2,管理程序;EL3,安全監控器。我們的理論實例直接對應 ARMv8 執行模式 EL0 至 EL2:USER 對應 EL0,SUPER 對應 EL1,HYPER 對應 EL2。ARM 添加第四個特權等級,即 EL3;利用這個特權等級,我們可在安全與非安全環境之間切換 EL0 和 EL1。盡管 EL3 的使用是一個很重要的論題,能夠為架構增加大量的功能,但是在本實例中我們將其忽略,并著重介紹 EL0-EL2(利用管理程序的虛擬化)。如果對計算機如何保護金融交易感興趣,可以參閱 ARMv8 EL3 文檔(免費提供,需注冊)。這是非常好的參考文檔,從中可以獲得極為詳細的介紹。
圖 3:Zynq UltraScale+ MPSoC 架構
評論