即PCIe根控制器,它通常集成在CPU中)的物理服務(wù)器,通常地,根節(jié)點(diǎn)也可以被稱為主機(jī)。一個根節(jié)點(diǎn)上可以運(yùn)行多個虛擬機(jī)(即VM),虛擬機(jī)上可以運(yùn)行多個應(yīng)用(即APP)。
[0043]單根I/O設(shè)備是指被單個根節(jié)點(diǎn)識別、配置和使用的I/O設(shè)備,它包括各種網(wǎng)絡(luò)1/0設(shè)備(如以太網(wǎng)卡NIC)、存儲I/O設(shè)備(如sata主機(jī)適配器HBA)以及加速I/O (如GPU)等。互連控制器是兼容PCIe協(xié)議的互連系統(tǒng),它通過多個PCIe接口連接多個根節(jié)點(diǎn)和多個I/O多根共享適配裝置。
[0044]I/O多根共享適配裝置是為了讓單根I/O設(shè)備能夠被多個根節(jié)點(diǎn)共享的適配裝置。眾所周知,傳統(tǒng)I/O設(shè)備功能在根節(jié)點(diǎn)PCIe域的系統(tǒng)路由ID號(即RID號,為便于描述,下文中將路由ID號稱為RID號)由總線號/設(shè)備號/功能號(Bus/Device/Funct1nID,簡稱BDF)來表示,并且,傳統(tǒng)I/O設(shè)備功能通過內(nèi)存地址映射(即麗10,麗10是MemoryMapped I/O的縮寫)到根節(jié)點(diǎn)PCIe域的內(nèi)存空間。從根節(jié)點(diǎn)的操作系統(tǒng)的視角看,1/0設(shè)備就是一組可以發(fā)現(xiàn)、配置和訪問的寄存器資源,這些寄存器資源包括通過系統(tǒng)RID訪問的配置寄存器資源(Config.Reg)以及通過內(nèi)存地址ADDR訪問的物理寄存器資源(PhysicalReg)。其中,配置寄存器資源即PCIe配置空間,包括設(shè)備功能標(biāo)識,BAR地址以及中斷等,其中BAR地址是指寫到BAR寄存器上的通過內(nèi)存地址映射到根節(jié)點(diǎn)PCIe域的內(nèi)存空間的首地址,并且,BAR地址還能夠通過低位不可寫的方式定義內(nèi)存大小。通常,根節(jié)點(diǎn)先獲取內(nèi)存地址映射所需的內(nèi)存空間的大小,然后給其分配內(nèi)存空間,再把首地址寫到BAR寄存器上。物理寄存器資源是一組用于實(shí)現(xiàn)I/O設(shè)備特定功能服務(wù)的資源集,如傳遞根節(jié)點(diǎn)指令的工作隊列、中斷資源以及DMA讀寫傳輸數(shù)據(jù)的數(shù)據(jù)緩沖區(qū)等,這些物理寄存器資源通過配置空間的BAR地址內(nèi)存映射到根節(jié)點(diǎn)的內(nèi)存空間,這樣根節(jié)點(diǎn)對本地內(nèi)存空間的操作就會作用于I/O設(shè)備的相應(yīng)物理寄存器資源,從而實(shí)現(xiàn)根節(jié)點(diǎn)和I/O設(shè)備間通信和數(shù)據(jù)傳輸?shù)腎/O通道。
[0045]容易看出,現(xiàn)有的單根I/O設(shè)備的內(nèi)存映射機(jī)制決定了一個單根I/O設(shè)備只能被一個根節(jié)點(diǎn)發(fā)現(xiàn)和使用,如果多個根節(jié)點(diǎn)對同一個單根I/O設(shè)備發(fā)起配置、訪問使用,會造成I/O設(shè)備行為混淆,甚至系統(tǒng)崩潰。而本實(shí)施例則針對這一問題,提出了一種使得單根1/0設(shè)備能夠適配多個根節(jié)點(diǎn)的I/O多根共享適配裝置。單根I/O設(shè)備通過這種I/O多根共享適配裝置耦合到各個根節(jié)點(diǎn),能夠形成I/o設(shè)備多根共享的網(wǎng)絡(luò)系統(tǒng)。該共享系統(tǒng)中,不再需要為每個根節(jié)點(diǎn)單獨(dú)配置多種I/o設(shè)備,而是所有I/O設(shè)備虛擬化形成I/O資源池,該資源池中的I/o資源以虛擬I/O功能為單位按需分配給共享系統(tǒng)的各個根節(jié)點(diǎn)使用。并且各根節(jié)點(diǎn)與分配到的I/o資源具有隔離的邏輯連接(隔離的邏輯連接是指:對于任意一個根節(jié)點(diǎn),該根節(jié)點(diǎn)和其分配到I/o資源間的連接與其它根節(jié)點(diǎn)和相應(yīng)分配到的I/O資源間的連接是相互獨(dú)立的)。這樣,多個根節(jié)點(diǎn)可以共享一個I/o設(shè)備;一個根節(jié)點(diǎn)也可動態(tài)地配置不同的I/o資源(比如同時配置網(wǎng)絡(luò)1/0、存儲適配器HBA以及加速卡等等),與不同的I/o資源都建立隔離的邏輯連接。
[0046]圖2示出了根據(jù)本發(fā)明的另一個實(shí)施例所提供的單根I/O設(shè)備多根共享系統(tǒng)的示意圖。與圖1的實(shí)施例相比,它將互連控制器替換為由多個互連控制器組成的互連網(wǎng)絡(luò),這樣能夠增加PCIe接口,從而方便更多的根節(jié)點(diǎn)和單根I/O設(shè)備接入所述共享系統(tǒng)。
[0047]下面進(jìn)一步介紹I/O多根共享適配裝置的各項技術(shù)細(xì)節(jié)。這個作為示例的I/O多根共享適配裝置既可以應(yīng)用于圖1所示的共享系統(tǒng)中,也可以應(yīng)用于圖2所示的共享系統(tǒng)中。
[0048]根據(jù)本發(fā)明的一個實(shí)施例,I/O多根共享適配裝置基于PCIe協(xié)議構(gòu)建。眾所周知,PCIe協(xié)議包括三個層次,即物理層、數(shù)據(jù)鏈路層和事務(wù)層。根節(jié)點(diǎn)和I/O之間的通信或者訪問都是通過事務(wù)包來承載的。因此,I/O多根共享適配實(shí)際上就是對承載著根節(jié)點(diǎn)和I/O之間的通信或訪問的事務(wù)包的適配處理。本實(shí)施例的I/O多根共享適配裝置中,物理層和數(shù)據(jù)鏈路層依照PCIe協(xié)議對事務(wù)包進(jìn)行處理,在事務(wù)層中完成事務(wù)包的適配處理。
[0049]如前文所述,現(xiàn)有的單根I/O設(shè)備的內(nèi)存映射機(jī)制決定了一個單根I/O設(shè)備只能被一個根節(jié)點(diǎn)發(fā)現(xiàn)和使用,如果多個根節(jié)點(diǎn)對同一個單根I/O設(shè)備發(fā)起配置、訪問使用,會造成I/O設(shè)備行為混淆,甚至系統(tǒng)崩潰。因此,本實(shí)施例中,為了讓單根I/O設(shè)備能夠接入共享系統(tǒng),首先將單根I/O設(shè)備耦合至一個唯一的主控制根節(jié)點(diǎn)。S卩,首先將單根I/O設(shè)備與適配裝置的I/O設(shè)備接口連接,將適配裝置的主機(jī)接口同接入PCIe互連子系統(tǒng)(PCIe互連控制器或者PCIe互連網(wǎng)絡(luò))的一個主控制根節(jié)點(diǎn)連接。該主控制根節(jié)點(diǎn)可以是預(yù)先設(shè)定的接入PCIe互連子系統(tǒng)特定接口的根節(jié)點(diǎn),也可以是第一個發(fā)現(xiàn)所接入單根I/O設(shè)備的根節(jié)點(diǎn),還可以是其它情況,只要保證主控制根節(jié)點(diǎn)在共享系統(tǒng)中是唯一的即可。
[0050]圖3示出了本實(shí)施例的I/O多根共享適配裝置及其與根節(jié)點(diǎn)和單根I/O設(shè)備的邏輯連接關(guān)系。為使圖面更加簡潔,圖3中省略了根節(jié)點(diǎn)與I/O多根共享適配裝置之間的互連控制器或互聯(lián)網(wǎng)絡(luò)。參考圖3,本實(shí)施例的I/O多根共享適配裝置包括主機(jī)接口、動態(tài)1/0重映射模塊和I/O接口三個部分,這三個部分都在PCIe協(xié)議的事務(wù)層實(shí)現(xiàn)。
[0051 ] 其中,主機(jī)接口用于實(shí)現(xiàn)與多個根節(jié)點(diǎn)的邏輯連接,它包括系統(tǒng)控制接口以及虛擬配置空間寄存器。其中系統(tǒng)控制接口用于與主控制根節(jié)點(diǎn)連接,為主控制根節(jié)點(diǎn)提供控制接口并實(shí)現(xiàn)與主控制根節(jié)點(diǎn)的通信,主控制根節(jié)點(diǎn)通過該接口可配置和控制所述I/O多根共享適配裝置,如下發(fā)I/O資源配置指令等;虛擬配置空間寄存器用于向多個用戶根節(jié)點(diǎn)透明地呈現(xiàn)多個虛擬I/o功能鏡像(vFun)。所述主機(jī)接口還用于將來自于主控制根節(jié)點(diǎn)的下行事務(wù)包分發(fā)給系統(tǒng)控制接口進(jìn)行處理,將來自于用戶根節(jié)點(diǎn)的下行事務(wù)包分發(fā)給虛擬配置空間寄存器進(jìn)行處理;將來自于系統(tǒng)控制接口的上行事務(wù)包向主控制根節(jié)點(diǎn)傳輸,以及將來自于虛擬配置空間寄存器的上行事務(wù)包向用戶根節(jié)點(diǎn)傳輸。
[0052]動態(tài)重映射模塊包括I/O重映射模塊和虛擬熱插拔模塊。I/O重映射模塊用于進(jìn)行事務(wù)包在用戶根節(jié)點(diǎn)PCIe域和主控制根節(jié)點(diǎn)PCIe域之間的重映射,并為各根節(jié)點(diǎn)對I/O的共享提供隔離和保護(hù),在這個重映射機(jī)制下,根節(jié)點(diǎn)能且僅能訪問所分配到的I/O資源。虛擬熱插拔模塊則用于在不影響根節(jié)點(diǎn)其他工作的情況下,實(shí)現(xiàn)向根節(jié)點(diǎn)動態(tài)刪除和增加I/O設(shè)備的功能。
[0053]I/O接口模塊用于與I/O設(shè)備連接,并將多個共享根節(jié)點(diǎn)發(fā)來的I/O事務(wù)包按需緩存,然后有序地調(diào)度發(fā)送給I/O設(shè)備,避免I/O訪問沖突而引起設(shè)備混亂甚至系統(tǒng)崩潰。
[0054]進(jìn)一步地,圖4示出了一種基于圖3的I/O設(shè)備多根共享適配裝置的單根I/O設(shè)備多根共享方法,它包括下列步驟:
[0055]步驟1:耦合單根I/O設(shè)備到一個主控制根節(jié)點(diǎn)PCIe域,虛擬化I/O設(shè)備建立多個邏輯虛擬化功能鏡像。
[0056]本步驟包括下列子步驟:
[0057]步驟11:首先將實(shí)體單根I/O設(shè)備耦合至唯一的主控制根節(jié)點(diǎn)。即,首先將實(shí)體單根I/O設(shè)備與適配裝置的I/O設(shè)備接口連接,將適配裝置的主機(jī)接口同接入PCIe互連子系統(tǒng)(PCIe互連控制器或者PCIe互連網(wǎng)絡(luò))的一個主控制根節(jié)點(diǎn)連接。
[0058]步驟12:主控制根節(jié)點(diǎn)掃描發(fā)現(xiàn)單根I/O設(shè)備后,會為所發(fā)現(xiàn)的單根I/O設(shè)備配置RID,為便于描述,本文中將該主控制根節(jié)點(diǎn)配置的RID記為mRID。單根I/O設(shè)備接收到主控制根節(jié)點(diǎn)配置的mRID后,將本地的配置寄存器資源和物理寄存器資源映射(該映射為麗10映射,下文中也稱為內(nèi)存映射)到主控制根節(jié)點(diǎn)的內(nèi)存空間,主控制根節(jié)點(diǎn)再返回所映射的內(nèi)存空間的首地址,該首地址就是BAR地址,記為mADDR。
[0059]步驟13:在主控制根節(jié)點(diǎn)掃描單根I/O設(shè)備過程中,共享適配裝置通過監(jiān)聽主控制根節(jié)點(diǎn)和單根I/o設(shè)備間的通信,記錄下mRID和mADDR,同時建立多個虛擬I/O功能鏡像。虛擬I/O功能鏡像是對I/O設(shè)備功能的實(shí)體抽象,并能夠進(jìn)行I/O設(shè)備功能的行為模擬,使得根節(jié)點(diǎn)和虛擬I/O功能鏡像的通信與它和實(shí)體I/O功能的通信一樣。
[0060]其中,對I/O設(shè)備功能的實(shí)體抽象,是指監(jiān)聽主控制根節(jié)點(diǎn)對單根I/O設(shè)備配置空間寄存器掃描過程中的訪問及該單根I/o設(shè)備的響應(yīng),進(jìn)而建立虛擬的配置空間,形成虛擬功能鏡像。每個虛擬功能鏡像都有一個虛擬路由ID號,記為VRID。在一個例子中,vRID從0開始編號。每個虛擬功能鏡像都對應(yīng)一份虛擬的配置空間。
[0061]I/O設(shè)備功能的行為模擬,是指對I/O設(shè)備功能中的虛擬配置寄存器的訪問進(jìn)行模擬響應(yīng)。多根共享時,由虛擬功能鏡像替代實(shí)體I/O設(shè)備功能作為用戶根節(jié)點(diǎn)的設(shè)備占位符,通過透傳或者模擬響應(yīng)向用戶根節(jié)點(diǎn)呈現(xiàn)一個虛擬的I/O設(shè)備。虛擬功能鏡像對用戶根節(jié)點(diǎn)完全透明。用戶根節(jié)點(diǎn)認(rèn)為自己擁有一個真實(shí)的I/O節(jié)點(diǎn),使用原生的設(shè)備驅(qū)動使用I/O節(jié)點(diǎn),這樣就能夠?qū)崿F(xiàn)I/O設(shè)備功能被多個根節(jié)點(diǎn)獨(dú)立發(fā)現(xiàn)和配置。
[0062]步驟2: