io虛擬化實現的方式有很多種,有軟體模擬、半虛擬化、裝置直接分配、單根io虛擬化。
pci裝置直接分配
裝置直接分配 (device assignment)也稱為 device pass-through。就是將宿主機host中的物理 pci 裝置直接分配給客戶機guest使用,虛擬機器獨佔這個pci裝置。在guest進行對應的io操作時,避免 了vm exit 陷入vmm 中,極大提高了效能。
在intel平台上的device assignment技術是vt-d(intel virtualization technology for directed i/o),是在vt-x的基礎上對硬體輔助虛擬化的擴充套件。
下圖(來自intel《vt-directed-io-spec》)是軟體模擬io虛擬化和intel的vt-d的對比原理圖:
pci裝置直接分配實踐
下面的例子是把host主機中個乙個網絡卡透傳給虛擬機器使用。
(在intel平台上要開啟vt-d,核心要設定intel_iommu=on。)
1.在host上檢視網絡卡資訊
# lspci2.把pci裝置從host中分離00:19.0 ethernet controller: intel corporation ethernet connection i217-lm (rev 04
)04:00.0 ethernet controller: intel corporation 82541pi gigabit ethernet controller (rev 05
)# ls /sys/bus/pci/devices/0000\:04\:00.0/net/eth1
# cat /sys/class/net/eth1/address
90:e2:ba:9f:7c:5a
# virsh nodedev-list3.把pci裝置分配給虛擬機器pci_0000_04_00_0
# virsh nodedev-dettach pci_0000_04_00_0
device pci_0000_04_00_0 detached
虛擬機器xml:
'4.進入虛擬機器檢視pci是否進入subsystem
' type='
pci' managed='
yes'>
'0x0000
' bus='
0x04
' slot='
0x00
' function='
0x0'/>
'pci
' domain='
0x0000
' bus='
0x00
' slot='
0x10
' function='
0x0'/>
# lspci可以看出虛擬機器中的網絡卡就是原來host中的網絡卡。並且此時在host的/sys/class/net/中已經看不到這個網絡卡了。00:10.0 ethernet controller: intel corporation 82541pi gigabit ethernet controller (rev 05
)# cat /sys/class/net/eth1/address
90:e2:ba:9f:7c:5a
5.把pci裝置還給host:
# virsh nodedev-reattach pci_0000_04_00_0
虛擬化 IO虛擬化基本原理
本文話題 io虛擬化概述 裝置發現 訪問截獲 裝置模擬 裝置共享 基於軟體的io虛擬化 基於前端後端的io虛擬化 基於硬體的io虛擬化 從處理器的角度看,外設是通過一組i o資源 埠i o或者是mmio 來進行訪問的,所以裝置的相關虛擬化被稱為i o虛擬化。其思想就是 vmm截獲客戶作業系統對裝置的...
藍芽透傳實驗 USB鍵盤轉藍芽鍵盤的裝置
鍵盤可以算作pc上最古老的裝置了,它的出現使得人類可以用非常簡單的方法與電腦進行互動。同樣的,由於各種歷史原因,鍵盤也是pc上最複雜,相容性問題最多的裝置之一 類似的還有硬碟,不過從ide到sata的進化過程中,標準明確,相容性問題少多了 硬體部分arduino uno usb host shiel...
裝置I O之OVERLAPPED IO重疊
似乎在win32的programming中沒有這個概念呀?要討論這個問題就要追溯到對裝置i o的訪問中.在win32中,使用者不能象以前那樣直接對硬體進行訪問,使得這一層 對開發者而言是個 黑盒 而是提供了一組對應的api的介面.讓開發者 基於提供的介面進行開發,而把低層的訪問交給了driver或者...