成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

虛擬化之Virtio-Net基礎(chǔ)篇

云計算 虛擬化
系統(tǒng)虛擬化技術(shù)是云計算最重要的核心技術(shù)之一。云計算平臺的資源池化,資源統(tǒng)一管理以及后續(xù)的動態(tài)分配都是基于系統(tǒng)虛擬化技術(shù)才得以實現(xiàn)的。在計算機系統(tǒng)中,主要有計算資源,存儲資源和網(wǎng)絡(luò)資源。

[[397021]]

virtio基礎(chǔ)篇

1. virtio的提出

系統(tǒng)虛擬化技術(shù)是云計算最重要的核心技術(shù)之一。云計算平臺的資源池化,資源統(tǒng)一管理以及后續(xù)的動態(tài)分配都是基于系統(tǒng)虛擬化技術(shù)才得以實現(xiàn)的。在計算機系統(tǒng)中,主要有計算資源,存儲資源和網(wǎng)絡(luò)資源。所以,系統(tǒng)虛擬化技術(shù)又可以細(xì)分為計算虛擬化,存儲虛擬化和網(wǎng)絡(luò)虛擬化。其中存儲設(shè)備和網(wǎng)絡(luò)設(shè)備一般都是以外設(shè)的形式和CPU通過I/O總線連接起來的,所以存儲虛擬化和網(wǎng)絡(luò)虛擬化又可以統(tǒng)一歸類為I/O虛擬化技術(shù)。我們這里介紹的virtio就是當(dāng)前最流行的I/O虛擬化技術(shù)。

I/O虛擬化技術(shù)可以分成兩種,一種是全虛擬化,另外一種是半虛擬化。

  • 全虛擬化:Guest OS不知道自己是虛擬機,所以也就不需要修改Guest OS的驅(qū)動程序。這樣Guest OS移植性好,但是虛擬機的I/O性能不高。
  • 半虛擬化:Guest OS知道自己是虛擬機,通過前端驅(qū)動和后端模擬設(shè)備互相配合實現(xiàn)IO虛擬化。和全虛擬化相比,半虛擬化技術(shù)可以幫助大幅度提高虛擬機I/O的性能。目前在云計算場景中廣泛使用的就是virtio在Linux上的具體實現(xiàn),而且virtio已經(jīng)成為虛擬化I/O技術(shù)的抽象接口規(guī)范和事實標(biāo)準(zhǔn),即使非Linux系統(tǒng)也可以適用。

2. virtio總體設(shè)計思想

virtio的總體設(shè)計思想可以概括為以下四點:直觀,高效,標(biāo)準(zhǔn)化,可擴展。

1) 直觀:virtio設(shè)備被設(shè)計的和之前的硬件設(shè)備一樣,支持常用的總線機制,比如中斷和DMA。這樣的設(shè)計使得驅(qū)動開發(fā)人員能夠快速上手,完成virtio設(shè)備驅(qū)動的開發(fā)。

2) 高效:virtio設(shè)備能支持單獨的輸入和輸出通道,在大量數(shù)據(jù)傳送的時候也能保持高效。

3) 標(biāo)準(zhǔn)化:對硬件架構(gòu)和操作系統(tǒng)環(huán)境沒有依賴,支持多種不同總線的傳輸機制(在virtio規(guī)范1.1中支持PCI, MMIO和Channel I/O總線。比如在那些不支持PCI的嵌入式設(shè)備還可以通過使用MMIO的方式使用virtio)。

4) 可擴展:在virtio設(shè)備發(fā)現(xiàn)和設(shè)備初始化的時候通過引入特性位(Feature Bits)標(biāo)識符實現(xiàn)動態(tài)適配的協(xié)商機制,能夠保證virtio前端驅(qū)動和后端模擬設(shè)備之間的兼容性。

3. virtio基本原理

