基于b s結(jié)構(gòu)做的網(wǎng)站寧波seo軟件免費(fèi)課程
今天來看看虛擬中斷。
在一個非虛擬化的系統(tǒng)中,操作系統(tǒng)可以直接訪問GIC的寄存器,并且處理GIC的物理中斷接口(physical interrupt interface)。
但是在一個虛擬化的系統(tǒng)中,不是這樣。Guest OS并不知道它運(yùn)行在虛擬系統(tǒng)中,其接收的中斷來自GIC的虛擬中斷接口(virtual interrupt interface),但是OS本身并不知道;實際上是hypervisor接管了GIC的寄存器訪問和物理中斷接口,且hypervisor要負(fù)責(zé)產(chǎn)生虛擬中斷給Guest OS。
還有另外一種方式產(chǎn)生虛擬中斷,就是通過配置HCR_EL2,由內(nèi)部CPU核產(chǎn)生。在HCR_EL2里面有三個bit用來產(chǎn)生虛擬中斷:
- VI:設(shè)置該bit產(chǎn)生一個vIRQ
- VF:設(shè)置該bit產(chǎn)生一個vFIQ
- VSE:設(shè)置該bit產(chǎn)生一個vSerror
設(shè)置這些bit位就相當(dāng)于中斷控制器向vCPU發(fā)送中斷信號。生成的虛擬中斷受PSTATE掩蔽的影響,就像常規(guī)中斷一樣。這種機(jī)制使用起來很簡單,但缺點是hypervisor需要模擬中斷控制器的操作。換言之,軟件中的trap和emulate操作的開銷比較大,影響性能。
通過GIC就能避免上面的問題。GIC的物理CPU接口和虛擬CPU接口是等同的,區(qū)別只是一個發(fā)送物理中斷信號,另一個發(fā)送虛擬中斷信號。
來看一個例子:
- 外部中斷到達(dá)GIC;
- GIC產(chǎn)生一個物理IRQ給CPU;
- CPU轉(zhuǎn)換到EL2,hypervisor通過物理CPU接口讀取中斷;
- Hypervisor寫GIC的List寄存器產(chǎn)生虛擬中斷;
- GIC通過vIRQ發(fā)送中斷給CPU;
- CPU從EL2返回到EL1或者EL0;
- Guest OS讀取中斷,CPU執(zhí)行中斷處理程序。
在GICv4中,增加了對虛擬機(jī)直接注入虛擬中斷的支持。支持GICv4的IP是GIC-700.目前的虛擬中斷直接注入支持產(chǎn)生LPI,也就是說系統(tǒng)中要有ITS組件。
- Hypervisor會事先通過ITS命令配置ITS,重新映射虛擬core和物理core,虛擬中斷和物理中斷。
- 當(dāng)ITS接到消息中斷后,先要查表得到虛擬的INTID和虛擬PE,然后發(fā)給相應(yīng)的redistributor。
- Redistributor會去檢查內(nèi)部的寄存器,查看vPE是否在自己這邊注冊過。
- 如果注冊過,發(fā)虛擬中斷給vPE;
- 如果沒有,發(fā)中斷給hypervisor。
GIC-700也支持軟件通過將vPE和SGI-INTID寫入GITS_SGIR寄存器的方式來直接注入SGI。對于PPI和SPI的直接注入,目前尚不支持。
作者:老秦談芯