目錄
1.引入
2.TC4xx如何實現中斷虛擬化
3.小結
1.引入
其實不管內核怎么變,針對中斷虛擬化無非就是上面兩種,要么透傳給VM,要么由Hypervisor統一分發。汽車MCU虛擬化--對中斷虛擬化的思考(1)-CSDN博客
那么,作為車規MCU龍頭的英飛凌在TC4xx是如何考慮中斷虛擬化的呢?
2.TC4xx如何實現中斷虛擬化
TC4xx的內核為TC1.8,支持虛擬化功能,
每個核有三套獨立硬件資源HRHV、HRA、HRB,可支持最大8個VM,其中VM0運行hypervisor,VM1運行實時虛擬機,VM2-7運行其他VM,如下圖所示:
圖 15
- HRVH?– Hypervisor hardware resource(VM0)
- HRA?– Real time virtual machine hardware resource (VM1)
- HRB – Other virtual machine hardware resource (VM2-7)
上面提到,既然每個核支持最大8個VM,那么針對中斷的處理也有對應8套資源,這里我們回到開頭那幾個問題:
- 假設被分配到的VM此時還沒有運行怎么辦?
- 假設被分配到的VM此時正在處理中斷怎么辦?
首先來看圖說話,如下:
正常時間片為2000us,VM1占用500us,VM2占用1000us,VM3占用500us;
當VM2正在運行時,此時來了一個VM1的中斷,該中斷可以搶占VM2的時間,所以此時Hyperviosr需要將VM2的上下文保存,并切換到VM1,讓其完成ISR處理,然后恢復現場VM2繼續運行;
當VM3正在運行時,此時來了一個VM2的中斷,但它不可搶占VM3的時間,所以需要VM3運行完畢后切換到VM2的ISR進行處理,當然這里也擠壓了VM1的時間。
TC4xx是如何實現上述功能的呢?
在他們的設計中,每個中斷SRN都可以被拓展分配給1個VM;每個VM都有自己獨立的中斷狀態控制寄存器,包括當前VM中斷系統是否使能(簡稱VMIE)、當前VM的優先級(簡稱VMCP)、Pending中斷優先級(簡稱VMPIP);
為了實現運行VM在收到其他VM中斷時可被搶占,新增了搶占閾值寄存器,簡稱THR,好玩的就來了。
假設當前正在運行VM1,此時來了一個VM0的中斷,如果此時進來的Pending中斷優先級高于VM0配置的搶占閾值,同時高于VM0的當前優先級,那么Hypervisor就需要進行上下文切換,返回到VM0處理中斷,偽代碼如下:
if (INT.VM_coming == current VM)
{if ((VMPIP > VM_coming.VMCP) && (VM_coming.IE ){isr_routine();}else{Keep INT Pending}
}
else (INT.vm_coming == VM0 )
{if ((VMPIP > VM0.VMCP) && (VMPIP > VM0.THR){Switch to HRHV? ? isr_routine();}else{Keep INT Pending}
}
同理,如果當前VM0、VM1、VM2同時運行,也需要執行上述步驟,只是在VM2如果要搶占VM1時,需要在Hypervisor模式下首先保存VM1的上下文到HRA,然后切換到HRB,讓VM2進行中斷處理。
本質上,這樣的機制和透傳很像,只是我們可以通過Hypervisor配置每個VM的中斷狀態控制器寄存器、搶占閾值寄存器來實現中斷實時性的控制, 例如:
當我們把閾值配置為最大時,此時誰也無法進行搶占(Trap除外),只能得到時間片走完;如果閾值配置為最小,那就是直接透傳,這時候性能最優。
3.小結
上面幾節內容,記錄了我對于中斷虛擬化的思考過程。
其實在車載領域,特別是座艙域,儀表和中控是肯定要跑虛擬化的,目前用的最多是QNX Hypervisor,它關于CPU虛擬化、內存虛擬化、中斷虛擬化、虛擬機通信等的視線對于目前MCU上Hypervisor應該是有借鑒意義。