0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Armv8架構(gòu)及虛擬化介紹

架構(gòu)師技術(shù)聯(lián)盟 ? 來(lái)源:架構(gòu)師技術(shù)聯(lián)盟 ? 2023-04-16 10:45 ? 次閱讀

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)。

e23429ea-db3c-11ed-bfe3-dac502259ad0.jpg

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)核,比如linuxrtos。如果系統(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位通用寄存器。

e245ba70-db3c-11ed-bfe3-dac502259ad0.jpg

通用寄存器

(2)狀態(tài)寄存器

e252285a-db3c-11ed-bfe3-dac502259ad0.jpg

狀態(tài)寄存器

(3)特殊寄存器

e25d7520-db3c-11ed-bfe3-dac502259ad0.jpg

特殊寄存器

當(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。

e26a948a-db3c-11ed-bfe3-dac502259ad0.png

圖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)。

e2771818-db3c-11ed-bfe3-dac502259ad0.png

圖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所示。

e290292a-db3c-11ed-bfe3-dac502259ad0.png

圖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所示

e29e1454-db3c-11ed-bfe3-dac502259ad0.png

圖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寄存器。

e2b08f76-db3c-11ed-bfe3-dac502259ad0.png

圖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è)最終屬性,整合的原則是選擇更有限制的屬性。且看如下例子:

e2bf2f22-db3c-11ed-bfe3-dac502259ad0.png

圖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ū)域。如下圖所示

e2cec522-db3c-11ed-bfe3-dac502259ad0.png

圖7:模擬MMIO VM使用外圍設(shè)備區(qū)域來(lái)訪問(wèn)其看到的物理外圍設(shè)備,這其中包含了直通設(shè)備和虛擬外圍設(shè)備。虛擬設(shè)備完全由Hypervisor模擬,如下圖所示

e3243bb0-db3c-11ed-bfe3-dac502259ad0.png

圖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ò)程。

e3430de2-db3c-11ed-bfe3-dac502259ad0.png

圖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)該如下圖所示

e369c338-db3c-11ed-bfe3-dac502259ad0.png

圖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)景。

e3842340-db3c-11ed-bfe3-dac502259ad0.png

圖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)。

e39c6fd6-db3c-11ed-bfe3-dac502259ad0.png