接下來,我們以目前使用最廣泛的QEMU/KVM場景為例子進(jìn)一步解釋virtio的基本原理。虛擬機在物理主機上是一個QEMU的進(jìn)程,運行在用戶態(tài)。虛擬機內(nèi)部的virtio前端驅(qū)動所申請的緩存被映射到設(shè)備空間中,也在QEMU的地址空間里,這樣QEMU就可以通過共享內(nèi)存的方式對這些緩存進(jìn)行讀寫操作。通過這樣的方式,實現(xiàn)了virtio前端驅(qū)動程序(虛擬機Linux內(nèi)核的驅(qū)動)和后端模擬設(shè)備(QEMU后端設(shè)備模擬程序)之間數(shù)據(jù)傳輸?shù)牧銖?fù)制,進(jìn)而大幅度提高了虛擬機的I/O性能。

  1. virtio前后端在QEMU/KVM中的實現(xiàn)

virtio在虛QEMU擬機內(nèi)核中實現(xiàn)了前端驅(qū)動,在QEMU中實現(xiàn)了后端模擬設(shè)備,前后端之間通過虛擬隊列(Virtqueue)通信交換數(shù)據(jù)。針對不同的總線機制,virtio設(shè)備有不同的實現(xiàn)方式,因為PCI設(shè)備是最廣泛使用的設(shè)備,所以我們以virtio的PCI網(wǎng)卡為例子進(jìn)行講解。virtio-net前后端的實現(xiàn)如圖2所表示。

圖[1]. virtio-net前后端在QEMU/KVM中的實現(xiàn)

  • virtio設(shè)備發(fā)現(xiàn)和初始化

在虛擬機啟動之后,virtio前端驅(qū)動會把自己標(biāo)識成一個PCI設(shè)備,其中包括PCI廠家標(biāo)識符,PCI設(shè)備標(biāo)識符。這樣虛擬機的內(nèi)核可以基于這個標(biāo)識符判斷使用哪種驅(qū)動程序。因為虛擬機中的Linux內(nèi)核已經(jīng)包括了virtio驅(qū)動程序,所以virtio驅(qū)動會被調(diào)用去初始化這個virtio設(shè)備。除了完成PCI設(shè)備通常的初始化操作之外,virtio前端驅(qū)動還在初始化的過程中和后端設(shè)備模擬程序協(xié)商特性位(Feature Bits),并把最終的結(jié)果記錄在設(shè)備狀態(tài)(Device Status)中。具體的實現(xiàn)代碼可以參考內(nèi)核代碼在linux-3.10.0-957.1.3.el7/drivers/virtio/virtio.c中的virtio_dev_probe()函數(shù),如圖2所示。

圖2. virtio設(shè)備初始化,協(xié)商特性并最終設(shè)置設(shè)備狀態(tài)位

這里有兩個比較重要的數(shù)據(jù)結(jié)構(gòu)需要介紹一下。

  • 特性位(Feature Bits),用來表示設(shè)備所能支持的特性。在virtio設(shè)備初始化的時候,驅(qū)動會去讀取特性位,并且告訴設(shè)備哪些是它能接受特性。如果后端模擬設(shè)備升級了,使能了某個新特性,但是虛擬機里面的驅(qū)動還不能識別的話,那么兩者就是通過特性進(jìn)行協(xié)商。
  • 設(shè)備狀態(tài)位(Device Status),用來表示設(shè)備的當(dāng)前狀態(tài)。在virtio設(shè)備發(fā)現(xiàn),初始化和特性協(xié)商的過程中,都可以查看設(shè)備狀態(tài)位的方式查看virtio設(shè)備的狀態(tài)。比如,virtio_CONFIG_S_FEATURES_OK表示特性協(xié)商成功,virtio_CONFIG_S_DRIVER_OK表示驅(qū)動已經(jīng)配置成功。
  • virtio網(wǎng)卡發(fā)送數(shù)據(jù)處理過程

