真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

virtio驅(qū)動是如何同設(shè)備交互

這篇文章將為大家詳細講解有關(guān)virtio驅(qū)動是如何同設(shè)備交互 ,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

公司主營業(yè)務(wù):成都網(wǎng)站制作、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出青神免費做網(wǎng)站回饋大家。

irtio是對虛擬化環(huán)境下guest kernel中io操作的一種優(yōu)化。
首先需要說明的是,在內(nèi)核的角度來看,virtio設(shè)備及其driver,和其他設(shè)備及驅(qū)動一樣,都是普通的設(shè)備,并沒有什么特殊性。也就是說,內(nèi)核并不知道這種io優(yōu)化的存在。
virtio設(shè)備,在系統(tǒng)層面看,就是pci設(shè)備。但是,為了提高io效率,對io操作做出了優(yōu)化。
主要方案是:
1) 當(dāng)virtio設(shè)備輸出數(shù)據(jù)時,driver將數(shù)據(jù)送到buffer隊列中(從virtio網(wǎng)卡驅(qū)動的代碼來看,此操作無內(nèi)存拷貝,直接將數(shù)據(jù)所占的內(nèi)存 作為buffer添加到隊列中就完成了),然后通過io指令寫設(shè)備寄存器(vp_dev->ioaddr + VIRTIO_PCI_QUEUE_NOTIFY),以通知虛擬機系統(tǒng)(kvm+qemu)。虛擬機系統(tǒng)捕獲了io指令,就得到了通知,從buffer隊 列中獲取設(shè)備輸出的數(shù)據(jù)。

2) 當(dāng)需要向virtio設(shè)備輸入數(shù)據(jù)時,虛擬機系統(tǒng)將數(shù)據(jù)送到buffer隊列中,然后觸發(fā)設(shè)備中斷。driver收到中斷后,直接從隊列中取出數(shù)據(jù)即可 (從virtio網(wǎng)卡驅(qū)動的代碼來看,隊列中的數(shù)據(jù)已經(jīng)不需要再進行內(nèi)存拷貝,隊列中的數(shù)據(jù)已經(jīng)是sk_buff結(jié)構(gòu)了)。

從上面的機制來看,virtio并不是完全沒有了io操作。例如,設(shè)備輸出數(shù)據(jù)時,在將數(shù)據(jù)送入buffer隊列后,還是執(zhí)行了io操作,以通知虛擬機系統(tǒng)。但是,這個io操作,并不是將輸出數(shù)據(jù)寫入設(shè)備,而是將數(shù)據(jù)已入隊這件事,寫入設(shè)備。


以上是virtio的大體原理。下面來看看virtio的設(shè)計思路。
大體分如下4個層次。


一、buffer隊列


既然virtio通過buffer隊列實現(xiàn)設(shè)備輸入輸出。那么,如果每一種設(shè)備都來實現(xiàn)一下buffer隊列,不是浪費么?沒錯,virtio考慮到這個 共性需求,因此就實現(xiàn)一個共同的buffer隊列模塊——virtio_ring(一個環(huán)型隊列)。但是,如果哪天buffer隊列的實現(xiàn),需要重新設(shè)計 怎么辦?考慮到這一點,再對buffer隊列的操作包裝出一個抽象層——struct virtqueue_ops。每一種buffer隊列的實現(xiàn),只要提供一個virtqueue_ops結(jié)構(gòu)變量給用戶使用即可。這就實現(xiàn)了隊列操作與隊列 實現(xiàn)的解耦。
struct virtqueue_ops 
{
int (*add_buf)(struct virtqueue *vq,
      struct scatterlist sg[],
      unsigned int out_num,
      unsigned int in_num,
      void *data);


void (*kick)(struct virtqueue *vq);


void *(*get_buf)(struct virtqueue *vq, unsigned int *len);


void (*disable_cb)(struct virtqueue *vq);
bool (*enable_cb)(struct virtqueue *vq);
};




