2012-05-31 92 views
5

我正在爲VM的IO進行KVM優化。我讀過KVM代碼,通常所有的物理中斷都會導致VMexit進入KVM。然後主機的IDT將處理相應的物理中斷。我的問題是,KVM如何決定是否向客戶端注入虛擬中斷?在什麼情況下它會向客人注入虛擬中斷?KVM如何處理物理中斷?

由於

回答

1

我想你指的分配的設備中斷(而不是模擬的中斷或的virt-IO中斷不直接從物理設備轉發到客)。 對於指定設備的每個irq,調用request_threaded_irq,並在每次中斷時調用kvm_assigned_dev_thread。正如你所看到的那樣,kvm_set_irq被調用,並且如所描述的那樣,如果中斷被屏蔽,則發生唯一的合併。在x86中,由於TPR的原因,中斷可能被rflags.if,mov-SS屏蔽,不允許中斷被傳送,或者由於服務中斷具有更高的優先級。爲了不讓客人感到驚訝,KVM必須遵循架構定義。

2

在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

  • 這會導致VMEXIT
  • 管理程序/ KVM處理VMEXIT頁面錯誤
  • 它看穿VMCS控制結構VMEXIT的原因,發現有頁面錯誤。
  • 主機/ KVM負責內存虛擬化,所以它檢查是否缺頁是造成
    • ,因爲網頁沒有被分配到在這種情況下,它調用alloc_page在主機內核,並做了來賓VMENTRY恢復GUEST執行。
    • 或者映射已被GUEST操作系統刪除,在這種情況下,KVM使用VMCS控制結構作爲通信介質來注入虛擬中斷,導致GUEST內核處理頁面錯誤。

這是主機插入虛擬interupt的一個例子。當然,還有很多其他方式/理由這樣做。
在執行EVERY INSTRUCTION之後,您可以實際配置VMCS以使guest虛擬機執行VMEXIT,這可以使用MONITOR TRAP FLAG來完成。