虛擬隊列(Virtqueue)是被用來在virtio前端驅(qū)動和virtio后端模擬設(shè)備之間雙向數(shù)據(jù)傳輸?shù)臄?shù)據(jù)結(jié)構(gòu)。每個virtio設(shè)備都維護(hù)著一個或者多個虛擬隊列。以virtio網(wǎng)絡(luò)設(shè)備為例,它至少維護(hù)兩個虛擬隊列,一個用來存儲要發(fā)送的數(shù)據(jù),一個用來存儲接收的收據(jù)。每個虛擬隊列數(shù)據(jù)結(jié)構(gòu)都由三部分組成,分別是descriptor table,available ring和used ring。

  • descriptor table用來描述一組緩存,是virtio前端驅(qū)動創(chuàng)建的。和緩存相關(guān)的信息主要是物理地址和長度;緩存數(shù)組的數(shù)量是有隊列大小(Queue Size)決定的;
  • available ring是給virtio前端驅(qū)動給virtio后端模擬設(shè)備傳輸數(shù)據(jù)時使用的,比如虛擬機用virtio-net設(shè)備發(fā)送數(shù)據(jù)的時候,所發(fā)送的數(shù)據(jù)就會先緩存在這里,再通知virtio后端模擬設(shè)備來讀取;也就是說available ring的緩存,只能讓前端寫,后端讀;
  • used ring是給virtio后端模擬設(shè)備給virtio前端驅(qū)動傳輸數(shù)據(jù)時使用的,比如virtio后端模擬設(shè)備從tap網(wǎng)絡(luò)接口收到數(shù)據(jù)之后,會把收到的數(shù)據(jù)緩存到這里,再通知virtio前端驅(qū)動程序;也就是說used ring的緩存,只能讓后端寫,前端讀;

圖3. Virtio規(guī)范中虛擬隊列的定義

圖4. used ring和available ring在virtio規(guī)范中的定義

下面我們以虛擬機發(fā)送數(shù)據(jù)為例,結(jié)合Linux 3.10和QEMU1.5的代碼實現(xiàn),詳細(xì)說明一下在QEMU/KVM場景下具體的實現(xiàn)過程。

virtio前端驅(qū)動填充數(shù)據(jù)包,并發(fā)出通知

QEMU虛擬機內(nèi)的virtio網(wǎng)卡驅(qū)動在初始化的時候,會和其他的網(wǎng)絡(luò)驅(qū)動一樣注冊發(fā)送函數(shù)xmit_skb()。具體的實現(xiàn)如圖5,6所示,所以虛擬機內(nèi)的virtio網(wǎng)卡發(fā)送數(shù)據(jù)的時候,會調(diào)用預(yù)先注冊的函數(shù)xmit_skb()。要發(fā)送的數(shù)據(jù)會調(diào)用virtqueue_add_outbuf()放置在available ring中。最終在virtqueue_add_outbuf()函數(shù)中,會調(diào)用virtqueue_kick()函數(shù),并進(jìn)一步調(diào)用virtqueue_notify()函數(shù)。在virtqueue_notify()函數(shù)中,如圖7所表示的virtio前端通過I/O寫寄存器的方式通知virtio后端模擬設(shè)備。這部分前端驅(qū)動的代碼在drivers/virtio/virtio_ring.c中。

圖5. virtio設(shè)備發(fā)送數(shù)據(jù)報文

圖6. virtio前端驅(qū)動通知QEMU

圖7. virtio通知函數(shù)最終會寫寄存器

KVM截獲I/O后通知后端

虛擬機virtio前端驅(qū)動程序發(fā)送通知的函數(shù)最終是執(zhí)行I/O寫指令。在QEMU/KVM環(huán)境中,虛擬機執(zhí)行I/O指令,會觸發(fā)VMExit。在KVM的VMExit代碼中會判斷退出的原因,I/O操作對應(yīng)的處理函數(shù)是handle_io(),具體的代碼在linux-3.10.0-957.1.3.el7/arch/x86/kvm/vmx.c,如圖8所示。最終再經(jīng)由KVM通知到QEMU中的virtio-net后端模擬設(shè)備,其中還涉及到KVM和eventfd等通信機制,因限于篇幅在這里不詳細(xì)描述了。

圖8. KVM中處理I/O操作導(dǎo)致的VMExit代碼

virtio后端模擬設(shè)備處理通知

