本申請(qǐng)涉及kvm虛擬化的技術(shù)領(lǐng)域,特別是涉及一種kvm虛擬化下處理i/o請(qǐng)求的方法和一種kvm虛擬化下處理i/o請(qǐng)求的裝置。
背景技術(shù):
虛擬機(jī)(virtualmachine)是指通過軟件模擬的、具有完整硬件系統(tǒng)功能的,運(yùn)行在一個(gè)完全隔離環(huán)境中的完整計(jì)算機(jī)系統(tǒng)。通過虛擬機(jī)軟件,可以在一臺(tái)物理計(jì)算機(jī)上模擬出一臺(tái)或多臺(tái)虛擬的計(jì)算機(jī)。虛擬機(jī)可以像真正的計(jì)算機(jī)那樣進(jìn)行工作,例如可以安裝操作系統(tǒng)、安裝應(yīng)用程序、訪問網(wǎng)絡(luò)資源等等。通常,虛擬機(jī)所在的物理計(jì)算機(jī)稱為宿主機(jī)(host),虛擬機(jī)自身稱為虛擬機(jī)(guest)。
kvm(kernel-basedvirtualmachine)即內(nèi)核模式的虛擬機(jī)的簡(jiǎn)稱,是一個(gè)開源的系統(tǒng)虛擬化模塊,它使用linux自身的調(diào)度器進(jìn)行管理,kvm的虛擬化需要硬件支持(如intelvt技術(shù)或者amdvt技術(shù))。
在現(xiàn)有技術(shù)中,在kvm虛擬化中,當(dāng)虛擬機(jī)發(fā)生i/o操作時(shí),支持vmx(virtualmachineextensions,是intel實(shí)現(xiàn)的x86指令集虛擬化擴(kuò)展)或者svm(securevirtualmachine,是amd實(shí)現(xiàn)的x86指令集的虛擬化擴(kuò)展)擴(kuò)展的cpu就會(huì)停止執(zhí)行,退出非根模式,進(jìn)入根模式執(zhí)行kvm代碼。kvm根據(jù)退出的原因得知虛擬機(jī)需要進(jìn)行i/o操作,于是從內(nèi)核態(tài)退出至用戶態(tài)的qemu進(jìn)程。
qemu進(jìn)程在初始化的時(shí)候映射了一塊kvm的空間,kvm在退出前把i/o請(qǐng)求放在其中,qemu從中拿到i/o請(qǐng)求之后將其分發(fā)給相應(yīng)的i/o模擬設(shè)備,i/o模擬設(shè)備執(zhí)行i/o模擬以后,qemu重新調(diào)用ioctl進(jìn)入kvm內(nèi)核態(tài),kvm稍作處理后進(jìn)入非根模式繼續(xù)運(yùn)行vcpu(虛擬處理器)。
然而,發(fā)明人在實(shí)施上述i/o請(qǐng)求的模擬過程中,發(fā)現(xiàn)如下問題:
1、模擬vcpu的時(shí)候qemu通過一個(gè)vcpu的ioctl進(jìn)入到kvm內(nèi)核態(tài),發(fā)生i/o請(qǐng)求的時(shí)候要退出內(nèi)核態(tài)回到qemu用戶態(tài)的vcpu線程 進(jìn)行模擬,因此,i/o模擬必須和cpu模擬在同一個(gè)進(jìn)程中,無法支持多個(gè)設(shè)備模擬進(jìn)程。
2、kvm已有的基于eventfd的i/o通知機(jī)制只能應(yīng)用于寫請(qǐng)求,且對(duì)所寫數(shù)據(jù)不關(guān)心,只關(guān)心所寫地址的場(chǎng)景,例如virtio設(shè)備的隊(duì)列通知寄存器寫訪問。這種機(jī)制不能傳遞i/o請(qǐng)求訪問的實(shí)際地址和長(zhǎng)度,也無法將讀操作得到的數(shù)據(jù)傳遞給kvm。
3、如果要在不同線程中實(shí)現(xiàn)cpu模擬和設(shè)備i/o模擬,現(xiàn)在缺乏一種機(jī)制來同步io模擬線程和vcpu線程。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問題,提出了本申請(qǐng)實(shí)施例以便提供一種克服上述問題或者至少部分地解決上述問題的一種kvm虛擬化下處理i/o請(qǐng)求的方法和相應(yīng)的一種kvm虛擬化下處理i/o請(qǐng)求的裝置。
為了解決上述問題,本申請(qǐng)公開了一種kvm虛擬化下處理i/o請(qǐng)求的方法,所述的方法包括:
通過內(nèi)核虛擬機(jī)kvm攔截虛擬機(jī)發(fā)出的i/o請(qǐng)求,確定與所述i/o請(qǐng)求對(duì)應(yīng)的i/o通道的信息,其中,所述i/o通道具有對(duì)應(yīng)的緩沖區(qū),所述i/o通道的信息包括eventfd文件描述符;
將所述i/o請(qǐng)求寫入對(duì)應(yīng)的i/o通道的緩沖區(qū)中;
采用所述eventfd通知所述i/o通道對(duì)應(yīng)的用戶態(tài)進(jìn)程;
在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd監(jiān)聽對(duì)應(yīng)的i/o通道的事件,并從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求,對(duì)所述i/o請(qǐng)求執(zhí)行i/o模擬,其中,所述用戶態(tài)進(jìn)程包括第一設(shè)備模擬進(jìn)程以及與所述第一設(shè)備模擬進(jìn)程獨(dú)立的第二設(shè)備模擬進(jìn)程。
優(yōu)選地,所述在所述通過內(nèi)核虛擬機(jī)kvm攔截虛擬機(jī)發(fā)出的i/o請(qǐng)求,確定與所述i/o請(qǐng)求對(duì)應(yīng)的i/o通道的信息的步驟之前,還包括:
采用所述第一設(shè)備模擬進(jìn)程創(chuàng)建虛擬機(jī),獲得所述虛擬機(jī)的文件描述符;
采用所述第一設(shè)備模擬進(jìn)程,基于所述虛擬機(jī)的文件描述符,創(chuàng)建虛擬處理器vcpu,獲得所述vcpu的文件描述符;
采用所述第二設(shè)備模擬進(jìn)程,創(chuàng)建eventfd文件描述符;
采用所述第二設(shè)備模擬進(jìn)程,基于所述虛擬機(jī)的文件描述符,創(chuàng)建i/o通道,并將所述i/o通道與所述eventfd文件描述符綁定,獲得所述i/o通道的文件描述符;
采用所述第二設(shè)備模擬進(jìn)程,對(duì)所述eventfd文件描述符進(jìn)行監(jiān)聽;
采用所述第二設(shè)備模擬進(jìn)程,基于所述i/o通道的文件描述符,為所述用戶態(tài)進(jìn)程映射所述i/o通道的緩沖區(qū);
采用所述第二設(shè)備模擬進(jìn)程,基于所述i/o通道的文件描述符,為所述i/o通道綁定i/o地址區(qū)間。
優(yōu)選地,所述i/o請(qǐng)求包括i/o地址,所述通過內(nèi)核虛擬機(jī)kvm攔截虛擬機(jī)發(fā)出的i/o請(qǐng)求,確定與所述i/o請(qǐng)求對(duì)應(yīng)的i/o通道的信息的步驟包括:
通過內(nèi)核虛擬機(jī)kvm及intelvt-d硬件技術(shù)攔截虛擬機(jī)的vcpu線程發(fā)出的i/o請(qǐng)求;
從所述i/o請(qǐng)求中提取對(duì)應(yīng)的i/o地址;
確定所述i/o地址所屬的i/o地址區(qū)間;
通過所述i/o地址區(qū)間確定對(duì)應(yīng)的i/o通道,并獲取所述i/o通道對(duì)應(yīng)的i/o通道的信息。
優(yōu)選地,所述i/o通道的地址區(qū)間包括多個(gè)i/o模擬設(shè)備的地址子區(qū)間;
所述在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd確定對(duì)應(yīng)的i/o通道,并從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求,對(duì)所述i/o請(qǐng)求執(zhí)行i/o模擬的步驟包括:
在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd確定對(duì)應(yīng)的i/o通道;
從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求;
依據(jù)所述i/o請(qǐng)求中的i/o地址確定對(duì)應(yīng)的i/o模擬設(shè)備;
將所述i/o請(qǐng)求分發(fā)至所述i/o模擬設(shè)備中,通過所述i/o模擬設(shè)備對(duì) 所述i/o請(qǐng)求進(jìn)行i/o模擬。
優(yōu)選地,在所述在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd確定對(duì)應(yīng)的i/o通道,并從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求,對(duì)所述i/o請(qǐng)求執(zhí)行i/o模擬的步驟之前,還包括:
掛起所述vcpu線程。
優(yōu)選地,在所述在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd確定對(duì)應(yīng)的i/o通道,并從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求,對(duì)所述i/o請(qǐng)求執(zhí)行i/o模擬的步驟之后,還包括:
喚醒所述掛起的vcpu線程。
優(yōu)選地,所述i/o請(qǐng)求包括讀請(qǐng)求,所述將所述i/o請(qǐng)求分發(fā)至所述i/o模擬設(shè)備中,通過所述i/o模擬設(shè)備對(duì)所述i/o請(qǐng)求進(jìn)行i/o模擬的步驟為:
將所述讀請(qǐng)求分發(fā)至所述i/o模擬設(shè)備中,通過所述i/o模擬設(shè)備將所述讀請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)寫入所述i/o通道的緩沖區(qū)中。
優(yōu)選地,所述方法還包括:
若所述i/o請(qǐng)求為讀請(qǐng)求,將所述讀請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)從緩沖區(qū)中讀出,讀入到vcpu結(jié)構(gòu)體中相應(yīng)的成員變量中;
對(duì)所述數(shù)據(jù)進(jìn)行對(duì)應(yīng)的模擬處理。
本申請(qǐng)還公開了一種kvm虛擬化下處理i/o請(qǐng)求的裝置,其特征在于,所述的裝置包括:
i/o通道確定模塊,用于通過內(nèi)核虛擬機(jī)kvm攔截虛擬機(jī)發(fā)出的i/o請(qǐng)求,確定與所述i/o請(qǐng)求對(duì)應(yīng)的i/o通道的信息,其中,所述i/o通道具有對(duì)應(yīng)的緩沖區(qū),所述i/o通道的信息包括eventfd文件描述符;
緩沖區(qū)寫入模塊,用于將所述i/o請(qǐng)求寫入對(duì)應(yīng)的i/o通道的緩沖區(qū)中;
事件通知模塊,用于采用所述eventfd通知所述i/o通道對(duì)應(yīng)的用戶態(tài)進(jìn)程;
i/o模擬模塊,用于在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd監(jiān)聽對(duì)應(yīng)的i/o通道的事件,并從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求,對(duì)所述 i/o請(qǐng)求執(zhí)行i/o模擬,其中,所述用戶態(tài)進(jìn)程包括第一設(shè)備模擬進(jìn)程以及與所述第一設(shè)備模擬進(jìn)程獨(dú)立的第二設(shè)備模擬進(jìn)程。
優(yōu)選地,所述裝置還包括:
虛擬機(jī)創(chuàng)建模塊,用于采用所述第一設(shè)備模擬進(jìn)程創(chuàng)建虛擬機(jī),獲得所述虛擬機(jī)的文件描述符;
vcpu創(chuàng)建模塊,用于采用所述第一設(shè)備模擬進(jìn)程,基于所述虛擬機(jī)的文件描述符,創(chuàng)建虛擬處理器vcpu,獲得所述vcpu的文件描述符;
eventfd創(chuàng)建模塊,用于采用所述第二設(shè)備模擬進(jìn)程,創(chuàng)建eventfd文件描述符;
i/o通道創(chuàng)建模塊,用于采用所述第二設(shè)備模擬進(jìn)程,基于所述虛擬機(jī)的文件描述符,創(chuàng)建i/o通道,并將所述i/o通道與所述eventfd文件描述符綁定,獲得所述i/o通道的文件描述符;
監(jiān)聽模塊,用于采用所述第二設(shè)備模擬進(jìn)程,對(duì)所述eventfd文件描述符進(jìn)行監(jiān)聽;
緩沖區(qū)映射模塊,用于采用所述第二設(shè)備模擬進(jìn)程,基于所述i/o通道的文件描述符,為所述用戶態(tài)進(jìn)程映射所述i/o通道的緩沖區(qū);
地址區(qū)間綁定模塊,用于采用所述第二設(shè)備模擬進(jìn)程,基于所述i/o通道的文件描述符,為所述i/o通道綁定i/o地址區(qū)間。
優(yōu)選地,所述i/o請(qǐng)求包括i/o地址,所述i/o通道確定模塊包括:
i/o請(qǐng)求攔截子模塊,用于通過內(nèi)核虛擬機(jī)kvm及intelvt-d硬件技術(shù)攔截虛擬機(jī)的vcpu線程發(fā)出的i/o請(qǐng)求;
i/o地址提取子模塊,用于從所述i/o請(qǐng)求中提取對(duì)應(yīng)的i/o地址;
第一i/o通道確定子模塊,用于確定所述i/o地址所屬的i/o地址區(qū)間,并通過所述i/o地址區(qū)間確定對(duì)應(yīng)的i/o通道,并獲取所述i/o通道對(duì)應(yīng)的i/o通道的信息。
優(yōu)選地,所述i/o通道的地址區(qū)間包括多個(gè)i/o模擬設(shè)備的地址子區(qū)間;
所述i/o模擬模塊包括:
第二i/o通道確定子模塊,用于在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd 確定對(duì)應(yīng)的i/o通道;
i/o請(qǐng)求讀取子模塊,用于從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求;
i/o模擬設(shè)備確定子模塊,用于依據(jù)所述i/o請(qǐng)求中的i/o地址確定對(duì)應(yīng)的i/o模擬設(shè)備;
分發(fā)子模塊,用于將所述i/o請(qǐng)求分發(fā)至所述i/o模擬設(shè)備中,通過所述i/o模擬設(shè)備對(duì)所述i/o請(qǐng)求進(jìn)行i/o模擬。
優(yōu)選地,所述裝置還包括:
掛起模塊,用于在采用所述eventfd通知所述i/o通道對(duì)應(yīng)的用戶態(tài)進(jìn)程以后,掛起所述vcpu線程。
優(yōu)選地,所述裝置還包括:
喚醒模塊,用于在對(duì)所述i/o請(qǐng)求執(zhí)行i/o模擬以后,喚醒所述掛起的vcpu線程。
優(yōu)選地,所述i/o請(qǐng)求包括讀請(qǐng)求,所述分發(fā)子模塊還用于:
將所述讀請(qǐng)求分發(fā)至所述i/o模擬設(shè)備中,通過所述i/o模擬設(shè)備將所述讀請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)寫入所述i/o通道的緩沖區(qū)中。
優(yōu)選地,所述裝置還包括:
數(shù)據(jù)讀出模塊,用于在所述i/o請(qǐng)求為讀請(qǐng)求時(shí),將所述讀請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)從緩沖區(qū)中讀出,讀入到vcpu結(jié)構(gòu)體中相應(yīng)的成員變量中,對(duì)所述數(shù)據(jù)進(jìn)行對(duì)應(yīng)的模擬處理。
本申請(qǐng)實(shí)施例包括以下優(yōu)點(diǎn):
在本申請(qǐng)實(shí)施例中,可以通過i/o通道來傳遞i/o請(qǐng)求,當(dāng)kvm攔截虛擬機(jī)發(fā)出的i/o請(qǐng)求以后,可以確定該i/o請(qǐng)求對(duì)應(yīng)的i/o通道,并將i/o請(qǐng)求寫入對(duì)應(yīng)的i/o通道的緩沖區(qū)中,隨后通過eventfd通知i/o通道對(duì)應(yīng)的用戶態(tài)進(jìn)程,用戶態(tài)進(jìn)程監(jiān)聽到eventfd事件通知以后,從該eventfd對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求,并對(duì)該i/o請(qǐng)求執(zhí)行i/o模擬。本申請(qǐng)可以在內(nèi)核態(tài)中實(shí)現(xiàn)i/o請(qǐng)求的分發(fā),針對(duì)單個(gè)虛擬機(jī)可以支持多個(gè)設(shè)備模擬 進(jìn)程,提高了i/o模擬的效率。
附圖說明
圖1是本申請(qǐng)的一種kvm虛擬化下分發(fā)i/o請(qǐng)求的方法實(shí)施例一的步驟流程圖;
圖2是本申請(qǐng)的一種kvm虛擬化下分發(fā)i/o請(qǐng)求的方法實(shí)施例二的步驟流程圖;
圖3是本申請(qǐng)的一種kvm虛擬化下分發(fā)i/o請(qǐng)求的方法實(shí)施例二中的kvm初始化流程的步驟流程圖;
圖4是本申請(qǐng)的種kvm虛擬化下處理i/o請(qǐng)求的裝置實(shí)施例的結(jié)構(gòu)框圖。
具體實(shí)施方式
為使本申請(qǐng)的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式對(duì)本申請(qǐng)作進(jìn)一步詳細(xì)的說明。
參照?qǐng)D1,示出了本申請(qǐng)的一種kvm虛擬化下分發(fā)i/o請(qǐng)求的方法實(shí)施例一的步驟流程圖,具體可以包括如下步驟:
步驟101,通過內(nèi)核虛擬機(jī)kvm攔截虛擬機(jī)發(fā)出的i/o請(qǐng)求,確定與所述i/o請(qǐng)求對(duì)應(yīng)的i/o通道的信息,其中,所述i/o通道具有對(duì)應(yīng)的緩沖區(qū),所述i/o通道的信息包括eventfd文件描述符;
步驟102,將所述i/o請(qǐng)求寫入對(duì)應(yīng)的i/o通道的緩沖區(qū)中;
步驟103,采用所述eventfd通知所述i/o通道對(duì)應(yīng)的用戶態(tài)進(jìn)程;
步驟104,在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd監(jiān)聽對(duì)應(yīng)的i/o通道的事件,并從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求,對(duì)所述i/o請(qǐng)求執(zhí)行i/o模擬。
其中,所述用戶態(tài)進(jìn)程包括第一設(shè)備模擬進(jìn)程以及與所述第一設(shè)備模擬進(jìn)程獨(dú)立的第二設(shè)備模擬進(jìn)程。
在本申請(qǐng)實(shí)施例中,可以通過i/o通道來傳遞i/o請(qǐng)求,當(dāng)kvm攔截虛擬機(jī)發(fā)出的i/o請(qǐng)求以后,可以確定該i/o請(qǐng)求對(duì)應(yīng)的i/o通道,并將i/o 請(qǐng)求寫入對(duì)應(yīng)的i/o通道的緩沖區(qū)中,隨后通過eventfd通知i/o通道對(duì)應(yīng)的用戶態(tài)進(jìn)程,用戶態(tài)進(jìn)程監(jiān)聽到eventfd事件通知以后,從該eventfd對(duì)應(yīng)的i/o通道的緩沖區(qū)中讀取i/o請(qǐng)求,并對(duì)該i/o請(qǐng)求執(zhí)行i/o模擬。本申請(qǐng)可以在內(nèi)核態(tài)中實(shí)現(xiàn)i/o請(qǐng)求的分發(fā),針對(duì)單個(gè)虛擬機(jī)可以支持多個(gè)設(shè)備模擬進(jìn)程,提高了i/o模擬的效率。
參照?qǐng)D2,示出了本申請(qǐng)的一種kvm虛擬化下處理i/o請(qǐng)求的方法實(shí)施例二的步驟流程圖。其中,kvm(kernel-basedvirtualmachine,內(nèi)核模式的虛擬機(jī))是一個(gè)基于linux環(huán)境的開源虛擬化解決方案。kvm的思想是在linux內(nèi)核的基礎(chǔ)上添加虛擬機(jī)管理模塊,重用linux內(nèi)核中已經(jīng)完善的進(jìn)程調(diào)度、內(nèi)存管理、i/o管理等部分,使之成為一個(gè)可以支持運(yùn)行虛擬機(jī)的超級(jí)管理程序hypervisor。
kvm是基于硬件輔助虛擬化技術(shù)(例如:intel的vt-x或者amd-v)的全虛擬化解決方案,虛擬機(jī)操作系統(tǒng)能夠不經(jīng)過修改直接在kvm的虛擬機(jī)中運(yùn)行,每一臺(tái)虛擬機(jī)能夠享有獨(dú)立的虛擬硬件資源:網(wǎng)卡、磁盤、圖形適配器等。
kvm可以作為單獨(dú)的模塊編譯進(jìn)內(nèi)核中,也可以作為內(nèi)核模塊在linux系統(tǒng)啟動(dòng)完成之后加載。
kvm的api是通過/dev/kvm設(shè)備進(jìn)行訪問的。/dev/kvm是一個(gè)字符型設(shè)備,其可以使用常見的系統(tǒng)調(diào)用如open、close、ioctl等指令進(jìn)行操作。因?yàn)閗vm的字符型設(shè)備的實(shí)現(xiàn)函數(shù)中,沒有包含write、read等操作,所以所有對(duì)kvm的操作都是通過ioctl發(fā)送相應(yīng)的控制字實(shí)現(xiàn)的。
kvm所提供的用戶空間api從功能上劃分,可以分為三種類型,分別為system指令、vm指令以及vcpu指令。其中,system指令針對(duì)虛擬化系統(tǒng)的全局性參數(shù)設(shè)置和用于虛擬機(jī)創(chuàng)建等控制操作;vm指令針對(duì)具體的vm虛擬機(jī)進(jìn)行控制,如進(jìn)行內(nèi)存設(shè)置、創(chuàng)建vcpu等;vcpu指令針對(duì)具體的vcpu進(jìn)行參數(shù)設(shè)置(mru寄存器讀寫、中斷控制等)。
在發(fā)明實(shí)施例中,可以通過不同的用戶態(tài)模擬器來控制用戶空間,從而 可以在不同的用戶態(tài)進(jìn)程中模擬同一臺(tái)虛擬機(jī)的設(shè)備i/o,支持針對(duì)單個(gè)虛擬機(jī)的多個(gè)設(shè)備模擬進(jìn)程。該不同的用戶態(tài)進(jìn)程可以包括第一設(shè)備模擬進(jìn)程以及第二設(shè)備模擬進(jìn)程,作為本申請(qǐng)實(shí)施例的一種優(yōu)選示例,第一設(shè)備模擬進(jìn)程可以為qemu(全稱quickemulator)進(jìn)程,所述第二設(shè)備模擬進(jìn)程可以為獨(dú)立于qemu進(jìn)程的i/o設(shè)備模擬進(jìn)程,為方便后續(xù)的描述,可以將該第二設(shè)備模擬進(jìn)程稱為demu(dedicatedemulator)進(jìn)程或demu。
其中,qemu是一款開源的模擬器及虛擬機(jī)監(jiān)管器(virtualmachinemonitor,vmm),用戶可以通過不同linux發(fā)行版所帶有的軟件包管理器來安裝qemu。qemu在主機(jī)用戶態(tài)模擬虛擬機(jī)的硬件設(shè)備,qemu作為系統(tǒng)模擬器時(shí),可以模擬出一臺(tái)能夠獨(dú)立運(yùn)行操作系統(tǒng)的虛擬機(jī),每個(gè)虛擬機(jī)對(duì)應(yīng)主機(jī)(host)中的一個(gè)qemu進(jìn)程,而虛擬機(jī)的vcpu對(duì)應(yīng)qemu進(jìn)程的一個(gè)線程。
在具體實(shí)現(xiàn)中,可以通過執(zhí)行qemu和demu的二進(jìn)制可執(zhí)行文件來創(chuàng)建qemu進(jìn)程與demu進(jìn)程,并可以通過腳本或者libvirt工具啟動(dòng)這兩個(gè)進(jìn)程。
應(yīng)用于本申請(qǐng)實(shí)施例,在對(duì)i/o請(qǐng)求進(jìn)行處理之前,首先執(zhí)行初始化流程。在平臺(tái)相關(guān)的kvm模塊中通過module_init宏正式進(jìn)入kvm的初始化階段,并且執(zhí)行相關(guān)的硬件初始化準(zhǔn)備。進(jìn)入kvm_main.c中的kvm_init函數(shù)進(jìn)行正式的初始化工作。
參考圖3的kvm初始化流程的步驟流程圖,所述初始化流程至少可以包括如下步驟:
子步驟s1,采用所述第一設(shè)備模擬進(jìn)程創(chuàng)建虛擬機(jī),獲得所述虛擬機(jī)的文件描述符;
具體的,kvm同用戶空間進(jìn)程的交互接口為/dev/kvm,對(duì)于kvmapi的操作是從打開/dev/kvm設(shè)備文件開始的,通過使用系統(tǒng)調(diào)用open方法之后,可以獲得針對(duì)kvmsubsystem的一個(gè)fd文件描述符。然后通過ioctl系統(tǒng)指令針對(duì)該文件描述符進(jìn)行進(jìn)一步的操作。
ioctl系統(tǒng)指令可以包括kvm_create_vm指令,通過 kvm_create_vm指令,即可創(chuàng)建一個(gè)虛擬機(jī)vm。通過調(diào)用anon_inode_getfd可以獲得一fd文件描述符,作為虛擬機(jī)的文件描述符,即vm_fd,該vm_fd指向內(nèi)核空間中該新創(chuàng)建的虛擬機(jī),然后根據(jù)該描述符來控制虛擬機(jī)的行為。
vmioctl系統(tǒng)調(diào)用實(shí)現(xiàn)了對(duì)虛擬機(jī)的控制。vmioctl控制指令的參數(shù)大多需要從kvm_create_vm中返回的vm_fd來進(jìn)行操作,涉及的操作主要針對(duì)該虛擬機(jī)進(jìn)行控制,如配置內(nèi)存、配置vcpu等。
針對(duì)vm的文件操作中,提供了ioctl和mmap兩個(gè)操作函數(shù),其中mmap對(duì)應(yīng)著客戶操作系統(tǒng)guestos的物理地址,可以直接對(duì)guestos的地址空間進(jìn)行讀/寫,ioctl則用于發(fā)送kvm的控制字。
應(yīng)用于本申請(qǐng)實(shí)施例,還可以對(duì)該創(chuàng)建的虛擬機(jī)設(shè)置對(duì)應(yīng)的通用唯一識(shí)別碼uuid,以通過該uuid識(shí)別虛擬機(jī)。
虛擬機(jī)的創(chuàng)建過程實(shí)質(zhì)為kvm結(jié)構(gòu)體的創(chuàng)建和初始化過程,在創(chuàng)建虛擬機(jī)時(shí),kvm_dev_ioctl_create_vm函數(shù)通過調(diào)用kvm_create_vm函數(shù)對(duì)kvm結(jié)構(gòu)體進(jìn)行創(chuàng)建。
kvm結(jié)構(gòu)體保存了虛擬機(jī)運(yùn)行的上下文及其他相關(guān)狀態(tài),例如,可以包括vcpu(虛擬處理器,虛擬機(jī)內(nèi)的cpu)、內(nèi)存、apic(advancedprogrammableinterruptcontroller,高級(jí)可編程中斷控制器)、irq(interruptrequest,中斷請(qǐng)求)、mmu(memorymanagementunit,內(nèi)存管理單元)、event事件管理等信息,應(yīng)用于本申請(qǐng)實(shí)施例,該kvm結(jié)構(gòu)體還可以包括虛擬機(jī)的uuid。
kvm結(jié)構(gòu)體的初始化過程,可以包括:初始化kvm的memslot結(jié)構(gòu)體、bus總線結(jié)構(gòu)體信息、scru讀/寫鎖信息、eventfd事件通知信息、mmu內(nèi)存管理結(jié)構(gòu)體信息等。
虛擬機(jī)的kvm結(jié)構(gòu)體創(chuàng)建完成以后,可以將其加入到全局鏈表vm_list中。
在本申請(qǐng)實(shí)施例中,可以使用qemu進(jìn)程完成虛擬機(jī)的創(chuàng)建。
步驟s2,采用所述第一設(shè)備模擬進(jìn)程,基于所述虛擬機(jī)的文件描述符, 創(chuàng)建虛擬處理器vcpu,獲得所述vcpu的文件描述符;
具體的,全新創(chuàng)建的虛擬機(jī)沒有vcpu,需要通過后續(xù)的ioctl指令進(jìn)行配置。在獲得vm_fd之后,通過ioctl調(diào)用kvm_create_vcpu指令,可以對(duì)該vm_fd對(duì)應(yīng)的虛擬機(jī)創(chuàng)建vcpu,其入口函數(shù)地址在kvm_vm_ioctl函數(shù)中,通過switch之后,程序流程將選擇進(jìn)入kvm_vm_ioctl_create_vcpu函數(shù)中進(jìn)行處理,返回該vcpu對(duì)應(yīng)的文件描述符fd,即vcpu_fd,在kvm虛擬化環(huán)境中,硬件虛擬化使用vcpu_fd來描述vcpu。
在kvm中,vcpu對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)體為kvm_vcpu,vcpu的創(chuàng)建過程實(shí)質(zhì)為kvm_vcpu結(jié)構(gòu)體的創(chuàng)建和初始化過程,可以包括如下過程:調(diào)用kvm_arch_vcpu_create函數(shù)創(chuàng)建一個(gè)kvm_vcpu結(jié)構(gòu)體;調(diào)用kvm_arch_vcpu_setup函數(shù)對(duì)kvm_vcpu中的數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化;創(chuàng)建當(dāng)前vcpu對(duì)應(yīng)的文件描述符vcpu_fd,并且將kvm_vcpu添加入kvm的vcpu數(shù)組中。
在本申請(qǐng)實(shí)施例中,可以使用qemu進(jìn)程完成vcpu的創(chuàng)建,每個(gè)vcpu對(duì)應(yīng)一個(gè)vcpu線程。
步驟s3,采用所述第二設(shè)備模擬進(jìn)程,創(chuàng)建eventfd文件描述符;
應(yīng)用于本申請(qǐng)實(shí)施例,可以采用demu進(jìn)程調(diào)用標(biāo)準(zhǔn)的linux系統(tǒng)apieventfd()來創(chuàng)建eventfd文件描述符。具體來說,eventfd()是linux系統(tǒng)提供的系統(tǒng)接口,函數(shù)原型是inteventfd(unsignedintinitval,intflags),調(diào)用這個(gè)函數(shù)用戶態(tài)進(jìn)程可以獲取一個(gè)eventfd文件描述符,同時(shí)在內(nèi)核中創(chuàng)建一個(gè)eventfd對(duì)象用于實(shí)現(xiàn)等待和通知的機(jī)制,主要用于用戶態(tài)互相通知,和內(nèi)核態(tài)向用戶態(tài)的通知。
eventfd對(duì)象中可以包含一個(gè)64位的整形變量作為計(jì)數(shù)器,函數(shù)原型中傳入的參數(shù)initval用于初始化這個(gè)計(jì)數(shù)器。eventfd文件描述符用于用戶態(tài)引用eventfd對(duì)象,用戶態(tài)進(jìn)程可以對(duì)eventfd文件描述符進(jìn)行read,write,poll,select操作。
步驟s4,采用所述第二設(shè)備模擬進(jìn)程,基于所述虛擬機(jī)文件描述符, 創(chuàng)建i/o通道,并將所述i/o通道與所述eventfd文件描述符綁定,獲得所述i/o通道的文件描述符;
應(yīng)用于本申請(qǐng)實(shí)施例,還可以采用demu進(jìn)程來創(chuàng)建虛擬機(jī)的一個(gè)或多個(gè)i/o通道。
具體來說,demu進(jìn)程可以獲得當(dāng)前虛擬機(jī)的uuid,然后在全局鏈表vm_list中查找該虛擬機(jī)的uuid,若查找成功,則獲得對(duì)應(yīng)的kvm結(jié)構(gòu)體,從而獲得虛擬機(jī)的文件描述符vm_fd,之后,可以通過vm_fd新增的ioctl指令(例如,kvm_create_ioch指令)對(duì)該vm_fd對(duì)應(yīng)的虛擬機(jī)創(chuàng)建i/o通道。創(chuàng)建i/o通道的時(shí)候,會(huì)生成i/o通道與eventfd的綁定關(guān)系,隨后返回i/o通道的文件描述符,即i/o_fd,i/o通道的文件描述符提供ioclt指令給用戶態(tài)進(jìn)程,每個(gè)vm_fd可掛載多個(gè)i/o_fd。
在kvm中,i/o通道的創(chuàng)建過程實(shí)質(zhì)為i/o通道的結(jié)構(gòu)體的創(chuàng)建和初始化過程,i/o通道的結(jié)構(gòu)體可以包括:一個(gè)eventfd,用于內(nèi)核態(tài)向用戶態(tài)的通知;一組存放i/o請(qǐng)求的緩沖區(qū)及其保護(hù)鎖;一個(gè)保存所有此通道負(fù)責(zé)傳遞的i/o地址空間的鏈表。
應(yīng)用于本申請(qǐng)實(shí)施例,在虛擬環(huán)境中,每個(gè)虛擬機(jī)對(duì)應(yīng)的kvm結(jié)構(gòu)體還可以新增一個(gè)鏈表,用于保存所有注冊(cè)在該虛擬機(jī)上的i/o通道。
需要說明的是,每個(gè)i/o模擬進(jìn)程僅需要且對(duì)應(yīng)一個(gè)i/o通道。
子步驟s5,采用所述第二設(shè)備模擬進(jìn)程,對(duì)所述eventfd文件描述符進(jìn)行監(jiān)聽。
在具體實(shí)現(xiàn)中,可以在進(jìn)程主循環(huán)中對(duì)eventfd文件描述符使用poll或者select方法,一旦發(fā)現(xiàn)該eventfd文件描述符有待處理的i/o,就調(diào)用相關(guān)的處理函數(shù),以實(shí)現(xiàn)對(duì)eventfd的監(jiān)聽。
步驟s6,采用所述第二設(shè)備模擬進(jìn)程,基于所述i/o通道的文件描述符,為所述用戶態(tài)進(jìn)程映射所述i/o通道的緩沖區(qū);
在具體實(shí)現(xiàn)中,kvm會(huì)在內(nèi)核態(tài)為全新創(chuàng)建的i/o通道分配一段緩沖區(qū),隨后,用戶態(tài)程序可以對(duì)i/o通道的文件描述符使用mmap()系統(tǒng)調(diào)用,映射該i/o通道的緩沖區(qū),則用戶態(tài)進(jìn)程可以訪問該緩沖區(qū)。
所述緩沖區(qū)還具有保護(hù)鎖,以保證對(duì)該緩沖區(qū)讀寫訪問互斥性。
步驟s7,采用所述第二設(shè)備模擬進(jìn)程,基于所述i/o通道的文件描述符,為所述i/o通道綁定i/o地址區(qū)間。
應(yīng)用本申請(qǐng)實(shí)施例,還可以采用demu進(jìn)程通過i/o通道的文件描述符為需要監(jiān)聽的i/o通道綁定i/o地址區(qū)間,不同的i/o通道具有不同的i/o地址區(qū)間,例如,針對(duì)i/o地址區(qū)間1~1000,可以將1~300綁定給i/o通道a,將301~1000綁定給i/o通道b。
在具體實(shí)現(xiàn)中,該i/o通道的地址區(qū)間還可以包括多個(gè)地址子區(qū)間,每個(gè)地址子區(qū)間對(duì)應(yīng)一個(gè)i/o模擬設(shè)備(一個(gè)io模擬進(jìn)程可以模擬多個(gè)io模擬設(shè)備),每個(gè)i/o模擬設(shè)備只模擬落在其地址區(qū)間范圍內(nèi)的請(qǐng)求。例如,i/o通道a的地址區(qū)間為1~300,其中,1~100可以對(duì)應(yīng)i/o模擬設(shè)備1,101~200可以對(duì)應(yīng)i/o模擬設(shè)備2,201~300可以對(duì)應(yīng)i/o模擬設(shè)備3。
在本申請(qǐng)實(shí)施例中,在原有的qemu進(jìn)程的基礎(chǔ)上,新增獨(dú)立的demu進(jìn)程,兩者作為用戶態(tài)模擬器,能夠共享虛擬機(jī)的一部分底層數(shù)據(jù)結(jié)構(gòu)。
在完成初始化流程以后,如圖2所示,本申請(qǐng)實(shí)施例具體可以包括如下步驟:
步驟201,通過內(nèi)核虛擬機(jī)kvm攔截虛擬機(jī)的vcpu線程發(fā)出的i/o請(qǐng)求,確定與所述i/o請(qǐng)求對(duì)應(yīng)的i/o通道的信息;
kvm可以攔截虛擬機(jī)的i/o操作,并根據(jù)攔截的i/o操作確定對(duì)應(yīng)的i/o通道的信息。
在本申請(qǐng)實(shí)施例的一種優(yōu)選實(shí)施例中,步驟201可以包括如下子步驟:
子步驟s11,通過內(nèi)核虛擬機(jī)kvm及intelvt-d硬件技術(shù)攔截虛擬機(jī)的vcpu線程發(fā)出的i/o請(qǐng)求;
在具體實(shí)現(xiàn)中,kvm在內(nèi)核空間非根模式下運(yùn)行vcpu線程,當(dāng)vcpu線程發(fā)起i/o請(qǐng)求時(shí),該敏感指令將會(huì)觸發(fā)intelvt-d硬件技術(shù)的vmexit操作,進(jìn)入根模式下kvm相應(yīng)的處理函數(shù)。
具體的,當(dāng)虛擬機(jī)運(yùn)行時(shí)(虛擬機(jī)的運(yùn)行通過/dev/kvm設(shè)備ioctlvcpu 接口的kvm_run指令實(shí)現(xiàn)),觸發(fā)vmentry,使虛擬機(jī)進(jìn)入客戶guest模式,即nonroot模式。而當(dāng)在虛擬機(jī)中(guest模式)執(zhí)行特權(quán)指令或者外部事件,比如i/o訪問,對(duì)控制寄存器的操作,msr的讀寫數(shù)據(jù)包到達(dá)等時(shí),可以觸發(fā)(由硬件觸發(fā))vmexit,使當(dāng)前cpu從guest模式(非根non-root模式)退出,切換到根root模式,當(dāng)前cpu的控制權(quán)隨之轉(zhuǎn)交給kvm,由kvm進(jìn)行相應(yīng)的處理。
kvm取得控制權(quán)以后,通過讀取vmcs中vm_exit_reason字段得到引起vmexit的原因,kvm根據(jù)退出的原因得知虛擬機(jī)需要進(jìn)行i/o操作。
子步驟s12,從所述i/o請(qǐng)求中提取對(duì)應(yīng)的i/o地址;
i/o請(qǐng)求中可以攜帶發(fā)出i/o請(qǐng)求的虛擬機(jī)的地址信息,當(dāng)獲得i/o請(qǐng)求以后,可以從該i/o請(qǐng)求中提取對(duì)應(yīng)的i/o地址。
子步驟s13,確定所述i/o地址所屬的i/o地址區(qū)間;
子步驟s14,通過所述i/o地址區(qū)間確定對(duì)應(yīng)的i/o通道,并獲取所述i/o通道對(duì)應(yīng)的i/o通道的信息。
由于i/o通道具有i/o地址區(qū)間,因此可以首先判斷該i/o請(qǐng)求的i/o地址屬于哪個(gè)地址區(qū)間,然后根據(jù)匹配的地址區(qū)間確定對(duì)應(yīng)的i/o通道,并確定該i/o通道對(duì)應(yīng)的緩沖區(qū)、eventfd文件描述符等信息。
步驟202,將所述i/o請(qǐng)求寫入對(duì)應(yīng)的i/o通道的緩沖區(qū)中;
確定該i/o請(qǐng)求對(duì)應(yīng)的i/o通道通道以后,kvm可以將該i/o請(qǐng)求寫入該對(duì)應(yīng)的i/o通道的緩沖區(qū)中,從而在kvm中完成i/o請(qǐng)求的分發(fā)。
步驟203,采用所述eventfd通知所述i/o通道對(duì)應(yīng)的用戶態(tài)進(jìn)程;
在具體實(shí)現(xiàn)中,在內(nèi)核空間中將i/o請(qǐng)求寫入對(duì)應(yīng)的i/o通道的緩沖區(qū)時(shí),用戶空間對(duì)此并不知情,因此需要內(nèi)核空間通過eventfd向用戶空間發(fā)出通知,用戶態(tài)進(jìn)程通過監(jiān)聽該eventfd從而獲知其對(duì)應(yīng)的i/o通道的緩沖區(qū)中寫入了i/o請(qǐng)求。
步驟204,掛起所述vcpu線程;
應(yīng)用于本申請(qǐng)實(shí)施例,由于i/o請(qǐng)求通過i/o通道上傳到i/o通道的緩 沖區(qū)中,由i/o模擬線程進(jìn)行i/o模擬,而i/o模擬線程與vcpu線程可以處于不同的進(jìn)程中,因此發(fā)生i/o請(qǐng)求的時(shí)候無需退出vcpu線程,此時(shí)只需要掛起vcpu線程,并等待用戶態(tài)進(jìn)程的完成i/o請(qǐng)求后再將其喚醒。
步驟205,在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd監(jiān)聽對(duì)應(yīng)的i/o通道的事件,并從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求,對(duì)所述i/o請(qǐng)求執(zhí)行i/o模擬;
當(dāng)內(nèi)核態(tài)向用戶態(tài)發(fā)出eventfd事件通知時(shí),用戶態(tài)進(jìn)程可以監(jiān)聽到eventfd事件通知,相應(yīng)的處理函數(shù)被調(diào)用,通過用戶態(tài)進(jìn)程進(jìn)行i/o模擬,其中,i/o模擬主要指的是針對(duì)虛擬機(jī)進(jìn)行的i/o操作,通過軟件的模擬行為使其獲得一個(gè)對(duì)應(yīng)的處理結(jié)果。
在本申請(qǐng)實(shí)施例的一種優(yōu)選實(shí)施例中,步驟205可以包括如下子步驟:
子步驟s21,在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd確定對(duì)應(yīng)的i/o通道;
由于eventfd與i/o通道是綁定的,當(dāng)用戶態(tài)進(jìn)程監(jiān)聽到eventfd進(jìn)程注冊(cè)的函數(shù)被調(diào)用以后,可以根據(jù)eventfd與i/o通道的對(duì)應(yīng)關(guān)系,確定與eventfd對(duì)應(yīng)的i/o通道。
子步驟s22,從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求;
當(dāng)確定i/o通道以后,可以進(jìn)一步從已經(jīng)映射的該i/o通道的緩沖區(qū)中讀出i/o請(qǐng)求。
子步驟s23,依據(jù)所述i/o請(qǐng)求中的i/o地址確定對(duì)應(yīng)的i/o模擬設(shè)備;
子步驟s24,將所述i/o請(qǐng)求分發(fā)至所述i/o模擬設(shè)備中,通過所述i/o模擬設(shè)備對(duì)所述i/o請(qǐng)求進(jìn)行i/o模擬。
由于i/o通道的地址空間中包含一個(gè)或多個(gè)i/o模擬設(shè)備的地址子區(qū)間,當(dāng)用戶態(tài)進(jìn)程獲得i/o請(qǐng)求以后,可以根據(jù)該i/o請(qǐng)求中攜帶的i/o地址,確定該i/o地址所屬的地址子區(qū)間,并根據(jù)該地址子區(qū)間確定對(duì)應(yīng)的i/o模擬設(shè)備,以及將該i/o請(qǐng)求分發(fā)至該對(duì)應(yīng)的i/o模擬設(shè)備中,以完成i/o請(qǐng)求的進(jìn)一步二次分發(fā)。
i/o模擬設(shè)備獲得i/o請(qǐng)求以后,對(duì)該i/o請(qǐng)求進(jìn)行i/o模擬。
在一種實(shí)施方式中,若該i/o請(qǐng)求為讀請(qǐng)求,則該請(qǐng)求對(duì)應(yīng)的i/o模擬設(shè)備可以將該讀請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)寫入i/o通道的緩沖區(qū)中,從而完成用戶空間中的i/o模擬。
在另一種實(shí)施方式中,若該i/o請(qǐng)求為寫請(qǐng)求,則該請(qǐng)求對(duì)應(yīng)的i/o模擬設(shè)備可以將該寫請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)寫入對(duì)應(yīng)的位置中,例如寫入到了主機(jī)中的一個(gè)鏡像文件中,從而完成用戶空間中的i/o模擬。
步驟206,喚醒所述掛起的vcpu線程。
i/o模擬完成后,用戶態(tài)進(jìn)程調(diào)用i/o通道的文件描述符中的新增ioctl指令進(jìn)入kvm內(nèi)核態(tài),喚醒該掛起的vcpu線程,以繼續(xù)運(yùn)行vcpu線程,達(dá)到vcpu線程與i/o模擬線程的同步,也就是說,用戶態(tài)向內(nèi)核態(tài)的通知是通過對(duì)vcpu線程的掛起與喚醒來實(shí)現(xiàn)的。
在一種實(shí)施方式中,若該i/o請(qǐng)求為讀請(qǐng)求,在喚醒vcpu線程之后,還可以將該讀請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)從緩沖區(qū)中讀出,讀入到vcpu結(jié)構(gòu)體中相應(yīng)的成員變量中,并通過原有的i/o模擬代碼進(jìn)行后續(xù)的模擬處理。
eventfd的使用結(jié)合緩沖區(qū)的使用,可以在緩沖區(qū)中傳遞i/o請(qǐng)求訪問的實(shí)際地址和長(zhǎng)度,并將讀操作得到的數(shù)據(jù)通過緩沖區(qū)傳遞給kvm,克服現(xiàn)有技術(shù)的缺陷。
在對(duì)i/o請(qǐng)求處理完成以后,可以通過硬件指令(如vmlaunch),觸發(fā)vmenter,重新進(jìn)入到guest模式,從而進(jìn)入虛擬機(jī)運(yùn)行環(huán)境中繼續(xù)運(yùn)行。
為了使本領(lǐng)域技術(shù)人員能夠更好地理解本申請(qǐng)實(shí)施例,以下通過一個(gè)具體實(shí)例對(duì)本申請(qǐng)實(shí)施例加以示例性說明,但應(yīng)該理解的是,本申請(qǐng)實(shí)施例并不限于此。
虛擬機(jī)在運(yùn)行時(shí),設(shè)備驅(qū)動(dòng)會(huì)訪問虛擬vga設(shè)備的mmio控制寄存器來讀取模擬設(shè)備的狀態(tài)。該寄存器映射的地址訪問觸發(fā)ept頁錯(cuò)誤,cpu退出非根模式進(jìn)入根模式,執(zhí)行kvm代碼。
kvm判斷退出原因得知是i/o請(qǐng)求,根據(jù)i/o請(qǐng)求查找對(duì)應(yīng)的i/o通道,將i/o請(qǐng)求拷貝到i/o通道相應(yīng)的緩沖區(qū)中,然后用eventfd發(fā)出通知后vcpu 線程進(jìn)入睡眠。
qemu主循環(huán)發(fā)現(xiàn)eventfd中的事件通知,找到相應(yīng)的i/o通道并從相應(yīng)的緩沖區(qū)中讀出i/o請(qǐng)求,發(fā)現(xiàn)該請(qǐng)求地址處于客戶機(jī)物理地址布局中虛擬vga設(shè)備的bar1區(qū)間,于是調(diào)用vga設(shè)備相應(yīng)的處理函數(shù)對(duì)i/o請(qǐng)求進(jìn)行模擬,把該寄存器的值寫回到緩沖區(qū)中,然后通過ioctl指令喚醒睡眠的vcpu線程。
vcpu線程被喚醒后從緩沖區(qū)中讀出寄存器值數(shù)據(jù),并將其更新到vcpu上下文的相應(yīng)位置,然后進(jìn)入非根模式繼續(xù)執(zhí)行vcpu上下文。
驅(qū)動(dòng)代碼處的讀寄存器操作全部完成模擬。
本申請(qǐng)實(shí)施例在kvm虛擬化下實(shí)現(xiàn)獨(dú)立于qemu的設(shè)備模擬程序提供了基礎(chǔ),解決了一些廠商特有的設(shè)備模擬需求。
另外,本申請(qǐng)實(shí)施例在kvm內(nèi)核模塊中實(shí)現(xiàn)i/o請(qǐng)求的分發(fā),并向用戶態(tài)提供控制接口,從而可以在不同的進(jìn)程中模擬同一臺(tái)虛擬機(jī)的設(shè)備i/o。
需要說明的是,對(duì)于方法實(shí)施例,為了簡(jiǎn)單描述,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本申請(qǐng)實(shí)施例并不受所描述的動(dòng)作順序的限制,因?yàn)橐罁?jù)本申請(qǐng)實(shí)施例,某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作并不一定是本申請(qǐng)實(shí)施例所必須的。
參照?qǐng)D4,示出了本申請(qǐng)的一種kvm虛擬化下處理i/o請(qǐng)求的裝置實(shí)施例的結(jié)構(gòu)框圖,具體可以包括如下模塊:
i/o通道確定模塊401,用于通過內(nèi)核虛擬機(jī)kvm攔截虛擬機(jī)發(fā)出的i/o請(qǐng)求,確定與所述i/o請(qǐng)求對(duì)應(yīng)的i/o通道的信息,其中,所述i/o通道具有對(duì)應(yīng)的緩沖區(qū),所述i/o通道的信息包括eventfd文件描述符;
緩沖區(qū)寫入模塊402,用于將所述i/o請(qǐng)求寫入對(duì)應(yīng)的i/o通道的緩沖區(qū)中;
事件通知模塊403,用于采用所述eventfd通知所述i/o通道對(duì)應(yīng)的用戶態(tài)進(jìn)程;
i/o模擬模塊404,用于在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd監(jiān)聽對(duì)應(yīng)的i/o通道的事件,并從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求,對(duì)所述i/o請(qǐng)求執(zhí)行i/o模擬。
其中,所述用戶態(tài)進(jìn)程包括第一設(shè)備模擬進(jìn)程以及與所述第一設(shè)備模擬進(jìn)程獨(dú)立的第二設(shè)備模擬進(jìn)程。
在本申請(qǐng)實(shí)施例的一種優(yōu)選實(shí)施例中,所述裝置還可以包括:
虛擬機(jī)創(chuàng)建模塊,用于采用所述第一設(shè)備模擬進(jìn)程創(chuàng)建虛擬機(jī),獲得所述虛擬機(jī)的文件描述符;
vcpu創(chuàng)建模塊,用于采用所述第一設(shè)備模擬進(jìn)程,基于所述虛擬機(jī)的文件描述符,創(chuàng)建虛擬處理器vcpu,獲得所述vcpu的文件描述符;
eventfd創(chuàng)建模塊,用于采用所述第二設(shè)備模擬進(jìn)程,創(chuàng)建eventfd文件描述符;
i/o通道創(chuàng)建模塊,用于采用所述第二設(shè)備模擬進(jìn)程,基于所述虛擬機(jī)的文件描述符,創(chuàng)建i/o通道,并將所述i/o通道與所述eventfd文件描述符綁定,獲得所述i/o通道的文件描述符;
監(jiān)聽模塊,用于對(duì)所述eventfd文件描述符進(jìn)行監(jiān)聽;
緩沖區(qū)映射模塊,用于采用所述第二設(shè)備模擬進(jìn)程,基于所述i/o通道的文件描述符,為所述用戶態(tài)進(jìn)程映射所述i/o通道的緩沖區(qū);
地址區(qū)間綁定模塊,用于采用所述第二設(shè)備模擬進(jìn)程,基于所述i/o通道的文件描述符,為所述i/o通道綁定i/o地址區(qū)間。
在本申請(qǐng)實(shí)施例的一種優(yōu)選實(shí)施例中,所述i/o請(qǐng)求包括i/o地址,所述i/o通道確定模塊401可以包括如下子模塊:
i/o請(qǐng)求攔截子模塊,用于通過內(nèi)核虛擬機(jī)kvm及intelvt-d硬件技術(shù)攔截虛擬機(jī)的vcpu線程發(fā)出的i/o請(qǐng)求;
i/o地址提取子模塊,用于從所述i/o請(qǐng)求中提取對(duì)應(yīng)的i/o地址;
第一i/o通道確定子模塊,用于確定所述i/o地址所屬的i/o地址區(qū)間, 并通過所述i/o地址區(qū)間確定對(duì)應(yīng)的i/o通道,并獲取所述i/o通道對(duì)應(yīng)的i/o通道的信息。
在本申請(qǐng)實(shí)施例的一種優(yōu)選實(shí)施例中,所述i/o通道的地址區(qū)間包括多個(gè)i/o模擬設(shè)備的地址子區(qū)間;
所述i/o模擬模塊404可以包括如下子模塊:
第二i/o通道確定子模塊,用于在所述用戶態(tài)進(jìn)程中,根據(jù)所述eventfd確定對(duì)應(yīng)的i/o通道;
i/o請(qǐng)求讀取子模塊,用于從所述對(duì)應(yīng)的i/o通道的緩沖區(qū)中獲取i/o請(qǐng)求;
i/o模擬設(shè)備確定子模塊,用于依據(jù)所述i/o請(qǐng)求中的i/o地址確定對(duì)應(yīng)的i/o模擬設(shè)備;
分發(fā)子模塊,用于將所述i/o請(qǐng)求分發(fā)至所述i/o模擬設(shè)備中,通過所述i/o模擬設(shè)備對(duì)所述i/o請(qǐng)求進(jìn)行i/o模擬。
在本申請(qǐng)實(shí)施例的一種優(yōu)選實(shí)施例中,所述裝置還包括:
掛起模塊,用于在采用所述eventfd通知所述i/o通道對(duì)應(yīng)的用戶態(tài)進(jìn)程以后,掛起所述vcpu線程。
在本申請(qǐng)實(shí)施例的一種優(yōu)選實(shí)施例中,所述裝置還包括:
喚醒模塊,用于在對(duì)所述i/o請(qǐng)求執(zhí)行i/o模擬以后,喚醒所述掛起的vcpu線程。
在本申請(qǐng)實(shí)施例的一種優(yōu)選實(shí)施例中,所述i/o請(qǐng)求包括讀請(qǐng)求,所述分發(fā)子模塊還用于:
將所述讀請(qǐng)求分發(fā)至所述i/o模擬設(shè)備中,通過所述i/o模擬設(shè)備將所述讀請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)寫入所述i/o通道的緩沖區(qū)中。
在本申請(qǐng)實(shí)施例的一種優(yōu)選實(shí)施例中,所述裝置還包括:
數(shù)據(jù)讀出模塊,用于在所述i/o請(qǐng)求為讀請(qǐng)求時(shí),將所述讀請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)從緩沖區(qū)中讀出,讀入到vcpu結(jié)構(gòu)體中相應(yīng)的成員變量中,對(duì)所述數(shù)據(jù)進(jìn)行對(duì)應(yīng)的模擬處理。
對(duì)于裝置實(shí)施例而言,由于其與方法實(shí)施例基本相似,所以描述的比較 簡(jiǎn)單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
本說明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似的部分互相參見即可。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本申請(qǐng)實(shí)施例的實(shí)施例可提供為方法、裝置、或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)實(shí)施例可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)實(shí)施例可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、cd-rom、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
在一個(gè)典型的配置中,所述計(jì)算機(jī)設(shè)備包括一個(gè)或多個(gè)處理器(cpu)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲(chǔ)器,隨機(jī)存取存儲(chǔ)器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲(chǔ)器(rom)或閃存(flashram)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲(chǔ)。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲(chǔ)介質(zhì)的例子包括,但不限于相變內(nèi)存(pram)、靜態(tài)隨機(jī)存取存儲(chǔ)器(sram)、動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(dram)、其他類型的隨機(jī)存取存儲(chǔ)器(ram)、只讀存儲(chǔ)器(rom)、電可擦除可編程只讀存儲(chǔ)器(eeprom)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲(chǔ)器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學(xué)存儲(chǔ)、磁盒式磁帶,磁帶磁磁盤存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備或任何其他非傳輸介質(zhì),可用于存儲(chǔ)可以被計(jì)算設(shè)備訪問的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括非持續(xù)性的電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號(hào)和載波。
本申請(qǐng)實(shí)施例是參照根據(jù)本申請(qǐng)實(shí)施例的方法、終端設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令 實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備上,使得在計(jì)算機(jī)或其他可編程終端設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程終端設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
盡管已描述了本申請(qǐng)實(shí)施例的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例做出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本申請(qǐng)實(shí)施例范圍的所有變更和修改。
最后,還需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者終端設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者終端設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者終端設(shè)備中還存在另外的相同要素。
以上對(duì)本申請(qǐng)所提供的一種kvm虛擬化下處理i/o請(qǐng)求的方法和一種kvm虛擬化下處理i/o請(qǐng)求的裝置,進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本申請(qǐng)的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本申請(qǐng)的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請(qǐng)的思想,在具體實(shí)施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對(duì)本申請(qǐng)的限制。