2017-09-26 85 views
0

我知道在virtio中,當訪客嘗試通知主機時,它會寫入設備io地址,這會導致vm退出並被管理程序捕獲。寫操作將發信號給一個eventfd結構體,然後喚醒睡眠的vhost_worker線程以處理virtqueue中的數據包。在virtio中,爲什麼guest通告程序和主機通知程序分別使用ioeventfd和irqfd?

當主機嘗試通知guest虛擬機時,它還使用eventfd觸發中斷注入並需要vm退出。

我的問題是:這兩個過程是否必須如此複雜?爲什麼我們不把一個eventfd結構放入virtio前端和後端之間的共享內存中?然後,如果一個訪客嘗試通知主機,它發信號給eventfd,那麼vhost_worker線程就會喚醒,看起來我們不需要vm-exit。對於來賓通知程序,可以用相同的方式完成。 爲什麼我們不能以這種簡單的方式通知?

回答

0

我的問題是:這兩個過程是否必須如此複雜?

簡答:因爲虛擬機很複雜。 :)

爲什麼我們不把一個eventfd結構放入virtio前端和後端之間的共享內存中。

順便說一句,eventfd不是結構。它只是一個整數,就像任何其他文件描述符一樣。

那麼,如果客人儘量通知主機,它標誌着在eventfd ...

它不能做到這一點。寫入eventfd將要求來賓內核在主機系統上進行系統調用,這不是有能力執行的。同樣,主機無法向由guest虛擬機內核創建的eventfd發送信號,因爲主機系統上不存在eventfd。

請牢記客人系統可能沒有運行Linux內核! virtio接口不是內核特定的;它旨在適用於任何虛擬化的操作系統。

相關問題