如圖8所表示的,在接收到來自KVM的通知之后,QEMU后端設(shè)備模擬程序會調(diào)用virtio_queue_host_notifier_read()函數(shù),進(jìn)而調(diào)用預(yù)先注冊的函數(shù)virtio_ioprt_write()處理來自前端驅(qū)動的I/O寫操作。在接收到前端發(fā)來的通知之后,會調(diào)用virtio_queue_notify()函數(shù)進(jìn)行處理。在接收網(wǎng)絡(luò)數(shù)據(jù)包的時候,virtio_queue_notify()會再進(jìn)一步調(diào)用virtio-net網(wǎng)絡(luò)設(shè)備注冊的數(shù)據(jù)包接收函數(shù)virtio_net_handle_rx()。如圖9所表示的,在qemu_flush_queued_packets()中,QEMU會把數(shù)據(jù)復(fù)制到對應(yīng)的隊列中(QEMU中對應(yīng)后端的不同tap都維護(hù)著不同的隊列),之后再調(diào)用qemu_notify_event()通知virtio前端,最終會調(diào)用kvm_set_irq()觸發(fā)vCPU的中斷的方式通知virtio前端。

圖9. virtio后端設(shè)備接收通知后的處理

圖10. virtio-net預(yù)先注冊的數(shù)據(jù)報接收函數(shù)

圖11. virtio后端設(shè)備處理前端發(fā)送的數(shù)據(jù)包

參考鏈接:

【1】Deep dive into Virtio-networking and vhost-net(https://www.redhat.com/en/blog/deep-dive-virtio-networking-and-vhost-net)

本文轉(zhuǎn)載自微信公眾號「Linux閱碼場」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Linux閱碼場公眾號。

孫雷,曾在聯(lián)想研究院和NEC研究院工作10年,任資深研究員,研發(fā)經(jīng)理。

負(fù)責(zé)云計算底層技術(shù),包括軟件定義網(wǎng)絡(luò)(SDN),云網(wǎng)絡(luò)(OpenStack),

數(shù)據(jù)面加速等等。

2020年起開始創(chuàng)業(yè),北京守志科技有限公司創(chuàng)始人。

 

責(zé)任編輯:武曉燕 來源: Linux閱碼場
相關(guān)推薦

2021-02-14 16:49:22

Linux虛擬化Virtio

2025-02-05 11:43:28

2013-05-15 14:32:09

虛擬化數(shù)據(jù)復(fù)制

2020-11-25 10:55:56

云計算

2013-05-28 17:30:07

2021-09-06 06:45:06

WebpackMindMasterEntry

2009-11-06 16:48:03

WCF簡介

2021-05-07 06:42:51

Vhost-NetLinux虛擬化

2020-03-10 18:30:06

GPU虛擬化FPGA

2010-05-27 17:41:09

2018-05-08 15:16:59

內(nèi)存虛擬化處理器

2018-04-17 15:03:40

CPU虛擬化半虛擬化

2012-10-29 13:52:51

應(yīng)用虛擬化

2009-03-24 18:26:58

Vmwareesx服務(wù)器虛擬化

2012-06-06 09:36:28

服務(wù)器虛擬化

2009-04-14 19:22:51

Vmware服務(wù)器虛擬化虛擬化

2009-09-21 15:11:54

虛擬化基礎(chǔ)知識

2009-08-13 16:22:18

ASP.NET性能優(yōu)化

2022-03-28 09:31:58

for循環(huán)語句

2011-01-18 10:00:59

Linux磁盤分區(qū)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品爱久久久久久久 | 久久久毛片| 免费视频一区二区 | 尹人av| 男女精品久久 | 色综合色综合色综合 | 日本a网站 | 黄色高清视频 | 午夜视频在线免费观看 | 超碰欧美 | 国产在线精品一区 | 国产免费一区二区 | 人人干人人爽 | 久久久久9999亚洲精品 | 91精品无人区卡一卡二卡三 | 日日碰碰| 一区二区中文字幕 | 国产成人久久精品一区二区三区 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 九九热在线视频免费观看 | 国产精品中文字幕一区二区三区 | 亚洲午夜精品一区二区三区 | 国产亚洲一级 | 北条麻妃一区二区三区在线视频 | 精品欧美一区二区三区精品久久 | 成人精品免费视频 | 91精品国产乱码久久久久久久久 | 色综合99 | 久久国产成人午夜av影院武则天 | 亚洲成人黄色 | 亚洲高清在线 | 91激情视频| 成人激情视频 | 国产激情91久久精品导航 | 国产精品国产三级国产aⅴ浪潮 | 欧美成人在线免费 | 国产在线精品一区二区三区 | 美女一级a毛片免费观看97 | 国产精品精品久久久 | 中文字幕国产视频 | 国产成人免费视频网站视频社区 |