二、pci層
每一個virtio設(shè)備(例如:塊設(shè)備或網(wǎng)卡),在系統(tǒng)層面看來,都是一個pci設(shè)備。這些設(shè)備之間,有共性部分,也有差異部分。
1)共性部分:這些設(shè)備都需要掛接相應(yīng)的buffer隊列操作virtqueue_ops,都需要申請若干個buffer隊列,當(dāng)執(zhí)行io輸出時,需要向 隊列寫入數(shù)據(jù);都需要執(zhí)行pci_iomap將設(shè)備配置寄存器區(qū)間映射到內(nèi)存區(qū)間;都需要設(shè)置中斷處理;等中斷來了,都需要從隊列讀出數(shù)據(jù),并通知虛擬機 系統(tǒng),數(shù)據(jù)已入隊。
2) 差異部分:設(shè)備中系統(tǒng)中,如何與業(yè)務(wù)關(guān)聯(lián)起來。各個設(shè)備不相同。例如,網(wǎng)卡在內(nèi)核中是一個net_device,與協(xié)議棧系統(tǒng)關(guān)聯(lián)起來。同時,向隊列中寫入什么數(shù)據(jù),數(shù)據(jù)的含義如何,各個設(shè)備不相同。隊列中來了數(shù)據(jù),是什么含義,如何處理,各個設(shè)備不相同。


如果每個virtio設(shè)備都完整實現(xiàn)自己的功能,又會形成浪費。
針對這個現(xiàn)象,virtio又設(shè)計了virtio_pci模塊,以處理所有virtio設(shè)備的共性部分。這樣一來,所有的virtio設(shè)備,在系統(tǒng)層面看來,都是一個pci設(shè)備,其設(shè)備驅(qū)動都是virtio_pci。
但是,virtio_pci并不能完整的驅(qū)動任何一個設(shè)備。因此,virtio_pci在probe(接管)每一個設(shè)備時,根據(jù)每個pci設(shè)備的 subsystem vendor/device id來識別出這具體是哪一種virtio設(shè)備,然后相應(yīng)的向內(nèi)核注冊一個virtio設(shè)備。當(dāng)然,在注冊virtio設(shè)備之前,virtio_pci驅(qū)動 已經(jīng)為此設(shè)備做了諸多共性的操作。同時,還為設(shè)備提供了各種操作的適配接口,例如,一些常用的pci設(shè)備操作,還有申請buffer隊列的操作。這些操 作,都通過virtio_config_ops結(jié)構(gòu)變量來適配。

三、virtio驅(qū)動
這里講virtio驅(qū)動,指的是具體的各個設(shè)備的驅(qū)動了。例如,網(wǎng)卡或塊設(shè)備。有了前面所述的各模塊的工作,virtio各個設(shè)備的驅(qū)動實現(xiàn),就相對簡單了。大體來說,除了完成本設(shè)備特有的功能以外,剩下的基本就是buffer隊列相關(guān)操作了。
那就是申請幾個隊列,并提供相應(yīng)的回調(diào)函數(shù)。有數(shù)據(jù)要輸出,往隊列中送就行了。隊列來數(shù)據(jù)了,自然會有中斷產(chǎn)生,中斷處理中,自然會觸發(fā)回調(diào)來處理。

四、virtio_bus
內(nèi)核中的各種對象,總是有秩序的。為了管理每種具體的virtio驅(qū)動及每個具體的virtio設(shè)備,干脆搞了一個virtio_bus出來。當(dāng)然,這個 bus并不存在實際的硬件電路,純粹起個管理與適配作用。就這個管理與適配功能而言,他和pci總線是相似的。全部的virtio driver與virtio device,在virtio_bus中都能夠找到。每當(dāng)有新的virtio driver或者virtio device注冊到系統(tǒng)中時,系統(tǒng)都會執(zhí)行一次設(shè)備與驅(qū)動的匹配操作。

關(guān)于virtio驅(qū)動是如何同設(shè)備交互 就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


分享文章:virtio驅(qū)動是如何同設(shè)備交互
網(wǎng)站鏈接:http://weahome.cn/article/jhshgg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部