我正在爲VM的IO進行KVM優化。我讀過KVM代碼,通常所有的物理中斷都會導致VMexit進入KVM。然後主機的IDT將處理相應的物理中斷。我的問題是,KVM如何決定是否向客戶端注入虛擬中斷?在什麼情況下它會向客人注入虛擬中斷?KVM如何處理物理中斷?
由於
我正在爲VM的IO進行KVM優化。我讀過KVM代碼,通常所有的物理中斷都會導致VMexit進入KVM。然後主機的IDT將處理相應的物理中斷。我的問題是,KVM如何決定是否向客戶端注入虛擬中斷?在什麼情況下它會向客人注入虛擬中斷?KVM如何處理物理中斷?
由於
我想你指的分配的設備中斷(而不是模擬的中斷或的virt-IO中斷不直接從物理設備轉發到客)。 對於指定設備的每個irq,調用request_threaded_irq,並在每次中斷時調用kvm_assigned_dev_thread。正如你所看到的那樣,kvm_set_irq被調用,並且如所描述的那樣,如果中斷被屏蔽,則發生唯一的合併。在x86中,由於TPR的原因,中斷可能被rflags.if,mov-SS屏蔽,不允許中斷被傳送,或者由於服務中斷具有更高的優先級。爲了不讓客人感到驚訝,KVM必須遵循架構定義。
在kvm的文檔中,講述了什麼時候可以注入虛擬interupt。繼承人的鏈接http://os1a.cs.columbia.edu/lxr/source/Documentation/kvm/api.txt
看看行號905
的結構kvm_run結構我想給它如何使VM behave.Use的cscope和搜索源代碼字符串request_interrupt_window控制到應用程序,你會明白kvm如何看到什麼時候進入guest虛擬機以注入一個interupt。還要經過api.txt文件,這是非常有用的。
乾杯
EDITED
這裏的,注射interupts到客戶主機的一個例子。
假設有一個在來賓VM
這是主機插入虛擬interupt的一個例子。當然,還有很多其他方式/理由這樣做。
在執行EVERY INSTRUCTION之後,您可以實際配置VMCS以使guest虛擬機執行VMEXIT,這可以使用MONITOR TRAP FLAG來完成。