主要研究VFIO在虛擬化中的應(yīng)用,但VFIO的應(yīng)用不止于虛擬化。
VFIO的全稱是Virtual Function IO,但這個(gè)名字并不能反應(yīng)它的特點(diǎn),以下兩個(gè)假名字更能反應(yīng)VFIO的特點(diǎn):
Very Fast IO
由于VFIO是將設(shè)備直接透傳給虛擬機(jī),所以Guest中與該設(shè)備相關(guān)的IO性能會(huì)大幅提高,接近native性能。
Versatile Framework for userspace IO
這個(gè)名字反映了VFIO的功能,即能夠?qū)evice安全地映射到用戶空間,使用戶能夠?qū)evice進(jìn)行操作。
研究目的
研究利用-device vfio-pci的方式將PCI透傳到虛擬機(jī)中后,在虛擬機(jī)中訪問PCI設(shè)備的配置空間,MMIO寄存器,IO Port的流程是怎樣的。
VFIO原理
VFIO把設(shè)備通過IOMMU映射的DMA物理內(nèi)存地址映射到用戶態(tài)中,讓用戶態(tài)程序可以自行操縱數(shù)據(jù)的傳輸,還可以自行注冊中斷處理函數(shù),從而在用戶態(tài)下實(shí)現(xiàn)設(shè)備的驅(qū)動(dòng)程序。
因此VFIO的基礎(chǔ)是IOMMU.
IOMMU
基礎(chǔ)功能
地址翻譯
IOMMU可以將能直接訪問memory的IO總線(DMA–capable)連接到RAM中。
與傳統(tǒng)的MMU功能類似,MMU能將CPU使用的虛擬地址轉(zhuǎn)化為物理地址,而IOMMU能將device使用的虛擬地址(也稱為設(shè)備地址或者IO地址)轉(zhuǎn)化為物理地址。
如果沒有IOMMU,DMA也能直接訪問RAM中的內(nèi)容,但是讓DMA沒有限制地訪問RAM是一件很危險(xiǎn)的事情,而IOMMU能夠?qū)@個(gè)過程加以限制,當(dāng)DMA訪問的地址合法時(shí),IOMMU才返回正確的數(shù)據(jù)。
硬件中斷重映射
除了翻譯地址的功能,IOMMU還能對(duì)硬件中斷進(jìn)行重映射,達(dá)到屏蔽部分中斷,或自定義中斷處理函數(shù)的目的。
設(shè)備隔離
基于地址翻譯和硬件中斷重映射兩大功能,IOMMU就具有了隔離設(shè)備的能力,這提高了設(shè)備訪問RAM時(shí)和設(shè)備發(fā)出中斷時(shí)的安全性。
除了將單個(gè)設(shè)備隔離的功能外,IOMMU還能隔離一組設(shè)備,如隔離PCI橋上的幾個(gè)設(shè)備,所以IOMMU還有一個(gè)概念,叫做IOMMU_GROUP, 代表一組被隔離的設(shè)備的集合。
通過把host的device和對(duì)應(yīng)driver解綁,然后綁定在VFIO的driver上,就會(huì)在/dev/vfio/目錄下出現(xiàn)一個(gè)group,這個(gè)group就是IOMMU_GROUP號(hào),如果需要在該group上使用VFIO,需要將該group下的所有device與其對(duì)應(yīng)的驅(qū)動(dòng)解綁。
VFIO Container
在IOMMU_GROUP的基礎(chǔ)上,VFIO封裝了一層Container Class,Container的作用是,當(dāng)我們想在不同的IOMMU_GROUP之間共享TLB和page tables(用于地址翻譯的頁表)時(shí),就將這些group放到同一個(gè)container中,因此Container可以看做是IOMMU_GROUP的集合。
虛擬化中VFIO的應(yīng)用
這里演示一個(gè)將網(wǎng)卡設(shè)備利用VFIO透傳到虛擬機(jī)中的例子。需要注意的是,利用VFIO將PCI設(shè)備透傳到虛擬機(jī)之后,Host將無法使用該設(shè)備。
虛擬機(jī)默認(rèn)網(wǎng)卡
首先利用默認(rèn)qemu選項(xiàng)啟動(dòng)虛擬機(jī)后,查看lspci的輸出,看看虛擬機(jī)默認(rèn)使用的網(wǎng)卡是什么?
可以看到虛擬機(jī)默認(rèn)的網(wǎng)卡是Intel的82540EM,是由Qemu-kvm軟件模擬出來的一款網(wǎng)卡。
將Host的PCI網(wǎng)卡透傳到虛擬機(jī)
首先在Host上使用lspci查看擁有的PCI網(wǎng)卡型號(hào),可以看到Realtek的一款網(wǎng)卡,該網(wǎng)卡的PCI標(biāo)記為06:00.0.
要使用VFIO,必須在Linux啟動(dòng)時(shí)添加啟動(dòng)項(xiàng)intel_iommu=on,因?yàn)閂FIO的底層依賴IOMMU.
加載VFIO-PCI module
sudo modprobe vfio-pci
如果加載成功,可以在dmesg中看到相關(guān)log.
查看網(wǎng)卡所在的IOMMU Group
$ readlink /sys/bus/pci/devices/000000.0/iommu_group.。/.。/.。/.。/kernel/iommu_groups/3
可以看到該Realtek網(wǎng)卡位于iommu_group的group3.
查看設(shè)備所在iommu_group的所有設(shè)備
$ ls /sys/bus/pci/devices/000000.0/iommu_group/devices/000005.0 000005.1 000000.0
可以看到在iommu_group3中,除了該Realtek網(wǎng)卡,還有2個(gè)設(shè)備。
將設(shè)備與對(duì)應(yīng)的驅(qū)動(dòng)解綁
為了將設(shè)備透傳到虛擬機(jī)中,需要將設(shè)備與其對(duì)應(yīng)的驅(qū)動(dòng)解綁,這樣該設(shè)備就可以使用VFIO的驅(qū)動(dòng)了。注意,不僅要將要透傳的設(shè)備解綁,還要將與設(shè)備同iommu_group的設(shè)備都解綁,才能透傳成功。
$ echo 000000.0 | sudo tee /sys/bus/pci/devices/000000.0/driver/unbind000000.0$ echo 000005.0 | sudo tee /sys/bus/pci/devices/000005.0/driver/unbind000005.0 $ echo 000005.1 sudo tee /sys/bus/pci/devices/000005.1/driver/unbind000005.1
查看設(shè)備的Vendor和DeviceID
$ lspci -n -s 06:00.0 06:00.0 0200: 10ec:8168 (rev 15)
可以看到該Realtek網(wǎng)卡的Vendor為10ec,DeviceID為8168.
將設(shè)備綁定到vfio-pci module
$ echo 10ec 8168 | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id10ec 8168
可以通過ls /dev/vfio查看是否綁定成功,如果綁定成功,/dev/vfio目錄下會(huì)出現(xiàn)該device所屬的iommu_group號(hào)。
這里的3就是我們要透傳的Realtek網(wǎng)卡所在的iommu_group號(hào)。
啟動(dòng)虛擬機(jī)
$ sudo x86_64-softmmu/qemu-system-x86_64 -m 4096 -smp 4 -hda ~/ewan/Workspace/img/Ubuntu18.04_loop.img-enable-kvm -cpu host -device vfio-pci,host=06:00.0
這里我使用的是從源碼編譯的qemu,但是從apt-get安裝的的qemu也是可以的。
進(jìn)入guest之后運(yùn)行l(wèi)spci,可以看到相比之前的PCI設(shè)備,多了一個(gè)Realtek網(wǎng)卡,這個(gè)網(wǎng)卡和host上的信息一模一樣,證明將網(wǎng)卡透傳到Guest成功!。
編輯:lyn
-
dma
+關(guān)注
關(guān)注
3文章
566瀏覽量
100972 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
946瀏覽量
28436 -
guest
+關(guān)注
關(guān)注
0文章
3瀏覽量
3262
原文標(biāo)題:VFIO(Virtual Function IO)研究
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
國外物理服務(wù)器詳細(xì)解析
EtherCAT通訊協(xié)議詳細(xì)解析
硅谷云平臺(tái)詳細(xì)解析
多c段站群服務(wù)器詳細(xì)解析
衍射級(jí)次偏振態(tài)的研究
【教程】DNS域名解析服務(wù)systemd-resolved使用指南
![【教程】DNS域名<b class='flag-5'>解析</b>服務(wù)systemd-resolved使用指南](https://file.elecfans.com/web2/M00/3E/6A/pYYBAGJhBGGAGyDYAACBPQuBZQI711.png)
衍射級(jí)次偏振態(tài)的研究
衍射級(jí)次偏振態(tài)的研究
4G模組Air780E的LuatOS開發(fā)之位運(yùn)算(bit)示例
![4G模組Air780E的LuatOS開發(fā)之位運(yùn)算(bit)示例](https://file1.elecfans.com/web3/M00/00/93/wKgZPGdKqNaAUn-mAALoicuQvpA378.png)
TSMI252012PMX-3R3MT功率電感詳細(xì)解析
![TSMI252012PMX-3R3MT功率電感<b class='flag-5'>詳細(xì)</b><b class='flag-5'>解析</b>](https://file1.elecfans.com/web1/M00/F4/1C/wKgZoWckS66ANscGABGx1zQQtaU688.png)
評(píng)論