虛擬化技術(VT) 之 CPU中斷虛擬化

中斷虛擬化
---------------------------------------------------
物理CPU外部中斷流程:

- I/O設備通過I/O APIC 或PIC 發出中斷請求
- 中斷請求經由PCI總線發送到系統總線, 最後目標CPU的Local APIC 接收中斷
- 最後判斷是否處理中斷

虛擬CPU的模疑流程:
- 每個VCPU有對應的虛擬Local APIC用於接收中斷, 及虛擬I/O APIC, 虛擬PIC 用於發送中斷(由VMM維護)
- 虛擬設備調用 I/O APIC發送中斷, 挑選出目標的虛擬Local APIC
- Local APIC 利用事件注入,將其注入到相應的VCPU


虛擬PIC
---------------------------------
IA-32 PIC的ICW1~4 和OCW1~3 都是通過I/O 端口訪問, 即I/O操作, 那vt-x 可以很容易實現虛擬化
具體而言,這些接口是通過I/O端口 0x20 0x21 0xA0 0xA1 來訪問, 因此VMM可以設置VMCS I/O Bitmap相應的位, 使客戶機訪問端口時陷入vmm

陷入VMM後, 按照PIC硬件規範 對這些接口的定義,實現相應的邏輯
例如: OCW1 的功能是用於操作IMR寄存器, 控制指定中斷是否被屏蔽
因此VMM可以分析客戶機的OCW1命令, 判斷出是對哪個中斷進行屏蔽 或者解除屏蔽
VMM繼而在內部邏輯中記錄指定中斷是否被屏蔽, 那下一次虛擬中斷就不會被提交

物理上I/O設備與PIC 是電氣連線 , 但虛擬環境中由於設備和PIC都是虛擬的因而兩者的交互為直接的函數調用

虛擬I/O APIC
-------------------------------------------------
PIC是用於單核CPU的, 對於多核CPU 必須通過I/O APIC發送中斷 因此對於多CPU平台, 必須實現I/O APIC
與物理上類似, 虛擬I/O APIC 最後也是提交LAPIC 提交對應中斷


虛擬LAPIC
-------------------------------------------------
LAPIC 是CPU上一個內部部份, 負責接受中斷, 此外還提供了產生中斷的功能 例如Local APIC Timer Interrupt 和 多核之間的中斷IPI

虛擬Local APIC最主要的功能是向VCPU注入中斷,在VT-x幫助下, 虛擬Local APIC 可以借助VM-entry事件注入機制, 簡單實現


中斷採集
----------------------------------
中斷採集指 如何將虛擬機的設備中斷請求, 送入虛擬中斷控制器
虛擬機中有兩種情況會發生中斷:
(1) 來自軟件模疑的虛擬設備,例如串口 ->使用擬i/o apic 或 pic發送中斷
(2) 來自直接分配給客戶機的物理設備, 例如網卡 ->在VMM攔截中斷, 注入客戶機

物理CPU中斷採集過程:
1. 物理設備發生中斷, 假定設備的IRQ號為14, 對應中斷向量為0X41
2. CPU收到中斷, 執行標準的中斷處理流程, 如應答PIC, 中斷門中斷自動屏蔽
3. 最後CPU調用IDT中的0x41的ISR
4. 中斷處理函數對中斷進行檢測, 發現中斷是虛擬設備產生, 因此VMM調用虛擬中斷控制器的接口, 將中斷發送到VCPU的虛擬LAPIC, LAPIC會在合適時注入到客戶機, 由客戶機的操作系統自己處理
5. 在事件通知後, VMM會作其他處理, 如開中斷
6. VMM要負責轉換VCPU與物理CPU的IRQ轉換, 即他們的CPU管腳轉換 , 因為他們未必一樣 在初始化時會決定

Comments

Popular posts from this blog

Android Kernel Development - Kernel compilation and Hello World

How does Nested-Virtualization works?

Understanding ACPI and Device Tree