0、ARMv8架構(gòu)
1)ARMv8基本概念
(1)執(zhí)行狀態(tài)(execution state):處理器運(yùn)行時(shí)的環(huán)境,包括寄存器的位寬、支持的指令集、異常模型、內(nèi)存管理及編程模型等。ARMv8體系結(jié)構(gòu)定義了兩個(gè)執(zhí)行狀態(tài):
AArch64:64位的執(zhí)行狀態(tài)
提供31個(gè)64位的通用寄存器。
提供64位程序計(jì)數(shù)指針寄存器(Program Counter,PC)、棧指針寄存器(Stack Pointer,SP)及異常鏈接寄存器(Exception Link Register,ELR)。
提供A64精簡(jiǎn)指令集。
定義ARMv8異常模型,支持4個(gè)異常等級(jí):EL0~EL3。
提供64位的內(nèi)存模型。
定義一組處理器狀態(tài)(PSTATE),用來(lái)保存PE(Processing Element,處理機(jī))的狀態(tài)。
AArch32:32位的執(zhí)行狀態(tài)
提供13個(gè)32位的通用寄存器、PC指針寄存器、SP寄存器、鏈接寄存器。
支持A32和T32兩套指令集。
支持ARMv7-A異常模型。
提供32位的虛擬內(nèi)存訪問(wèn)機(jī)制。
定義一組處理器狀態(tài)(PSTATE),用來(lái)保存PE的狀態(tài)。
AArch64狀態(tài)的異常等級(jí)
ARMv8處理器支持兩種執(zhí)行狀態(tài):AArch64狀態(tài)和AArch32狀態(tài)。其中AArch64狀態(tài)是ARMv8新增的64位執(zhí)行狀態(tài),該狀態(tài)下運(yùn)行A64指令集。AARch32狀態(tài)是為了兼容ARMv7的32位執(zhí)行狀態(tài),該狀態(tài)下運(yùn)行A32指令集或者T32指令集。
AArch64狀態(tài)的異常等級(jí),決定了處理器當(dāng)前運(yùn)行的特權(quán)級(jí)別,類(lèi)似于ARMv7中的特權(quán)等級(jí)。
EL0:用戶特權(quán),用于運(yùn)行普通用戶程序。
EL1:系統(tǒng)特權(quán),通常用于操作系統(tǒng)內(nèi)核,比如linux、rtos。如果系統(tǒng)使能了虛擬化擴(kuò)展,運(yùn)行虛擬機(jī)操作系統(tǒng)內(nèi)核。
EL2:運(yùn)行虛擬化擴(kuò)展的虛擬機(jī)監(jiān)控器(hypervisor)。
EL3:運(yùn)行安全世界中的安全監(jiān)控器(secure monitor)。
ARMv8允許切換應(yīng)用程序的運(yùn)行模式,在一個(gè)64位操作系統(tǒng)的ARMv8處理器中,我們可以同時(shí)運(yùn)行A64指令集和A32指令集的應(yīng)用程序,但是32位操作系統(tǒng)的ARMv8處理器中,就不能運(yùn)行A64指令集的應(yīng)用程序了。
ARMv8體系結(jié)構(gòu)提供2種安全狀態(tài):Secure和Non-secure。Secure state和Non-secure state將運(yùn)行環(huán)境劃分為Normal world和Secure world,EL3只存在于Secure state。每種安全狀態(tài)有獨(dú)立的物理地址空間范圍,在Secure state,處理器可以訪問(wèn)Secure和Non-secure的物理地址空間范圍。在Non-secure state,處理器只能訪問(wèn)Non-secure的物理地址空間范圍。
異常等級(jí)之間的切換:
Supervisor Call(SVC)指令:EL0的軟件向EL1(OS service)申請(qǐng)軟件服務(wù)。
Hypervisor Call(HVC)指令:主要被EL1(guest OS)請(qǐng)求hypervisor(EL2)服務(wù)。
Secure monitor Caller(SMC)指令:EL3用來(lái)切換安全非安全世界。
ERET指令用于異常返回,返回地址和處理器狀態(tài)是從當(dāng)前EL(exception level)下的ELR和SPSR寄存器中恢復(fù)的。ERET 指令可用于返回到 CPU 支持的相同或任何較低的異常級(jí)別。如果存儲(chǔ)在 SPSR_EL3.M[4:0] 中的已保存模式字段,設(shè)置為 0b00101 或 0b00100,其中位M[ 3:2] 將異常級(jí)別編碼為1,然后在 EL3 執(zhí)行的 ERET 指令將返回到 EL1。
(2)ARMv8指令集:根據(jù)不同的執(zhí)行狀態(tài),提供不同的指令集支持,支持如下指令集。
A64指令集:運(yùn)行在AArch64狀態(tài)下,提供64位指令集支持。A64指令集是ARMv8新增的,和A32采用了不同的指令編碼,所以跟A32不兼容。A64可以處理64位寬的寄存器和數(shù)據(jù),使用64位的指針來(lái)訪存,但是A64指令集的指令寬度是32位。
A32指令集:運(yùn)行在AArch32狀態(tài)下,提供32位A32指令集支持。
T32指令集:運(yùn)行在AArch32狀態(tài)下,提供16位和32位Thumb指令集支持。
2)ARMv8特性
使用64位體系結(jié)構(gòu),因此處理器可以訪問(wèn)遠(yuǎn)超4GB的物理地址空間。雖然是64位體系結(jié)構(gòu),但是一般并不使用64位地址總線,例如使用48位,即可以訪問(wèn)256TB的物理地址空間。在32位ARM體系結(jié)構(gòu)中,如果不使能LPAE(Large Physical Address Extension)功能,最多只能訪問(wèn)4GB物理地址空間。即使使能了LPAE功能,也只是將物理地址空間的尋址能力擴(kuò)展到40位,也就是1TB。
提供64位的虛擬地址尋址,從而擴(kuò)大了進(jìn)程的虛擬地址空間。在32位ARM體系結(jié)構(gòu)中,即使使能了LAPE功能,也只是擴(kuò)展了物理地址空間,但是進(jìn)程的虛擬地址空間還是只有4GB。擴(kuò)大虛擬地址空間之后,可以使用memory map的方式映射更大的文件到進(jìn)程虛擬地址空間中,從而提高IO的效率。
通過(guò)automatic event signaling機(jī)制,實(shí)現(xiàn)高性能低功耗的spinlock。
提供31個(gè)64位通用寄存器,可減少對(duì)棧的使用,減少訪存的頻率,從而提升性能。在ARMv7體系結(jié)構(gòu)的AAPCS(ARM Architecture Procedure Call Standard)中,前4個(gè)參數(shù)使用寄存器傳遞,大于4個(gè)的參數(shù)部分需要使用棧傳遞,也就是需要訪問(wèn)內(nèi)存。而在ARMv8體系結(jié)構(gòu)中,可以使用寄存器傳遞前8個(gè)參數(shù),從而減少了對(duì)棧的使用。
提供基于PC寄存器±4GB的相對(duì)尋址范圍,提高了相對(duì)尋址效率,可以提升動(dòng)態(tài)庫(kù)和位置無(wú)關(guān)代碼的執(zhí)行效率。
支持16KB & 64KB的分頁(yè)粒度,可以減少頁(yè)表級(jí)數(shù),同時(shí)提高TLB命中率。
全新的異常處理模型,更加利于操作系統(tǒng)和虛擬化的實(shí)現(xiàn)。
設(shè)計(jì)了全新的Load-Acquire和Store-Release指令,在線程安全的代碼中,不再需要顯式的內(nèi)存屏障指令,從而提升了性能。
3)ARMv8寄存器
(1)通用寄存器
AArch64執(zhí)行狀態(tài)支持31個(gè)64位通用寄存器(X0~X30),AArch32狀態(tài)支持16個(gè)32位通用寄存器。
通用寄存器
(2)狀態(tài)寄存器
狀態(tài)寄存器
(3)特殊寄存器
特殊寄存器
當(dāng)運(yùn)行異常處理程序時(shí),處理器會(huì)把PSTATE寄存器的值暫時(shí)保存在SPSR(Saved Program Status Register,SPSR)里。當(dāng)異常處理完返回時(shí),再把SPSR的值恢復(fù)到PSTATE寄存器。
(4)系統(tǒng)寄存器
通過(guò)訪問(wèn)和設(shè)置這些系統(tǒng)寄存器,來(lái)完成對(duì)處理器不同的功能配置。ARMv8支持7類(lèi)系統(tǒng)寄存器:
通用系統(tǒng)控制寄存器
調(diào)試寄存器
性能監(jiān)控寄存器
活動(dòng)監(jiān)控寄存器
統(tǒng)計(jì)擴(kuò)展寄存器
RAS寄存器
通用定時(shí)器寄存器
系統(tǒng)寄存器支持不同的異常等級(jí)訪問(wèn),具體的訪問(wèn)規(guī)則如下:
Reg_EL1:處理器處于EL1、EL2、EL3時(shí),都可以訪問(wèn)該寄存器。
Reg_EL2:處理器處于EL2、EL3時(shí),可以訪問(wèn)寄存器。
大部分系統(tǒng)寄存器不支持處理器處于EL0時(shí)訪問(wèn),但也有例外,比如CTR_EL0。
通過(guò)MSR、MRS指令訪問(wèn)系統(tǒng)寄存器。
1 綜述
本文描述了Armv8-A AArch64的虛擬化支持。包括stage 2頁(yè)表轉(zhuǎn)換,虛擬異常,以及陷阱。本文介紹了一些基礎(chǔ)的硬件輔助虛擬化理論以及一些Hypervisor如何利用這些虛擬化特性的例子。文本不會(huì)講述某一具體的Hypervisor軟件是如何工作的以及如何開(kāi)發(fā)一款Hypervisor軟件。通過(guò)閱讀本文,你可以學(xué)到兩種類(lèi)型的Hypervisor以及它們是如何映射到Arm的異常級(jí)別。你將能解釋陷阱是如何工作的以及其是如何被用來(lái)進(jìn)行各種模擬操作。你將能描述Hypervisor可以產(chǎn)生什么虛擬異常以及產(chǎn)生這些虛擬異常的機(jī)制。理解本文內(nèi)容需要一定基礎(chǔ),本文假定你熟悉ARMv8體系結(jié)構(gòu)的異常模型和內(nèi)存管理。 1.1 虛擬化簡(jiǎn)介 這里我們將介紹一些基礎(chǔ)的Hypervisor和虛擬化的理論知識(shí)。如果你已經(jīng)有一定的基礎(chǔ)或是已經(jīng)熟悉了這些概念,可以跳過(guò)這部分內(nèi)容。我們用Hypervisor這個(gè)詞來(lái)定義一種負(fù)責(zé)創(chuàng)建,管理以及調(diào)度虛擬機(jī)(Virtual Machines, VMs)的軟件。
虛擬化為什么重要
虛擬化是一種在現(xiàn)代云計(jì)算和企業(yè)基礎(chǔ)架構(gòu)中廣泛使用的技術(shù)。開(kāi)發(fā)人員用虛擬機(jī)在一個(gè)硬件平臺(tái)上運(yùn)行多個(gè)不同的操作系統(tǒng)來(lái)開(kāi)發(fā)和測(cè)試軟件,以避免對(duì)主計(jì)算環(huán)境造成可能的破壞。虛擬化技術(shù)在服務(wù)器上非常流行,大多數(shù)面向服務(wù)器的處理器都需要支持虛擬化功能,這是因?yàn)樘摂M化能給數(shù)據(jù)中心服務(wù)器帶來(lái)如下一些需要的特性:
隔離:利用虛擬化可以對(duì)同一個(gè)物理核上運(yùn)行的虛擬機(jī)進(jìn)行隔離。這使得相互間不可信的的計(jì)算環(huán)境可以共享同一套硬件環(huán)境。例如,兩個(gè)競(jìng)爭(zhēng)對(duì)手可以共享同一個(gè)物理機(jī)器而又不能訪問(wèn)對(duì)方的數(shù)據(jù)。
高可用性:虛擬化可以在不同的物理機(jī)器之間無(wú)縫透明地遷移負(fù)載。這個(gè)技術(shù)廣泛用于將負(fù)載從出錯(cuò)的硬件平臺(tái)遷移至其他可用平臺(tái),以便維護(hù)和替換出錯(cuò)的硬件而不影響服務(wù)。
負(fù)載均衡:為了降低數(shù)據(jù)中心硬件和功耗成本,需要盡可能充分地利用硬件平臺(tái)資源。將負(fù)載均衡地遷移到不同地物理機(jī)上,有利用充分利用物理機(jī)資源,降低功耗,同時(shí)為租戶提供最佳性能。
沙箱:虛擬機(jī)可以作為一個(gè)沙箱來(lái)為運(yùn)行在其中的應(yīng)用屏蔽其他軟件的干擾,或者避免其干擾其他軟件。例如在虛擬機(jī)中運(yùn)行特定軟件,可以避免該軟件的bug或病毒導(dǎo)致物理機(jī)器上的其他軟件損壞。
1.2 Hypervisor的兩種類(lèi)型
Hypervisor通常被分成兩種類(lèi)型,獨(dú)立類(lèi)型Type 1和寄生類(lèi)型 Type 2。我們先看看Type 2類(lèi)型的Hypervisor。對(duì)于Type 2類(lèi)型的Hypervisor,其寄生的宿主操作系統(tǒng)擁有對(duì)硬件平臺(tái)和資源(包括CPU和物理內(nèi)存…)的全部控制權(quán)。下圖展示了Type 2類(lèi)型的Hypervisor。
圖1:Type 2 Hypervisor 宿主操作系統(tǒng),指的是直接運(yùn)行在硬件平臺(tái)上并為T(mén)ype 2類(lèi)型的Hypervisor提供運(yùn)行環(huán)境的操作系統(tǒng)。這類(lèi)Hypervisor可以充分利用宿主操作系統(tǒng)對(duì)物理硬件的管理功能,而Hypervisor只需提供虛擬化相關(guān)功能即可。不知你是否使用過(guò)Virtual Box或是VMware Workstation, 這類(lèi)軟件就是Type 2類(lèi)型的Hypervisor。 接下來(lái),看看獨(dú)立類(lèi)型的Type 1 Hypervisor, 如圖2。這類(lèi)Hypervisor沒(méi)有宿主操作系統(tǒng)。其直接運(yùn)行在物理硬件之上,直接管理各種物理資源,同時(shí)管理并運(yùn)行客戶機(jī)操作系統(tǒng)。
圖2:Type 1 Hypervisor 在開(kāi)源社區(qū)常見(jiàn)的Hypervisor, Xen (Type 1) 和 KVM (Type 2)就分屬這兩種不同的類(lèi)型。其他開(kāi)源的或知識(shí)產(chǎn)權(quán)的Hypervisor,可參見(jiàn)WiKi。
1.3 全虛擬化和半虛擬化
關(guān)于虛擬機(jī),經(jīng)典定義是:虛擬機(jī)是一個(gè)獨(dú)立的隔離的計(jì)算環(huán)境,這種計(jì)算環(huán)境讓使用者看起來(lái)就像在使用真實(shí)的物理機(jī)器一樣。盡管我們可以在基于ARM的硬件平臺(tái)上模擬真實(shí)硬件,但這通常不是最有效的做法,因此我們常常不這么做。例如,模擬一個(gè)真實(shí)的以太網(wǎng)設(shè)備是非常慢的,這是因?yàn)閷?duì)任何一個(gè)模擬寄存器的訪問(wèn)都會(huì)陷入到Hypervisor當(dāng)中進(jìn)行模擬。比起直接訪問(wèn)物理寄存器來(lái)說(shuō),這種操作的代價(jià)要昂貴得多。一個(gè)替代方案是修改客戶操作系統(tǒng),使之意識(shí)到自身運(yùn)行在虛擬機(jī)當(dāng)中,通過(guò)在Hypervisor中模擬一個(gè)虛擬設(shè)備來(lái)給客戶機(jī)使用。以此來(lái)?yè)Q取更好得I/O性能。嚴(yán)格來(lái)說(shuō),全虛擬化需要完全模擬真實(shí)硬件,性能上會(huì)比較差。開(kāi)源項(xiàng)目Xen推進(jìn)了半虛擬化,通過(guò)修改客戶機(jī)操作系統(tǒng)的核心部分使其更適合在虛擬環(huán)境中運(yùn)行,以此來(lái)提高性能。 另一個(gè)使用半虛擬化的原因是早期的體系結(jié)構(gòu)并不是為虛擬化而設(shè)計(jì)的,存在虛擬化漏洞。因?yàn)樘摂M化要求所有敏感指令或訪問(wèn)敏感資源的指令都能被截獲模擬。對(duì)于存在虛擬化漏洞的體系結(jié)構(gòu),則需要通過(guò)半虛擬化的方案來(lái)填補(bǔ)漏洞。而今,大多數(shù)體系機(jī)構(gòu)都支持硬件輔助虛擬化,包括Arm。這使得操作系統(tǒng)的核心部分無(wú)需修改也能獲得較好得性能。只有少數(shù)存儲(chǔ)和網(wǎng)絡(luò)相關(guān)的I/O設(shè)備仍然采用半虛擬化的方案來(lái)改善性能,這類(lèi)半虛擬化的方案如,virtio 和 Xen PV Bus。
1.4 虛擬機(jī)(VM)和虛擬CPU (vCPU)
有必要區(qū)分虛擬機(jī)(VM)和虛擬CPU(vCPU)。這有利于理解本文的后續(xù)部分。例如,一個(gè)內(nèi)存頁(yè)面可以分配給一個(gè)虛擬機(jī),因此所有屬于該VM的vCPUs都可以訪問(wèn)它。而一個(gè)虛擬中斷只是針對(duì)某個(gè)vCPU,因此只有該vCPU可以收到。虛擬機(jī)(VM)和虛擬CPU(vCPU)的關(guān)系如圖3所示。
圖3:VM vs vCPU 注意:ARM體系結(jié)構(gòu)定義了處理單元(Processing Element, PE)一詞,現(xiàn)代CPU可能包含多個(gè)內(nèi)核或線程,PE用來(lái)指代單一的執(zhí)行單元。同樣的這里的vCPU嚴(yán)格來(lái)說(shuō)應(yīng)該是vPE。
2 AArch64的虛擬化
對(duì)于ARMv8, Hypervisor運(yùn)行在EL2異常級(jí)別。只有運(yùn)行在EL2或更高異常級(jí)別的軟件才可以訪問(wèn)并配置各項(xiàng)虛擬化功能。
Stage 2轉(zhuǎn)換
EL1/0指令和寄存器訪問(wèn)
注入虛擬異常
安全狀態(tài)和非安全狀態(tài)下的異常級(jí)別及可運(yùn)行的軟件如圖4所示
圖4:AArch64的虛擬化 注意:安全狀態(tài)的EL2用灰色顯示是因?yàn)?,安全狀態(tài)的EL2并不總是可用,這是Armv8.4-A引入的特性。
2.1 Stage 2 轉(zhuǎn)換
什么是Stage 2 轉(zhuǎn)換
Stage 2 轉(zhuǎn)換允許Hypervisor控制虛擬機(jī)的內(nèi)存視圖。具體來(lái)說(shuō),其可以控制虛擬機(jī)是否可以訪問(wèn)特定的某一塊物理內(nèi)存,以及該內(nèi)存塊出現(xiàn)在虛擬機(jī)內(nèi)存空間的位置。這種能力對(duì)于虛擬機(jī)的隔離和沙箱功能來(lái)說(shuō)至關(guān)重要。這使得虛擬機(jī)只能看到分配給它自己的物理內(nèi)存。為了支持Stage 2 轉(zhuǎn)換, 需要增加一個(gè)頁(yè)表,我們稱(chēng)之為Stage 2頁(yè)表。操作系統(tǒng)控制的頁(yè)表轉(zhuǎn)換稱(chēng)之為stage 1轉(zhuǎn)換,負(fù)責(zé)將虛擬機(jī)視角的虛擬地址轉(zhuǎn)換為虛擬機(jī)視角的物理地址。而stage 2頁(yè)表由Hypervisor控制,負(fù)責(zé)將虛擬機(jī)視角的物理地址轉(zhuǎn)換為真實(shí)的物理地址。虛擬機(jī)視角的物理地址在Armv8中有特定的詞描述,叫中間物理地址(intermediate Physical Address, IPA)。 stage 2轉(zhuǎn)換表的格式和stage 1的類(lèi)似,但也有些屬性的處理不太一樣,例如,判斷內(nèi)存類(lèi)型 是normal 還是 device的信息被直接編碼進(jìn)了表里,而不是通過(guò)查詢(xún)MAIR_ELx寄存器。
圖5:地址轉(zhuǎn)換, VA to IPA to PA
VMID
每一個(gè)虛擬機(jī)都被分配一個(gè)ID號(hào),稱(chēng)之為VMID。這個(gè)ID號(hào)用于標(biāo)記某個(gè)特定的TLB項(xiàng)屬于哪一個(gè)VM。VMID使得不同的VM可以共享同一塊TLB緩存。VMID存儲(chǔ)在寄存器VTTBR_EL2中,可以是8或16比特,由VTCR_EL2.vs比特位控制,其中16比特的VMID支持是在armv8.1-A中擴(kuò)展的,是可選的。需注意,EL2和EL3的地址轉(zhuǎn)換不需要VMID標(biāo)記,因?yàn)樗鼈儾恍枰猻tage 2轉(zhuǎn)換。
VMID vs ASID
TLB項(xiàng)也可以用ASID(Address Space Identifier)標(biāo)記,每個(gè)應(yīng)用都被操作系統(tǒng)分配有一個(gè)ASID,所有屬于同一個(gè)應(yīng)用的TLB項(xiàng)都有相同的ASID。這使得不同應(yīng)用可以共享同一塊TLB緩存。每一個(gè)VM有它自己的ASID空間。例如兩個(gè)不同的VMs同時(shí)使用ASID 5,但指的是不同的東西。對(duì)于虛擬機(jī)而言,通常VMID會(huì)結(jié)合ASID同時(shí)使用。
屬性整合和覆蓋
stage 1 和 stage 2映射都包含屬性,例如存儲(chǔ)類(lèi)型,訪問(wèn)權(quán)限等。內(nèi)存管理單元(MMU)會(huì)將兩個(gè)階段的屬性整合成一個(gè)最終屬性,整合的原則是選擇更有限制的屬性。且看如下例子:
圖6:映射屬性整合 在上面的例子中,Device屬性比起Normal屬性更具限制性,因此最終結(jié)果是Device屬性。同樣的原理,如果你將順序調(diào)換一下也不會(huì)改變最終的屬性。 屬性整合在大多數(shù)情況下都可以工作。但有些時(shí)候,例如在VM的早期啟動(dòng)階段,Hypervisor希望改變默認(rèn)的行為,則可以通過(guò)如下寄存器比特來(lái)實(shí)現(xiàn)。
HCR_EL2.CD: 控制所有stage 1屬性為Non-cacheable。
HCR_EL2.DC:強(qiáng)制所有stage 1屬性為Normal,Write-Back Cacheable。
HCR_EL2.FWB (Armv8.4-A引入):使用stage 2屬性覆蓋stage 1屬性,而不是使用默認(rèn)的限制性整合原則。
模擬MMIO
與物理機(jī)器的物理地址空間類(lèi)似,VM的IPA地址空間包含了內(nèi)存與外圍設(shè)備兩種區(qū)域。如下圖所示
圖7:模擬MMIO VM使用外圍設(shè)備區(qū)域來(lái)訪問(wèn)其看到的物理外圍設(shè)備,這其中包含了直通設(shè)備和虛擬外圍設(shè)備。虛擬設(shè)備完全由Hypervisor模擬,如下圖所示
圖8:stage 2映射 一個(gè)直通設(shè)備被直接分配給VM并映射到IPA地址空間,這使得VM中的軟件可用直接訪問(wèn)真實(shí)的物理硬件。一個(gè)虛擬的外圍設(shè)備由Hypervisor模擬,其stage 2的轉(zhuǎn)換項(xiàng)被標(biāo)記為fault。雖然VM中的軟件看來(lái)其是直接與物理設(shè)備交互,但實(shí)際上這一訪問(wèn)會(huì)導(dǎo)致stage 2轉(zhuǎn)換fault,從而進(jìn)入相應(yīng)的異常處理程序由Hypervisor模擬。 為了模擬一個(gè)外圍設(shè)備,Hypervisor需要知道哪一個(gè)外圍設(shè)備被訪問(wèn),外圍設(shè)備的哪一個(gè)寄存器被訪問(wèn),是讀訪問(wèn)還是寫(xiě)訪問(wèn),訪問(wèn)長(zhǎng)度是多少,以及使用哪些寄存器來(lái)傳送數(shù)據(jù)。 當(dāng)處理stage 1 faults時(shí),F(xiàn)AR_ELx寄存器包含了觸發(fā)異常的虛擬地址。但虛擬地址不是給Hypervisor用的,Hypervisor通常不會(huì)知道客戶操作系統(tǒng)如何配置虛擬地址空間的映射。對(duì)于stage 2 faults,有一個(gè)專(zhuān)門(mén)的寄存器HPFAR_EL2,該寄存器會(huì)報(bào)告發(fā)生錯(cuò)誤的IPA地址。IPA地址空間由Hypervisor控制,因此可用利用此寄存器里的信息來(lái)進(jìn)行必要的模擬。 ESR_ELx寄存器用于報(bào)告發(fā)生異常的相關(guān)信息。當(dāng)loads或stores一個(gè)通用寄存器觸發(fā)stage 2 fault時(shí),相關(guān)異常信息由這些寄存器提供。這些信息包含了,訪問(wèn)的長(zhǎng)度,訪問(wèn)的原地址或目的地址。Hypervisor可以以此來(lái)判斷對(duì)虛擬外圍設(shè)備訪問(wèn)的權(quán)限。下圖展示了一個(gè)陷入(trapping) – 模擬(emulating)的訪問(wèn)過(guò)程。
圖9:外圍設(shè)備模擬
VM里的軟件嘗試訪問(wèn)虛擬外圍設(shè)備,這個(gè)例子當(dāng)中是虛擬UART的接收FIFO。
該訪問(wèn)被stage 2轉(zhuǎn)換block住,導(dǎo)致一個(gè)abort異常被路由到EL2。
異常處理程序查詢(xún)ESR_EL2關(guān)于異常的信息,如訪問(wèn)長(zhǎng)度,目的寄存器,是load還是store操作。
異常處理程序查詢(xún)HPFAR_EL2,取得發(fā)生abort的IPA地址。
Hypervisor通過(guò)ESR_EL2和HPFAR_EL2里的相關(guān)信息對(duì)相關(guān)虛擬外圍設(shè)備作模擬,模擬完成后通過(guò)ERET指令返回vCPU,并從發(fā)生異常的下一條指令繼續(xù)執(zhí)行。
系統(tǒng)內(nèi)存管理單元(System Memory Management Units, SMMUs)
到目前為止,我們只考慮了從處理器發(fā)起的各種訪問(wèn)。我們還需要考慮其他主設(shè)備如DMA控制器發(fā)起的訪問(wèn)。我們需要一種方法來(lái)擴(kuò)展stage 2映射以保護(hù)這些主設(shè)備的地址空間。如果一個(gè)DMA控制器沒(méi)有使用虛擬化,那它看起來(lái)應(yīng)該如下圖所示
圖10:沒(méi)有虛擬化的DMA訪問(wèn) DMA控制器通常由內(nèi)核驅(qū)動(dòng)編程控制。內(nèi)核驅(qū)動(dòng)會(huì)確保不違背操作系統(tǒng)層面的內(nèi)存保護(hù)原則,即一個(gè)應(yīng)用不能使用DMA訪問(wèn)其沒(méi)有權(quán)限訪問(wèn)的其他應(yīng)用的內(nèi)存。 下面讓我們考慮操作系統(tǒng)運(yùn)行在虛擬機(jī)中的場(chǎng)景。
圖11:虛擬化下沒(méi)有SMMU的DMA訪問(wèn) 在這個(gè)系統(tǒng)中,Hyperviosr通過(guò)stage 2映射來(lái)隔離不同VMs的地址空間。這是基于Hypervisor控制的stage 2映射表實(shí)現(xiàn)的。而驅(qū)動(dòng)則直接與DMA控制器交互,這會(huì)產(chǎn)生兩個(gè)問(wèn)題:
隔離:DMA控制器訪問(wèn)在虛擬機(jī)之間沒(méi)有了隔離,這破壞了虛擬機(jī)的沙箱功能。
地址空間:利用兩級(jí)映射轉(zhuǎn)換,使內(nèi)核看到的PAs實(shí)際上是IPAs。但DMA控制器看到的仍然是PAs。因此DMA控制器和內(nèi)核看到的是不同的地址空間,為了解決這個(gè)問(wèn)題,每當(dāng)VM與DMA控制器交互時(shí)就需要陷入到Hypervisor中做必要的轉(zhuǎn)換。這種處理方式是極其沒(méi)有效率的,且容易出錯(cuò)。
解決的辦法是將stage 2的機(jī)制推廣到DMA控制器。這么做的話,這些主設(shè)備控制器也需要一個(gè)MMU,Armv8稱(chēng)之為SMMU(通常也稱(chēng)為IOMMU)。
圖12:虛擬化下通過(guò)SMMU的DMA訪問(wèn) Hypervisor負(fù)責(zé)配置SMMU,以使DMA控制器看到的物理地址空間與kenrel看到的物理地址空間相同。這樣就能解決上述兩個(gè)問(wèn)題。 轉(zhuǎn)自:https://calinyara.github.io/technology/2019/11/03/armv8-virtualization.html 相關(guān)文章:
-
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119816 -
架構(gòu)
+關(guān)注
關(guān)注
1文章
506瀏覽量
25430 -
ARMv8
+關(guān)注
關(guān)注
1文章
35瀏覽量
14133
原文標(biāo)題:收藏:Arm v8架構(gòu)及虛擬化介紹
文章出處:【微信號(hào):架構(gòu)師技術(shù)聯(lián)盟,微信公眾號(hào):架構(gòu)師技術(shù)聯(lián)盟】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論