圖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)文章:

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ARM公司公開(kāi)下一代ARM架構(gòu)技術(shù)細(xì)節(jié)

    ARM公司近日公開(kāi)了新的ARMv8架構(gòu)的技術(shù)細(xì)節(jié),這是首款包含64位指令集的ARM架構(gòu)。 ARMv8拓展了現(xiàn)有的32位ARMv7
    發(fā)表于 11-03 09:40 ?1593次閱讀

    ARM重新定義ARMv8架構(gòu)ARMv8架構(gòu)特性解說(shuō)

    本文從ARMv8-A產(chǎn)生的背景開(kāi)始,對(duì)它進(jìn)行一個(gè)簡(jiǎn)單的介紹,使大家從整體上,對(duì)ARMv8有一個(gè)簡(jiǎn)單的了解。
    的頭像 發(fā)表于 10-08 17:02 ?1w次閱讀
    ARM重新定義<b class='flag-5'>ARMv8</b>新<b class='flag-5'>架構(gòu)</b>,<b class='flag-5'>ARMv8</b>新<b class='flag-5'>架構(gòu)</b>特性解說(shuō)

    ARM-v8架構(gòu)分析

    拓展,如:TrustZone技術(shù)、虛擬技術(shù)及NEON advanced SIMD技術(shù),等。配合ARMv8架構(gòu)的推出,ARM正在努力確保一個(gè)強(qiáng)大的設(shè)計(jì)生態(tài)系統(tǒng)來(lái)支持64位指令集。ARM
    發(fā)表于 12-07 10:08

    基于ARMv7架構(gòu)的Cortex系列

    基于ARMv7架構(gòu)的Cortex系列由ARM公司在2006年推出,Cortex系列的推出滿足人們對(duì)性能日漸復(fù)雜的設(shè)計(jì)要求,根據(jù)不同需求,Cortex系列共三個(gè)不同的子系列...
    發(fā)表于 08-09 06:37

    ARMv8架構(gòu)資料分享

      隨著開(kāi)發(fā)工作逐漸遷移到 ARMv8 的 64 位平臺(tái),因此有必要盡快熟悉 ARMv8 架構(gòu)。ARMv8 與先前較為熟悉的 ARMv7
    發(fā)表于 03-21 14:50

    ARMv8架構(gòu)編程之內(nèi)存管理單元探索

    物理頁(yè)。正因?yàn)轫?yè)的大小為 4 KB,所以虛擬地址的低 12 位對(duì)應(yīng)于頁(yè)內(nèi)偏移量。虛擬地址的翻譯過(guò)程建立頁(yè)表是內(nèi)存管理的一個(gè)關(guān)鍵過(guò)程,后續(xù)用一個(gè)專(zhuān)題來(lái)仔細(xì)研究一下 ARMv8 下多級(jí)頁(yè)表的建立過(guò)程,下圖
    發(fā)表于 03-29 09:56

    ARMv8架構(gòu)的兩種執(zhí)行狀態(tài)分別是什么

    )和T32(thumb),兩種指令集ARMv8架構(gòu)中,增加了一些指令?傳統(tǒng)ARM的特權(quán)模式?通用寄存器位寬是32bit? 使用單一CPSR保存PE狀態(tài)?使用32bit的虛擬地址?支持協(xié)處理器
    發(fā)表于 04-06 10:49

    ARMv8架構(gòu)概述

    虛擬地址映射,也就是最大支持256TB的內(nèi)存管理。ARMv8的MMU支持4KB和64KB兩種page size。● 4KB and 4 levels => 48-bit VA● 64KB and 3
    發(fā)表于 05-13 10:31

    armv8架構(gòu)中Arch32切換到Arch64是如何運(yùn)作的

    各位大神,armv8架構(gòu)中,如果Arch32要去切換到Arch64,是如何運(yùn)作的?狀態(tài)會(huì)清空嗎?
    發(fā)表于 06-06 16:13

    NEON在armv8(arch64)下如何去使用呢

    主頻是跟arm的主頻一致嗎,我們之前使用的armv7架構(gòu)cpu,當(dāng)把a(bǔ)rm的主頻調(diào)高后,neon的計(jì)算速度也會(huì)變快但現(xiàn)在我們用armv8平臺(tái)的cpu,把a(bǔ)rm的主屏調(diào)高后,neon的計(jì)算速度沒(méi)有任何變化謝謝!
    發(fā)表于 09-08 11:34

    ARM推新品:ARMv8首次支援64位元指令集

    處理器授權(quán)大廠ARM于上周(10/27)公布最新處理器規(guī)格ARMv8架構(gòu),一舉將其產(chǎn)品線推入64位元市場(chǎng)。ARMv8ARMv7架構(gòu)為基礎(chǔ),
    發(fā)表于 11-01 09:32 ?1471次閱讀

    64位ARMv8架構(gòu)交易敲定 ARM助力Cavium進(jìn)軍新領(lǐng)域

    無(wú)晶圓網(wǎng)絡(luò)芯片公司Cavium宣布,計(jì)劃提供一個(gè)基于全定制內(nèi)核設(shè)計(jì)的的家用多核系統(tǒng)芯片,該芯片是由ARM公司基于ARMv8 64位指令集架構(gòu)基礎(chǔ)上設(shè)計(jì)和實(shí)現(xiàn)的。該公司表示,該芯片將針對(duì)“
    發(fā)表于 08-02 16:57 ?1478次閱讀

    TRACE32支持ARMv8架構(gòu)

      ARMv8架構(gòu)是首個(gè)包括64位執(zhí)行模式的ARM架構(gòu),允許處理器將64位執(zhí)行模式與32位執(zhí)行模式相結(jié)合。開(kāi)發(fā)該版本ARM指令系統(tǒng)的關(guān)鍵技術(shù)之一是將ARM處理器工藝的高能效優(yōu)勢(shì)融入64位計(jì)算,并獲得更大的可用
    發(fā)表于 09-12 19:01 ?11次下載

    從軟件開(kāi)發(fā)的角度概述ARMv8處理器架構(gòu)中的虛擬操作

    ARMv8處理器CPU 基于ARMv8的系統(tǒng)中的虛擬化工具在這些系統(tǒng)中起著特殊的作用,它由幾個(gè)組件組成,雖然ARMv7具有特殊的CPU模式來(lái)運(yùn)行虛擬
    發(fā)表于 10-13 20:00 ?832次閱讀
    從軟件開(kāi)發(fā)的角度概述<b class='flag-5'>ARMv8</b>處理器<b class='flag-5'>架構(gòu)</b>中的<b class='flag-5'>虛擬</b><b class='flag-5'>化</b>操作

    ARMv8處理器體系結(jié)構(gòu)中的虛擬功能

    基于ARMv8的系統(tǒng)中的虛擬設(shè)施在這些系統(tǒng)中扮演著特殊角色,并且由幾個(gè)組件組成。盡管ARMv7具有特殊的CPU模式來(lái)運(yùn)行虛擬機(jī)監(jiān)控程序作為
    發(fā)表于 05-13 10:48 ?2043次閱讀
    <b class='flag-5'>ARMv8</b>處理器體系結(jié)構(gòu)中的<b class='flag-5'>虛擬</b><b class='flag-5'>化</b>功能