內核版本:linux-v5.9
架構:arm64
1 type1型和type2虛擬機管理器
在arm64架構中,共有EL3到EL0四個異常級別,EL3異常級別最高。通常操作系統(如linux)運行在EL1,應用程序運行在EL0,EL2則運行hypervisor管理程序。虛擬機管理器有type1型和type2型之分,kvm屬于type2型虛擬機管理器。
首先思考type1型和type2虛擬機管理器有什么相同之處,即同樣作為虛擬機管理器,它們都完成哪些工作。
- 虛擬機資源的管理:虛擬機地址空間的管理由虛擬機管理器統一管理;
- 虛擬機的調度和切換:虛擬機運行時VCPU需要進行調度和上下文切換;
- 虛擬設備的管理:虛擬機使用的虛擬設備即設備的中斷由虛擬機管理器統一管理。
知道了兩類虛擬機管理器都需要完成的工作后,再說明他們在完成上述工作時有何不同。type1型的虛擬機管理器在完成上述工作時,所有的行為都是在EL2完成的。而type2型的虛擬機管理器在完成上述工作時,大部分是在EL1完成的,即在EL1將虛擬機的運行時上下文準備好,而在EL2級別只實現模式切換,即將準備好的運行時上下文加載進寄存器。這里提到了模式切換,暫不描述。
然后再思考為什么會出現type1型和type2型在處理這些工作時存在不同的情況。解決這個問題后,再思考兩種類型的優劣,也許就是type1型和type2型虛擬機出現的初衷。type1型虛擬機管理器完成虛擬機管理器的工作都在EL2,因為自虛擬機管理器啟動到運行時,以及對資源的管理都是在EL2異常級別。type1型的架構圖如圖1.1所示。
如圖1.1所示,EL2運行的是虛擬機管理器(Hypervisor),EL1運行的是客戶機(Guest OS),層次分明。圖1.1中的Hypervisor一定程度上是一個運行在EL2異常級別的操作系統和虛擬化功能的組合(Host OS + Vitrulization)。在這樣的組織架構下,EL2有能力進行資源管理,因為它本身具有操作系統的功能,所以虛擬機管理器需要完成的工作都在EL2完成。而type1型虛擬機管理器的架構圖如圖1.2所示。
如圖1.2所示,EL2異常級別僅提供虛擬化功能,而對資源進行管理的Host OS在EL1運行。在這樣的組織架構下,自然在需要完成虛擬機管理器的工作時,需要到EL1的Host OS運行,在準備好Guest OS的運行時上下文后,切換至Guest OS運行。這里的Host OS具體就可以是開啟了kvm功能的linux,如圖1.3所示。
如圖1.3所示,開啟了kvm功能的linux充當的就是Host OS的角色,全權負責對系統資源,包括Guest OS的管理。type1型和type2型虛擬機管理器由于組織架構的不同,導致實現虛擬機管理器所需的工作時出現不同之處。那么這兩種類型的虛擬機管理器各有什么優劣。粗略的說是type1型效率更高,type2型效率低。而type2型可以復用已有的資源管理框架,如linux的內存管理、進程管理和設備驅動,type1型則需要自己實現或進行代理。type1型可以說是天生是為了管理虛擬機,type2型則可以說是為系統提供了虛擬化擴展和硬件加速。軟件系統生態也會影響兩類虛擬機管理器,linux有成熟的生態,例如開源的QEMU模擬器,設備驅動。所以兩類虛擬機管理器孰優孰劣,則要根據使用場景進行判斷。
通過一個情景來具體說明為何type1型效率高,而type2型效率低。假設虛擬機管理器通過地址映射為Guest OS配置了虛擬串口,然后Guest OS訪問該串口以向串口設備傳輸一個字符。type1型的訪問流程大致如圖1.4所示。
如圖1.4所示,Guest OS在訪問虛擬串口的時候會觸發一個EL1同步異常,并在EL2被捕獲。EL2獲得該異常后,根據異常信息模擬串口輸出,模擬完成后返回即可,其中異常信息通常包含觸發異常的地址、讀寫操作標識、讀寫的內容和長度等。而type2型的訪問大致流程如圖1.5所示。
圖1.5中的詳細內容暫不描述,此處僅用于type1型和type2型的對比。如圖1.5所示,Guest OS同樣是訪問虛擬串口。則需要更復雜的流程,經過多次異常級別的轉換。這個對比中同樣也說明了type2型的優勢,即能夠復用Host OS(linux)的機制,并且復用Host OS的軟件生態,使得Host OS和Host OS的軟件生態也獲得了虛擬化擴展和硬件加速能力。對type1型和type2型的討論到此為止,kvm場景為type2型虛擬機管理器,后文將著重描述type2型,并具體到kvm。