rust-vmm 學習(二)

eventfd

virtio中,guest和vhost經過evnetfd通知對方,見(Virtio ring and virtio-net)。html

REF:linux

Qemu-kvm的ioeventfd建立與觸發的大體流程git

virtio的eventfd機制淺析 ( ioctl(KVM_IOEVENTFD, struct kvm_ioeventfd)  )github

QEMU下的EVENTFD機制及源代碼分析 (huatong寫的,還寫了不少不錯的文章api

代碼分析(Rng爲例)

1. Rng的activate會啓動一個thread,run RngEpollHandler app

queue_evts 會經過activate 傳給 RngEpollHandler函數

2. RngEpollHandler run, 實現了epool QUEUE_AVAIL_EVENT 和 KILL_EVENT, 進行處理。ui

queue處理完成後,還會通知signal_used_queuethis

3. write_bar的時候會 activateurl

4. rust-vmm/kvm-ioctls 的VmFd經過register_ioevent註冊event

/// Registers an event to be signaled whenever a certain address is written to.
///
/// See the documentation for `KVM_IOEVENTFD`.

5.  ioeventfds 會遍歷queue_evts

6. vm初始化,add_virtio_pci_device register_ioevent

irqfd

VHOST經過irqfd通知guest。irqfd須要綁定一個eventfd.

rust-vmm/kvm-ioctls 的VmFd經過register_irqfd註冊irqfd

REF:

KVM VHOST中irqfd的使用

關於Linux虛擬化技術KVM的科普 科普二(KVM虛擬機代碼揭祕)  (一共寫了5個科普)

KVM中斷虛擬化主要依賴於VT-x技術,VT-x主要提供了兩種中斷事件機制,分別是中斷退出>
和中斷注入。

中斷退出:指虛擬機發生中斷時,主動式的客戶機發生VM-Exit,這樣可以在主機中實現對>
客戶機中斷的注入。

中斷注入:是指將中斷寫入VMCS對應的中斷信息位,來實現中斷的注入,當中斷完成後經過
讀取中斷的返回信息來分析中斷是否正確。

中斷注入的標誌性函數kvm_set_irq,是中斷注入的最開始。

Qemu-kvm模擬APIC Timer中斷

qemu-kvm 中斷虛擬化代碼分析

qemu-kvm 中斷虛擬化 (qemu-kvm 中斷虛擬化)

KVM中斷虛擬化淺析

kvm 中斷以及io虛擬化

KVM 中斷系統結構關係

qemu-kvm 中斷虛擬化代碼分析  

代碼分析(Rng爲例子)  

1. VirtioPciDevice 有個 interrupt_cb   field

2. assign_pin_irq 和 assign_msix 用來設置interrupt_cb 

assign_msix 注入中斷 (msi_cb)(InterruptParameters { msix: Some(entry) })

// In case the vector control register associated with the entry
// has its first bit set, this means the vector is masked and the
// device should not inject the interrupt.
// Instead, the Pending Bit Array table is updated to reflect there
// is a pending interrupt for this specific vector.

3. vm初始化,add_virtio_pci_device 是會 assign_pin_irq 和 assign_msix ,register_irqfd

4. msi_cb 和 irq_cb 的參數都是 InterruptParameters 類型,就是一個MsixTableEntry

signal_msi返回msi_cb

        irq_cb會調用service_irq來注入中斷

service_irq 調用rust-vmm/kvm-ioctls 的VmFd的signal_msi方法注入中斷

5. MsixConfig 實現了 read_table 和 write_table

MsixConfig包括table_entries, pba_entries, interrupt_cb和masked字段。

write_table會調用inject_msix_and_clear_pba注入中斷

5.1 write_config_register 也會調用 set_msg_ctl 注入中斷

6.  VirtioPciDevice new的時候會new msix_config 

7.  read_bar的時候會read_table, write_bar的時候會write_table

8. 對於VFIO來講,會設置中斷路由, update_msi_interrupt_routes(調用了set_kvm_routes)

Interrupt.update_msi -> VfioMsix.update  -> set_msg_ctl -> inject_msix_and_clear_pba

vmm-sys-util   

rust-vmm 的 vmm-sys-util 實現了不少utilities, 包括eventfd,ioctrlpollsignal.

實現了eventfd的new, write, read, clone等基本操做。

https://github.com/rust-vmm/vmm-sys-util/tree/master/src

 

FYI:

PBA (Pending Bit Array)

MSI-HOWTO.txt

相關文章
相關標籤/搜索