專利名稱:X86計算機(jī)虛擬化的物理中斷處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及X86計算機(jī)體系結(jié)構(gòu)以及操作系統(tǒng)領(lǐng)域的中斷處理方法,尤其是X86計算 機(jī)虛擬化(visualization)的物理中斷處理方法。
背景技術(shù):
當(dāng)前,計算機(jī)的處理能力不斷快速提升,而根據(jù)相關(guān)統(tǒng)計,運行于其上的服務(wù)軟件在 系統(tǒng)空閑時段往往只用到了不到10%的處理能力,在忙時也往往用不到50%。與此同時, 計算機(jī)的能耗不斷加大,電能的消耗已經(jīng)逐漸成為IT業(yè)的主要開銷之一。另外,出于安 全和可靠等方面的考慮,大量的服務(wù)提供商必須使用多臺服務(wù)器以滿足數(shù)據(jù)備份、冗余 容錯和服務(wù)的安全隔離等方面的需求,這樣不僅大大增加了設(shè)備購置的資金投入、成倍 提高了電能消耗,而且由于大量服務(wù)器的利用率較低,造成了性價比嚴(yán)重低下。
為了解決這個問題,人們提出了虛擬化的概念,即通過虛擬機(jī)監(jiān)控器VMM (Virtual Machine Monitor),對真實計算機(jī)的CPU (Central Processing Unit,中央處理單元)、 內(nèi)存和硬件設(shè)備進(jìn)行虛擬化,在一臺真實的計算機(jī)上虛擬出多臺"虛擬機(jī)VM (Virtual Machine)",每臺虛擬機(jī)都可運行一個操作系統(tǒng)。這樣就能進(jìn)行服務(wù)器整合(server consolidation),即將多臺物理服務(wù)器整合為一臺物理服務(wù)器,從而大大提高服務(wù)器利 用率、降低能源消耗和提高安全性與可靠性。在桌面計算領(lǐng)域,虛擬化技術(shù)使得用戶能 夠同時運行多個不同的操作系統(tǒng),滿足了用戶對不同計算平臺的需求。
中斷是硬件設(shè)備與操作系統(tǒng)等系統(tǒng)軟件之間通信的主要方式之一,虛擬機(jī)監(jiān)控器需要 處理兩種類型的中斷 一是物理中斷(physical interrupt),指由X86計算機(jī)的真實硬 件設(shè)備所產(chǎn)生的中斷,包括設(shè)備產(chǎn)生的設(shè)備中斷和特殊的不可屏蔽中斷NMI(Nonmaskable Interrupt); 二是虛擬中斷(virtual interrupt),指由虛擬的硬件設(shè)備所產(chǎn)生的中斷。 在X86計算機(jī)中,所有的物理中斷都由可編程中斷控制器PIC (Programmable Interr叩t Controller)統(tǒng)一管理,系統(tǒng)軟件在處理物理中斷時,需要與PIC進(jìn)行交互,以確保中 斷的正確接收和處理,具體的交互方式和內(nèi)容參見X86體系結(jié)構(gòu)手冊 (http:〃www. intel. com和http:〃www. amd. com)。中斷處理方法也必須對PIC進(jìn)行初 始化和控制管理。
當(dāng)前虛擬機(jī)監(jiān)控器有兩大類體系結(jié)構(gòu):第一類體系結(jié)構(gòu)的虛擬機(jī)監(jiān)控器是應(yīng)用程序或 內(nèi)核模塊,實現(xiàn)于操作系統(tǒng)之中;第二類體系結(jié)構(gòu)的虛擬機(jī)監(jiān)控器是最底層的系統(tǒng)軟件 或固件,實現(xiàn)在操作系統(tǒng)之下。第一類虛擬機(jī)監(jiān)控器無需處理物理中斷,X86計算機(jī)的所 有物理中斷由其所在的操作系統(tǒng)進(jìn)行處理,因此此類虛擬機(jī)監(jiān)控器實現(xiàn)簡單、硬件適配性好。但是,作為內(nèi)核模塊實現(xiàn)在操作系統(tǒng)內(nèi)核中的虛擬機(jī)監(jiān)控器依賴于特定的操作系 統(tǒng),例如KVM只能運行于Linux內(nèi)核,VirtualPC則只能運行于Windows內(nèi)核,等等。某 些操作系統(tǒng)如Linux的內(nèi)核接口在版本升級時變化較大,增加了此類虛擬機(jī)監(jiān)控器的升 級維護(hù)開銷。而作為操作系統(tǒng)的應(yīng)用程序的虛擬機(jī)監(jiān)控器雖然比較容易實現(xiàn)跨平臺,例 如VMware workstation、 Qemu、 VirtualBox等產(chǎn)品均能夠在Linux和Windows等多平臺 上運行,但此類產(chǎn)品無法使用CPU等硬件提供的虛擬化支持功能,性能和功能都受到了 較大的限制。
第二類虛擬機(jī)監(jiān)控器運行在操作系統(tǒng)之下,自身實現(xiàn)了物理中斷處理功能。此類虛擬 機(jī)監(jiān)控器是最底層的系統(tǒng)軟件,能夠?qū)τ嬎銠C(jī)資源進(jìn)行更為底層和更為細(xì)膩的控制,并 能夠?qū)\行于其上的操作系統(tǒng)進(jìn)行管理和控制。此外,該類虛擬機(jī)監(jiān)控器還能夠?qū)τ嬎?機(jī)系統(tǒng)的物理資源進(jìn)行粗粒度的劃分和管理,這在服務(wù)器領(lǐng)域是非常有用的功能,特別 是對大規(guī)模服務(wù)器。作為代價,此類虛擬機(jī)監(jiān)控器需要對與物理中斷處理相關(guān)的X86計 算機(jī)硬件進(jìn)行初始化和控制、以及物理中斷處理等工作,實現(xiàn)復(fù)雜度要比第一類產(chǎn)品高 得多,同時必然導(dǎo)致整個系統(tǒng)硬件適配性的降低。此類虛擬機(jī)監(jiān)控器產(chǎn)品主要有Xen和 VMware ESX Server等。
上述第二類虛擬機(jī)監(jiān)控器系統(tǒng)從下至上由三層組成最底層是X86計算機(jī)硬件與中斷 層,包括本地高級可編程中斷控制器LAPIC (Local Advanced Programmable Interrupt Controllers輸入/輸出高級可編程中斷控制器IOAPIC ( 1叩ut/0utput Advanced Programmable Interrupt Controller)、 CPU、內(nèi)存和除此之外的硬件設(shè)備,如網(wǎng)卡、磁 盤等,X86計算機(jī)的中斷包括設(shè)備中斷和剛I;中間層是虛擬機(jī)監(jiān)控器;最上層是同時運 行的多個虛擬化操作系統(tǒng),包括一個負(fù)責(zé)硬件設(shè)備驅(qū)動的domO (domain 0, 0號域)操 作系統(tǒng),以及一個或多個domU (domain user,用戶域)操作系統(tǒng)。虛擬機(jī)監(jiān)控器由物理 中斷處理模塊和虛擬中斷處理模塊、CPU指令虛擬化模塊、內(nèi)存管理單元MMU (Memory Management Unit)虛擬化模塊組成。物理中斷處理模塊由LAPIC初始化子模塊、IOAPIC 初始化子模塊、CPU運行模式配置子模塊、物理中斷接收子模塊、物理中斷轉(zhuǎn)發(fā)子模塊、 虛擬中斷控制器VPIC (Virtual Programmable Interr叩t Controller)子模塊、處理器 間中斷IPI (Inter-Processor Interrupt)發(fā)送與接收子模塊組成。
物理中斷接收子模塊在收到X86計算機(jī)的設(shè)備中斷和NMI后,將其傳遞給物理中斷轉(zhuǎn) 發(fā)子模塊,物理中斷轉(zhuǎn)發(fā)子模塊將中斷轉(zhuǎn)發(fā)到domO操作系統(tǒng)。LAPIC初始化子模塊與 IOAPIC初始化子模塊分別初始化X86計算機(jī)的LAPIC和IOAPIC, VPIC子模塊向domO操 作系統(tǒng)提供虛擬的可編程中斷控制器VPIC,并通過訪問初始化后的LAPIC與IOAPIC實現(xiàn) domO操作系統(tǒng)的對VPIC的請求和調(diào)用。IPI發(fā)送與接收子模塊則通過訪問LAPIC向虛擬 中斷處理模塊和MMU虛擬化模塊提供處理器間中斷服務(wù)。CPU運行模式配置子模塊按下述 第三步給出的方法對CPU的運行模式進(jìn)行配置。
虛擬中斷處理模塊接收來自doraO操作系統(tǒng)的虛擬中斷,將其轉(zhuǎn)發(fā)到domU操作系統(tǒng),CPU指令虛擬化模塊和MMU虛擬化模塊則為domO和domU操作系統(tǒng)提供CPU指令虛擬化和 MMU虛擬化服務(wù)。
此類虛擬機(jī)監(jiān)控器的物理中斷處理模塊通過如下步驟實現(xiàn)物理中斷處理
第一步,LAPIC初始化子模塊與IOAPIC初始化子模塊分別初始化LAPIC與IOAPIC。 在當(dāng)前主流的對稱多處理SMP (Symmetric-Multiprocessing)計算機(jī)中,可編程中斷控 制器PIC主要由兩組芯片組成,即IOAPIC和LAPIC。當(dāng)X86計算機(jī)加電引導(dǎo)時,此類虛 擬機(jī)監(jiān)控器就接管了PIC,對PIC進(jìn)行全面初始化,并始終保持對PIC進(jìn)行獨占式訪問和 管理。這些初始化工作包括探測各個PIC芯片是否存在、為每個PIC芯片映射相應(yīng)的 寄存器器以訪問該P(yáng)IC芯片、啟用上述每個PIC芯片、對SMP系統(tǒng)中的每個CPU進(jìn)行編 號、對每個PIC芯片按X86體系結(jié)構(gòu)手冊的硬件規(guī)范進(jìn)行全面的設(shè)置和管理等,初始化 過程非常復(fù)雜,詳見Intel和AMD的CPU體系結(jié)構(gòu)手冊。上述PIC的每組芯片都有相應(yīng) 的技術(shù)規(guī)范,隨著時間的推移,各種新功能和新特性不斷地加入到規(guī)范中。為了利用這 些新功能和新特性,此類虛擬機(jī)監(jiān)控器必須不斷地更新版本,改進(jìn)其初始化和管理流程。
第二步,物理中斷接收子模塊構(gòu)建接收和處理物理中斷所需要的軟件環(huán)境。按X86 體系結(jié)構(gòu)的規(guī)定,為了正確接收物理中斷,必須初始化CPU的中斷描述符表IDT (Interrupt Description Table),并為每個物理中斷準(zhǔn)備中斷處理函數(shù)。IDT表中共有 256項(第0項到第255項),即支持256個物理中斷。初始化IDT表即初始化IDT表中 的全部256項,方法是為每個物理中斷指定一個中斷處理函數(shù)(即準(zhǔn)備256個物理中斷 處理函數(shù)),并將這些中斷處理函數(shù)首地址填入IDT的相應(yīng)表項中。
第三步,CPU運行模式配置子模塊配置CPU的運行模式。Intel公司和腦D公司的CPU 都對虛擬化提供了硬件支持,它們的CPU都增加了一種新的運行模式,即虛擬化模式, 當(dāng)CPU處于虛擬化模式時,如果產(chǎn)生了一個物理中斷,則根據(jù)配置的不同,CPU采用如 下兩種方式之一對物理中斷進(jìn)行響應(yīng)
CPU不通知虛擬機(jī)監(jiān)控器,而是直接將中斷傳送給當(dāng)前正在虛擬化模式中運行的 操作系統(tǒng)處理;
CPU停止運行當(dāng)前處于虛擬化模式中的操作系統(tǒng),通知虛擬機(jī)監(jiān)控器有中斷到達(dá), 由虛擬機(jī)監(jiān)控器決定后續(xù)如何處理該中斷。
此類虛擬機(jī)監(jiān)控器之上能夠同時運行多個操作系統(tǒng),其中只有domO操作系統(tǒng)能夠訪 問真實的硬件。此類虛擬機(jī)監(jiān)控器自身并不包含設(shè)備驅(qū)動程序,所有的硬件設(shè)備均在domO 操作系統(tǒng)中被驅(qū)動。此類虛擬機(jī)監(jiān)控器通過配置CPU,使得虛擬機(jī)監(jiān)控器自身和domO操 作系統(tǒng)運行于CPU的普通模式,而讓domU操作系統(tǒng)運行于CPU的虛擬化模式。并且,當(dāng) CPU處于普通模式和虛擬化模式時,均打開CPU的中斷允許標(biāo)志,使得到達(dá)的物理中斷能 夠立即被觸發(fā)。
第四步,VPIC子模塊為上層操作系統(tǒng)提供虛擬可編程中斷控制器VPIC(Virtual PIC),保證上層操作系統(tǒng)對下面第六步中轉(zhuǎn)發(fā)過去的物理中斷的正確處理。按X86體系結(jié)構(gòu)的 規(guī)定,當(dāng)操作系統(tǒng)接收到中斷并處理完畢后,中斷處理程序需要基于PIC接口對PIC進(jìn) 行"中斷結(jié)束(End-Of-Interrupt, EOI)"操作。此外,在中斷處理過程中,X86體系結(jié) 構(gòu)還允許中斷服務(wù)程序或設(shè)備驅(qū)動程序根據(jù)需要對某個中斷進(jìn)行屏蔽和解除屏蔽,以及 改變某個中斷的優(yōu)先級等等其它操作。由于X86計算機(jī)真實的PIC被虛擬機(jī)監(jiān)控器獨占 訪問,因此虛擬機(jī)監(jiān)控器需要虛擬一套VPIC,供上層domO使用。為了使用該VPIC,必 須修改domO操作系統(tǒng)的實現(xiàn)代碼,讓doniO操作系統(tǒng)不再訪問真實的PIC,而通過虛擬機(jī) 監(jiān)控器指定的協(xié)議訪問VPIC。當(dāng)domO操作系統(tǒng)對VPIC進(jìn)行中斷結(jié)束等操作時,此類虛 擬機(jī)監(jiān)控器再通過訪問真實的PIC來最終實現(xiàn)相應(yīng)的操作。
當(dāng)上述四個步驟完成后,物理中斷處理方法的初始化流程結(jié)束,此后物理中斷處理方 法轉(zhuǎn)入第五步進(jìn)入循環(huán),以并行處理兩個事件
第五步,當(dāng)物理中斷到達(dá)時,轉(zhuǎn)第六步;當(dāng)虛擬機(jī)的其它模塊或上層操作系統(tǒng)請求發(fā) 送和接收處理器間中斷IPI時,轉(zhuǎn)第八步。
第六步,當(dāng)有物理中斷到達(dá)時,物理中斷接收子模塊根據(jù)當(dāng)前CPU所處模式的不同, 按不同的方法接收物理中斷。根據(jù)上述配置,當(dāng)CPU處于普通模式,即當(dāng)前正在運行虛 擬機(jī)監(jiān)控器或doraO操作系統(tǒng)時,到達(dá)的物理中斷將使得CPU中斷當(dāng)前的工作,然后根據(jù) 物理中斷號從IDT表中取出相應(yīng)的中斷處理程序的地址,并跳轉(zhuǎn)到該地址進(jìn)行中斷處理。 當(dāng)CPU處于虛擬化模式,即當(dāng)前正在運行domU操作系統(tǒng)時,如果有物理中斷到達(dá),CPU 將中斷當(dāng)前操作系統(tǒng)的運行,并通知虛擬機(jī)監(jiān)控器,虛擬機(jī)監(jiān)控器再根據(jù)上述中斷處理 方法接收中斷。
第七步,物理中斷轉(zhuǎn)發(fā)子模塊將接收到的物理中斷轉(zhuǎn)發(fā)到domO操作系統(tǒng)。當(dāng)CPU接 收到物理中斷并轉(zhuǎn)入運行在IDT表中指定的中斷處理程序后,該中斷處理程序就調(diào)用物 理中斷轉(zhuǎn)發(fā)子模塊,由該子模塊將相應(yīng)的物理中斷轉(zhuǎn)發(fā)到dom0操作系統(tǒng),供dom0操作 系統(tǒng)中的相應(yīng)設(shè)備驅(qū)動程序進(jìn)行真正的中斷處理。物理中斷轉(zhuǎn)發(fā)的方法是模擬當(dāng)物理中 斷產(chǎn)生時CPU的行為,包括構(gòu)造中斷現(xiàn)場、保存相關(guān)寄存器、設(shè)置相關(guān)軟硬件標(biāo)志等步 驟,詳見Intel和AMD的X86體系結(jié)構(gòu)手冊。該物理中斷轉(zhuǎn)發(fā)方法讓dom0操作系統(tǒng)以為 該中斷直接來自于硬件設(shè)備,從而保證domO操作系統(tǒng)正確接收物理中斷。上述過程處理 完成后,轉(zhuǎn)第五步開始下一次循環(huán)。
第八步,IPI發(fā)送與接收子模塊實現(xiàn)處理器間中斷IPI的發(fā)送和接收。在對稱多處理 SMP系統(tǒng)中,存在著多個同構(gòu)的CPU, CPU之間的通信是通過IPI實現(xiàn)的,虛擬機(jī)監(jiān)控器 自身以及其上運行的操作系統(tǒng)都需要通過IPI實現(xiàn)處理器之間的通信。此類虛擬機(jī)監(jiān)控 器與Linux等操作系統(tǒng)一樣,選擇空閑的物理中斷號作為IPI中斷的中斷號。當(dāng)虛擬機(jī) 監(jiān)控器的其它模塊或上層操作系統(tǒng)需要進(jìn)行IPI通信時,此類虛擬機(jī)監(jiān)控器訪問PIC提 供的IPI發(fā)送接口,向SMP系統(tǒng)中的一個或多個CPU發(fā)送給定中斷號的物理中斷。發(fā)送 IPI時,可以發(fā)送給某幾個CPU,也可以發(fā)送給SMP系統(tǒng)中的全部CPU。當(dāng)發(fā)送給系統(tǒng)中的某幾個CPU時,需要指定其CPU的編號,這些CPU的編號是在進(jìn)行PIC初始化時分配 好的。由于IPI的中斷號是某個空閑的物理中斷的中斷號,因此接收IPI的方法與接收 該空閑物理中斷的方法完全相同,見第六步。IPI消息中包含一個IPI消息接收和處理函 數(shù)的地址,當(dāng)IPI被目標(biāo)CPU接收到以后,該IPI消息接收和處理函數(shù)被調(diào)用,從而實 現(xiàn)IPI通信。IPI發(fā)送或接收完畢后,轉(zhuǎn)第五步進(jìn)入下一次循環(huán)。
這種中斷處理方法存在的主要問題是實現(xiàn)復(fù)雜、代碼龐大,而且大大增加了中斷處理 的開銷。
1. 實現(xiàn)復(fù)雜、代碼龐大
由于這種中斷處理方法需要獨占式地訪問和管理PIC,因此與操作系統(tǒng)的中斷處理模 塊一樣,為了保證中斷的正確處理,這種方法需要使用PIC的大量復(fù)雜功能,并實現(xiàn)對 PIC的全面管理。X86計算機(jī)經(jīng)過幾十年的發(fā)展,其PIC的型號、接口和功能都有很大的 發(fā)展和變化,使得這種方法的中斷處理代碼既龐大又復(fù)雜。
近年來,虛擬化領(lǐng)域的一個重要發(fā)展方向是將虛擬機(jī)監(jiān)控器作為固件(firmware)集 成到計算機(jī)中,為計算機(jī)提供虛擬化擴(kuò)展功能,這要求虛擬機(jī)監(jiān)控器的各項功能,包括 中斷處理方法,應(yīng)該盡可能簡單。采用這種中斷處理方法的虛擬機(jī)監(jiān)控器由于邏輯非常 復(fù)雜、代碼量大而難于作為固件集成到計算機(jī)中。
2. 大大增加了中斷處理的開銷
當(dāng)操作系統(tǒng)直接運行在X86計算機(jī)之上時,來自硬件設(shè)備的物理中斷將直接被操作系 統(tǒng)接收,操作系統(tǒng)將直接調(diào)用相應(yīng)的設(shè)備驅(qū)動程序進(jìn)行中斷處理。當(dāng)處理完成后,操作 系統(tǒng)直接向PIC發(fā)送"中斷結(jié)束"命令。而運行了此類虛擬機(jī)監(jiān)控器之后,來自硬件設(shè) 備的物理中斷先被此類虛擬機(jī)監(jiān)控器接收,它再通過大量的代碼設(shè)置中斷現(xiàn)場、保存相 關(guān)寄存器和設(shè)置相關(guān)軟硬件標(biāo)志,才能將該物理中斷轉(zhuǎn)發(fā)給domO操作系統(tǒng)。由于物理中 斷很多很密集,這些中斷轉(zhuǎn)發(fā)代碼將增加大量的CPU處理開銷,從而導(dǎo)致CPU利用率降 低。
此外,在中斷處理過程中和處理完畢后,domO操作系統(tǒng)會向VPIC發(fā)送"中斷結(jié)束" 等命令,這些命令也必須通過VPIC和虛擬機(jī)監(jiān)控器,才能最終發(fā)給真正的PIC,整個處 理過程要比直接在X86計算機(jī)上運行操作系統(tǒng)復(fù)雜得多。由于每次物理中斷至少需要一 次中斷結(jié)束命令,因此這種復(fù)雜度也導(dǎo)致了中斷處理開銷的大幅上升。
上述兩個問題是現(xiàn)有物理中斷處理方法所固有的,除此之外,當(dāng)前實現(xiàn)物理中斷處理 方法的主流虛擬機(jī)監(jiān)控器產(chǎn)品,例如Xen、 VMware ESX Server等,還存在一個較大的問 題,即它們都需要定制Linux以配合進(jìn)行物理中斷處理和硬件設(shè)備驅(qū)動。Xen需要定制 domO Linux使其訪問虛擬機(jī)的VPIC; VMware ESX Server則需要裁剪一個Linux內(nèi)核以 負(fù)責(zé)驅(qū)動所有硬件設(shè)備,這要求VMware公司維護(hù)所有硬件設(shè)備驅(qū)動程序,其難度和工作 量都十分巨大。本發(fā)明要解決的技術(shù)問題是:針對同時運行多個虛擬化操作系統(tǒng)的X86計算機(jī)中物理
中斷處理方法實現(xiàn)復(fù)雜、代碼龐大和導(dǎo)致中斷處理開銷大等問題,提供一種新的物理中
斷處理方法不接收和處理任何物理中斷,而是使物理中斷直接在domO操作系統(tǒng)中觸發(fā) 和處理,同時允許domO操作系統(tǒng)直接訪問真實的PIC,從而極大降低物理中斷處理的實 現(xiàn)復(fù)雜度,并大大降低物理中斷處理的開銷。此外,本發(fā)明不依賴于特定的操作系統(tǒng), 即所有操作系統(tǒng)都可不加修改地運用本發(fā)明接收和處理物理中斷,以實現(xiàn)對硬件設(shè)備的 驅(qū)動。
本發(fā)明的技術(shù)方案是-
首先構(gòu)建虛擬機(jī)系統(tǒng)。與背景技術(shù)中的第二類虛擬機(jī)監(jiān)控器系統(tǒng)一樣,本發(fā)明所構(gòu)建 的虛擬機(jī)系統(tǒng)也由三部分組成最底層是X86計算機(jī)硬件與中斷;中間層是虛擬機(jī)監(jiān)控 器;最上層是同時運行的多個虛擬化操作系統(tǒng),包括一個dom0操作系統(tǒng),一個或多個domU 操作系統(tǒng)。虛擬機(jī)監(jiān)控器由物理中斷處理模塊和虛擬中斷處理模塊、CPU指令虛擬化模塊、 麗U虛擬化模塊組成,其中后三個模塊與背景技術(shù)中的虛擬機(jī)監(jiān)控器系統(tǒng)中對應(yīng)的模塊完 全相同。物理中斷處理模塊由LAPIC初始化子模塊、CPU運行模式配置子模塊、dom0 LAPIC 初始化監(jiān)視子模塊、domO設(shè)備中斷接收輔助子模塊、IPI發(fā)送與接收子模塊、NMI接收和 處理子模塊這六個子模塊組成。
物理中斷包括設(shè)備中斷和NMI兩類。CPU運行模式配置子模塊配置CPU的運行模式并 接收從CPU發(fā)來的設(shè)備中斷信息,再調(diào)用dom0設(shè)備中斷接收輔助子模塊,在dom0設(shè)備 中斷接收輔助子模塊的控制下,設(shè)備中斷直接傳遞給domO操作系統(tǒng)。所有的NMI都傳遞 給NMI接收和處理子模塊,該子模塊接收NMI后進(jìn)行判斷,如果NMI是IPI消息導(dǎo)致的, 則將該麗I傳送給IPI發(fā)送與接收子模塊,否則將NMI轉(zhuǎn)發(fā)至domO操作系統(tǒng)。LAPIC初 始化子模塊在X86計算機(jī)系統(tǒng)加電引導(dǎo)時對LAPIC進(jìn)行部分初始化,在domO LAPIC初 始化監(jiān)視子模塊的監(jiān)控下,domO操作系統(tǒng)直接訪問經(jīng)初始化的LAPIC,當(dāng)CPU指令虛擬 化模塊檢測到domO對LAPIC重新初始化時,CPU指令虛擬化模塊通知domO LAPIC初始化 監(jiān)視子模塊,由domO LAPIC初始化監(jiān)視子模塊調(diào)用LAPIC初始化子模塊對LAPIC進(jìn)行重 配置。IPI發(fā)送與接收子模塊直接訪問LAPIC進(jìn)行IPI消息的發(fā)送與接收。
構(gòu)建好虛擬機(jī)系統(tǒng)后,由虛擬機(jī)系統(tǒng)對物理中斷進(jìn)行處理,方法是-
第一步,NMI接收和處理子模塊構(gòu)建接收和處理NMI所需要的軟件環(huán)境,方法為
構(gòu)建隨I中斷的中斷處理函數(shù),將該中斷處理函數(shù)的地址放入IDT表的第2項中(這 是因為NMI的中斷號為2, NMI接收和處理子模塊只接收NMI中斷),當(dāng)NMI中斷到達(dá)時, 該中斷處理函數(shù)被調(diào)用。
第二步,IPI發(fā)送與接收子模塊按如下方法初始化IPI發(fā)送與接收所需的軟件環(huán)境-2. 1選用不可屏蔽中斷醒I的中斷號2作為IPI的中斷號。在虛擬機(jī)監(jiān)控器運行期 間,雖然屏蔽了 CPU的中斷允許標(biāo)志,但是根據(jù)X86體系結(jié)構(gòu)手冊,麗I即使在CPU的中 斷允許標(biāo)志被屏蔽時仍然能夠被觸發(fā)和接收,使得虛擬機(jī)監(jiān)控器能夠立即接收到IPI消 息;
2. 2為每個CPU都設(shè)置一個先進(jìn)先出的隊列結(jié)構(gòu)作為IPI消息隊列,記錄當(dāng)前CPU 接收的所有IPI消息,使得IPI消息不丟失,并能夠按序進(jìn)行處理。同時為每個IPI消 息隊列設(shè)置一個"消息隊列鎖",保證對該IPI消息隊列訪問的原子性。
第三步,LAPIC初始化子模塊對本地高級可編程中斷控制器LAPIC進(jìn)行基本初始化。 如前所述,X86計算機(jī)中配備了多組PIC,包括輸入/輸出高級可編程中斷控制器IOAPIC 和本地高級可編程中斷控制器LAPIC, LAPIC初始化子模塊僅對LAPIC進(jìn)行最基本的初始 化,方法如下
3. 1探測X86系統(tǒng)中是否配備了 LAP工C。探測方法是設(shè)置CPU的EAX寄存器為1,再 執(zhí)行CPUID這條CPU指令,最后檢查EDX寄存器的第9位是否為1,如果為1則LAPIC 存在。如果系統(tǒng)中不存在LAPIC,則轉(zhuǎn)第四步,否則執(zhí)行3.2;
3. 2映射LAPIC的寄存器。按照X86體系結(jié)構(gòu)手冊的規(guī)定,SMP系統(tǒng)中每個CPU都 有自己的LAP工C,而每個CPU的LAPIC的所有寄存器都被內(nèi)存映射(memory mapping)到 物理地址從OxFEEOOOOO開始的4KB大小的物理內(nèi)存中。為了訪問當(dāng)前CPU的LAPIC的寄 存器,采用國際上通用的映射方法為這4KB的物理地址區(qū)間映射相應(yīng)的虛擬地址;
3.3啟用LAPIC,即向LAPIC的寄存器中寫入數(shù)據(jù)。
第四步,domO操作系統(tǒng)、domU操作系統(tǒng)和虛擬機(jī)監(jiān)控器分別運行在三種不同的CPU 運行模式中,CPU運行模式配置子模塊按如下方法分別配置domO操作系統(tǒng)、domU操作系 統(tǒng)和虛擬機(jī)監(jiān)控器的運行模式
4.1對domO操作系統(tǒng),按如下方法配置CPU的運行模式
*配置domO操作系統(tǒng)的運行模式為CPU的虛擬化模式,而不是國際同類方法所配 置的普通模式;
配置domO操作系統(tǒng)的中斷觸發(fā)模式為直接觸發(fā)和處理模式,即當(dāng)domO操作系統(tǒng) 運行時,到達(dá)的物理中斷不通知物理中斷處理模塊,而直接在domO操作系統(tǒng)中 被觸發(fā)和處理;
當(dāng)domO操作系統(tǒng)運行時,打開CPU的中斷允許標(biāo)志。
4. 2對doraU操作系統(tǒng),按如下方法配置CPU的運行模式
*與國際同類方法一樣,配置domU操作系統(tǒng)的運行模式為CPU的虛擬化模式; *與國際同類方法一樣,配置domU操作系統(tǒng)的中斷觸發(fā)模式為退出運行并通知中斷處理模塊這種模式,即當(dāng)domU操作系統(tǒng)運行時,到達(dá)的物理中斷將中斷domU 操作系統(tǒng)的運行,并馬上通知物理中斷處理模塊;
*與國際同類方法一樣,當(dāng)這些操作系統(tǒng)運行時,打開CPU的中斷允許標(biāo)志。
4.3對虛擬機(jī)監(jiān)控器,按如下方法配置CPU的運行模式
*與國際同類方法一樣,配置虛擬機(jī)監(jiān)控器的運行模式為CPU的普通模式;
*在虛擬機(jī)監(jiān)控器運行期間,始終關(guān)閉CPU的中斷允許標(biāo)志。國際同類方法則恰好 相反,始終打開CPU的中斷允許標(biāo)志。
上述四個步驟完成以后,初始化流程結(jié)束,進(jìn)入第五步,分別由dom0 LAPIC初始化 監(jiān)視子模塊、dom()設(shè)備中斷接收輔助子模塊、IPI發(fā)送與接收子模塊、NMI接收和處理子 模塊監(jiān)測和處理四個事件
第五步,當(dāng)domO LAPIC初始化監(jiān)視子模塊監(jiān)測到dom0操作系統(tǒng)對LAPIC進(jìn)行初始化 操作時,轉(zhuǎn)5. 1;當(dāng)domO設(shè)備中斷接收輔助子模塊監(jiān)測到設(shè)備中斷到達(dá)時,轉(zhuǎn)5.2;當(dāng) 麗I接收和處理子模塊監(jiān)測到不可屏蔽中斷NMI到達(dá)時,轉(zhuǎn)5. 3;當(dāng)IPI發(fā)送與接收子模 塊檢測到虛擬機(jī)的其它模塊或上層操作系統(tǒng)請求發(fā)送和接收處理器間中斷IPI時,轉(zhuǎn) 5.4。
5. 1由于dom0操作系統(tǒng)可以直接訪問PIC,因而dom0操作系統(tǒng)會對LAPIC進(jìn)行重 新初始化,而X86體系結(jié)構(gòu)的某些型號的CPU允許改變LAPIC寄存器的內(nèi)存映射地址, 即將默認(rèn)的0xFEE00000改為其它的值,這種修改是通過訪問編號為0xlB的型號相關(guān)寄 存器(Model-Specific Registers, MSR)進(jìn)行的。其它型號的CPU不允許改變LAPIC寄 存器的內(nèi)存映射地址,此時domO LAPIC初始化監(jiān)視子模塊將監(jiān)測不到domO操作系統(tǒng)對 LAPIC的初始化操作。CPU指令虛擬化模塊截獲domO操作系統(tǒng)讀寫MSR的指令 rdmsr/wrmsr,并將結(jié)果交給domO LAPIC初始化監(jiān)視子模塊,domO LAPIC初始化監(jiān)視子 模塊判斷domO操作系統(tǒng)是否訪問編號為OxlB的MSR,如果是則判斷LAPIC寄存器的內(nèi)存 映射地址是否被改變,如果改變則將新地址記錄下來,并按3.2所示的方法重新映射 LAPIC的寄存器。如果不改變則轉(zhuǎn)第五步,進(jìn)入下一次循環(huán)。
5. 2 domO設(shè)備中斷接收輔助子模塊分下列三種情況輔助domO操作系統(tǒng)接收設(shè)備中 斷。與國際同類方法不同,物理中斷處理模塊自身并不接收設(shè)備中斷,而僅僅輔助domO 操作系統(tǒng)接收設(shè)備中斷,保證所有的設(shè)備中斷都直接在domO操作系統(tǒng)中觸發(fā)從而被domO 操作系統(tǒng)直接接收和處理
* 當(dāng)設(shè)備中斷到達(dá)時,如果CPU正在運行domU操作系統(tǒng),則CPU中斷domU操作系 統(tǒng)的運行,并將設(shè)備中斷到達(dá)情況通知d咖O設(shè)備中斷接收輔助子模塊,domO設(shè) 備中斷接收輔助子模塊馬上請求虛擬機(jī)監(jiān)控器轉(zhuǎn)入運行domO操作系統(tǒng)。等到 domO操作系統(tǒng)開始運行時,設(shè)備中斷將立即被觸發(fā)并被domO操作系統(tǒng)接收。* 當(dāng)設(shè)備中斷到達(dá)時,如果CPU正在運行domO操作系統(tǒng),設(shè)備中斷直接在domO操 作系統(tǒng)中被觸發(fā),domO設(shè)備中斷接收輔助子模塊無需進(jìn)行任何處理;
*當(dāng)設(shè)備中斷到達(dá)時,如果CPU正在運行虛擬機(jī)監(jiān)控器自身,則由于CPU的中斷允 許標(biāo)志被屏蔽,到達(dá)的設(shè)備中斷不會被觸發(fā),domO設(shè)備中斷接收輔助子模塊也無 需進(jìn)行任何處理;
上述處理完畢后,轉(zhuǎn)第五步進(jìn)入下一次循環(huán)。
5. 3麗I接收和處理子模塊接收和處理不可屏蔽中斷麗I,方法是判斷IPI發(fā)送與接 收子模塊是否正在發(fā)送IPI消息,如果正在發(fā)送IPI消息,則該NMI是由于發(fā)送IPI消 息引起的,則由IPI發(fā)送與接收子模塊按5. 4. 2所述方法接收和處理IPI消息;否則, 將麗I轉(zhuǎn)發(fā)到domO操作系統(tǒng),domO操作系統(tǒng)將異步處理該NMI。上述兩種情況處理完成 后,都轉(zhuǎn)第五步進(jìn)入下一次循環(huán)。
5. 4如果IPI發(fā)送與接收子模塊被請求發(fā)送IPI,轉(zhuǎn)5. 4. 1;如果NMI接收和處理子 模塊接收到NMI后調(diào)用IPI發(fā)送與接收子模塊,轉(zhuǎn)5. 4. 2:
5.4. 1按下述方法向一個或多個目標(biāo)CPU發(fā)送一個IPI消息
5. 4. 1. 1獲得目標(biāo)CPU的消息隊列鎖,把IPI消息加入到該IPI消息的目標(biāo)CPU的 IPI消息隊列中,再釋放目標(biāo)CPU的消息隊列鎖;
5. 4. 1. 2通過訪問LAPIC的寄存器,向SMP系統(tǒng)中的其它全部CPU發(fā)送該IPI消息, 發(fā)送參數(shù)中設(shè)置的IPI中斷號為NMI的中斷號2。
5.4.1.3轉(zhuǎn)第五步進(jìn)入下一次循環(huán)。
5. 4. 2按下述方法接收和處理IPI消息
5.4.2.1先獲得本CPU的消息隊列鎖,再判斷消息隊列是否為空,如果為空則釋放 本CPU的消息隊列鎖,轉(zhuǎn)5.4.2.3;如果消息隊列不為空,執(zhí)行5.4.2.2;
5. 4. 2. 2從本CPU的IPI消息隊列中取出一個IPI消息,釋放本CPU的消息隊列鎖, 調(diào)用IPI消息中包含的IPI接收和處理函數(shù)實現(xiàn)IPI通信,轉(zhuǎn)5. 4. 2. 1。
5.4.2.3轉(zhuǎn)第五步進(jìn)入下一次循環(huán)。
采用本發(fā)明能夠達(dá)到如下的技術(shù)效果-
1.采用本發(fā)明能極大地簡化中斷處理邏輯、縮減虛擬機(jī)監(jiān)控器的代碼量,采用本發(fā) 明實現(xiàn)的虛擬機(jī)監(jiān)控器的二進(jìn)制數(shù)據(jù)量不超過1兆字節(jié)(1MB),能夠方便地作為 固件集成到X86計算機(jī)的只讀存儲器ROM (Read-Only Memory)中。按本發(fā)明實現(xiàn) 的物理中斷處理模塊本身不接收物理中斷,而只是輔助domO操作系統(tǒng)接收物理中 斷,使得到達(dá)的物理中斷都在domO操作系統(tǒng)中被觸發(fā)和處理,不需要進(jìn)行物理中斷轉(zhuǎn)發(fā),也不需要虛擬PIC,從而大大簡化了物理中斷處理邏輯、提高了物理中斷 處理效率
2. 采用本發(fā)明能極大地減小中斷處理的開銷、增強(qiáng)整個計算機(jī)系統(tǒng)的穩(wěn)定性,使得 具有優(yōu)秀的硬件適配性。首先,本發(fā)明僅初始化LAPIC,且只初始化LAPIC的最基 本的部分,即LAPIC的探測、映射和啟用。這部分信息早巳成熟和穩(wěn)定,已經(jīng)保 持了十多年沒有變化,并且在將來的X86計算機(jī)平臺上也必須向下兼容而保持不 變。這保證了本發(fā)明具有良好的平臺適配性,能夠廣泛適用于現(xiàn)在和將來的X86 計算平臺。
3. 本發(fā)明不依賴于特定的操作系統(tǒng),無需修改操作系統(tǒng)的內(nèi)核,也無需維護(hù)任何硬 件設(shè)備驅(qū)動,任何操作系統(tǒng)都能夠不加修改地直接運行于按本發(fā)明實現(xiàn)的虛擬機(jī) 監(jiān)控器之上。
圖1為背景技術(shù)Xen等虛擬機(jī)的系統(tǒng)結(jié)構(gòu)圖; 圖2為本發(fā)明第一步構(gòu)建的虛擬機(jī)系統(tǒng)結(jié)構(gòu)圖; 圖3為本發(fā)明第5. 2步的中斷處理時序圖; 圖4為本發(fā)明第5. 3步的IPI消息發(fā)送與接收邏輯圖。
具體實施例方式
圖1是背景技術(shù)Xen等虛擬機(jī)的系統(tǒng)結(jié)構(gòu)圖,從下至上由三層組成最底層是X86 計算機(jī)硬件與中斷層,包括LAPIC、 IOAPIC、 CPU、內(nèi)存和除此之外的硬件設(shè)備,如網(wǎng)卡、 磁盤等,X86計算機(jī)的物理中斷包括設(shè)備中斷和NMI;中間層是虛擬機(jī)監(jiān)控器;最上層是 同時運行的多個虛擬化操作系統(tǒng),包括doinO操作系統(tǒng)和一個或多個domU操作系統(tǒng)。虛 擬機(jī)監(jiān)控器由物理中斷處理模塊和虛擬中斷處理模塊、CPU指令虛擬化模塊、醒U虛擬化 模塊組成。物理中斷處理模塊由LAPIC初始化子模塊、IOAPIC初始化子模塊、CPU運行 模式配置子模塊、物理中斷接收子模塊、物理中斷轉(zhuǎn)發(fā)子模塊、虛擬中斷控制器VPIC子 模塊、IPI發(fā)送與接收子模塊組成。
物理中斷接收子模塊將接收到的設(shè)備中斷和NMI傳遞給物理中斷轉(zhuǎn)發(fā)子模塊,物理中 斷轉(zhuǎn)發(fā)子模塊將設(shè)備中斷和NMI轉(zhuǎn)發(fā)到dom0操作系統(tǒng)。LAPIC初始化子模塊與IOAPIC 初始化子模塊分別初始化LAPIC和IOAPIC, VPIC子模塊向dom0操作系統(tǒng)提供虛擬的可 編程中斷控制器VPIC,通過訪問初始化后的LAPIC與IOAPIC實現(xiàn)dom0操作系統(tǒng)的對VPIC 的請求和調(diào)用。IPI發(fā)送與接收子模塊通過訪問LAPIC向虛擬中斷處理模塊和隨U虛擬化 模塊提供處理器間中斷服務(wù)。
虛擬中斷處理模塊將從dom0操作系統(tǒng)接收的虛擬中斷轉(zhuǎn)發(fā)到domU操作系統(tǒng),CPU指令虛擬化模塊和MMU虛擬化模塊則為dom0和domll操作系統(tǒng)分別提供CPU指令虛擬化和 麗U虛擬化服務(wù)。
圖2是本發(fā)明第一步構(gòu)建的虛擬機(jī)系統(tǒng)結(jié)構(gòu)圖,整個虛擬機(jī)系統(tǒng)從下至上也被分成三 個部分最底層是X86計算機(jī)硬件與中斷;中間層是虛擬機(jī)監(jiān)控器;最上層是同時運行 的多個虛擬化操作系統(tǒng)。虛擬機(jī)監(jiān)控器由物理中斷處理模塊和虛擬中斷處理模塊、指令 虛擬化模塊、MMU虛擬化模塊組成,其中后三個模塊與背景技術(shù)中的虛擬機(jī)監(jiān)控器系統(tǒng)中 對應(yīng)的模塊完全相同,唯一不同的是物理中斷處理模塊。物理中斷處理模塊由LAPIC初 始化子模塊、CPU運行模式配置子模塊、dom0 LAPIC初始化監(jiān)視子模塊、dom0設(shè)備中斷 接收輔助子模塊、IPI發(fā)送與接收子模塊、薩I接收和處理子模塊這六個子模塊組成。
LAPIC初始化子模塊對LAPIC進(jìn)行部分初始化先判斷系統(tǒng)中是否存在LAPIC,如果 存在則映射LAPIC的寄存器,即將從0xFEE00000開始的4KB物理內(nèi)存映射到CPU可訪問 的虛擬地址空間中,最后通過訪問LAPIC的寄存器激活LAPIC。
domO LAPIC初始化監(jiān)視子模塊在CPU指令虛擬化模塊的輔助下,截獲domO操作系統(tǒng) 讀寫MSR的指令rdmsr/wrmsr,判斷是否訪問編號為OxlB的MSR,如果是則判斷LAPIC 寄存器的內(nèi)存映射地址是否被改變?nèi)绻淖儎t將新地址記錄下來,并調(diào)用LAPIC初始 化子模塊,以重新映射LAPIC的寄存器;如果不改變則無需任何操作。
CPU運行模式配置子模塊對CPU的運行模式進(jìn)行配置,使得domO操作系統(tǒng)運行在CPU 的虛擬化模式,且使得到達(dá)的物理中斷不通知物理中斷處理模塊而直接被domO操作系統(tǒng) 接收和處理。配置domU操作系統(tǒng)也運行于CPU的虛擬化模式,當(dāng)設(shè)備中斷到達(dá)時,CPU 將退出虛擬化模式,并通知domO設(shè)備中斷接收輔助子模塊。
當(dāng)CPU正在運行domU操作系統(tǒng)時,如果物理中斷到達(dá),則根據(jù)CPU運行模式配置子 模塊的配置,CPU立即中斷d咖U操作系統(tǒng)的運行,并退出虛擬化模式,CPU運行模式配 置子模塊調(diào)用domO設(shè)備中斷接收輔助子模塊進(jìn)行處理。domO設(shè)備中斷接收輔助子模塊需 要做的唯一工作是讓CPU轉(zhuǎn)入運行domO操作系統(tǒng),當(dāng)domO操作系統(tǒng)開始運行時,物理 中斷將立即觸發(fā),從而被domO操作系統(tǒng)接收和處理。
顧I接收和處理子模塊首先為接收不可屏蔽中斷NMI準(zhǔn)備軟件環(huán)境,包括初始化CPU 的中斷描述符表IDT,以及準(zhǔn)備NMI的中斷處理程序,并將該NMI的中斷處理程序的地址 填入到IDT的第2個表項中。當(dāng)接收到NMI后,先判斷該NMI是否是由IPI發(fā)送與接收 子模塊導(dǎo)致的,如果是,則通知IPI發(fā)送與接收子模塊接收IPI消息;否則,直接將NMI 轉(zhuǎn)發(fā)給domO操作系統(tǒng)。
當(dāng)虛擬機(jī)監(jiān)控器的其它模塊(即虛擬中斷處理模塊、指令虛擬化模塊、MMU虛擬化模 塊)請求IPI發(fā)送與接收子模塊發(fā)送IPI消息時,IPI發(fā)送與接收子模塊訪問LAPIC實現(xiàn) 真正的IPI消息發(fā)送。
圖3是本發(fā)明第5.2步的物理中斷處理時序圖,分為三種情況,分別用子圖3(A)、3(B)、 3(C)描述,圖中的橫向虛線箭頭表示時間,實心小長方塊指出了當(dāng)前CPU正在運 行什么。CPU在某一時刻只能運行domO操作系統(tǒng)(以下簡稱"dom0 0S")、 domU操作系 統(tǒng)(以下簡稱"domU OS")或虛擬機(jī)監(jiān)控器(以下簡稱"VMM")中的一種,空心和實心 的三角形分別表示設(shè)備中斷的到達(dá)和觸發(fā)。
子圖3(A)描述了當(dāng)設(shè)備中斷到達(dá)時domU OS正在運行的情況,即第5. 2步的第一種 情況通過配置CPU的運行模式,使得到達(dá)的中斷并不被立即觸發(fā),CPU立即停止運行 domU 0S,并通知CPU運行模式配置子模塊,CPU運行模式配置子模塊調(diào)用dom0設(shè)備中斷 接收輔助子模塊,domO設(shè)備中斷接收輔助子模塊強(qiáng)制CPU立即運行domO 0S,同時觸發(fā) 該設(shè)備中斷,從而該設(shè)備中斷被domO操作系統(tǒng)處理。中斷處理完后,CPU返回到V畫的 domO設(shè)備中斷接收輔助子模塊,該子模塊再調(diào)度CPU繼續(xù)運行被中斷的domU 0S。
子圖3(B)描述了當(dāng)設(shè)備中斷到達(dá)時dom0操作系統(tǒng)正在運行的情況,即第5. 2步的第 二種情況此時設(shè)備中斷將直接在domO OS中被觸發(fā),從而轉(zhuǎn)入到domO OS正常的中斷 處理流程,當(dāng)中斷處理完畢后,domO操作系統(tǒng)直接恢復(fù)運行。在這種情況下,物理中斷 處理模塊無需介入中斷處理過程,從而提高了中斷處理效率。
子圖3(C)描述了當(dāng)設(shè)備中斷到達(dá)時虛擬機(jī)監(jiān)控器VMM正在運行的情況,即第5. 2步 的第三種情況按照CPU運行模式配置子模塊的配置,CPU在運行V腿時其中斷允許標(biāo)志 被屏蔽,因此到達(dá)的設(shè)備中斷無法被觸發(fā)。等到CPU執(zhí)行完VMM中的代碼轉(zhuǎn)而執(zhí)行domO OS 或domU OS的代碼后,中斷才被觸發(fā)和處理。如果CPU返回到domU OS中執(zhí)行,則中斷 處理邏輯如子圖3(A)所示。如果CPU返回到domO OS中執(zhí)行,則中斷處理邏輯如子圖3(B) 所示。
圖4是本發(fā)明第5. 4步的IPI消息發(fā)送與接收流程圖。子圖4(A)描述的是發(fā)送流程, 對應(yīng)5.4.1步的內(nèi)容。為保證對目標(biāo)CPU的消息隊列操作的原子性,先獲得目標(biāo)CPU的 消息隊列鎖,向目標(biāo)CPU的消息隊列添加要發(fā)送的IPI消息,然后釋放目標(biāo)CPU的消息 隊列鎖,最后向SMP系統(tǒng)中除自身外的所有其它CPU發(fā)送IPI消息,該IPI消息是一個 不可屏蔽中斷麗I,提醒所有其它CPU處理新的IPI消息。
子圖4(B)描述了 IPI消息的接收流程,對應(yīng)5.4.2步的內(nèi)容。當(dāng)CPU接收到來自其 它CPU的IPI中斷后,先獲得本CPU的消息列隊鎖,判斷本CPU的IPI消息隊列是否為 空,如果不為空就從消息隊列中取出一個IPI消息,在釋放了消息隊列鎖后執(zhí)行IPI消 息中指定的IPI消息處理函數(shù),實現(xiàn)IPI通信。如此反復(fù),直到所有的IPI消息都被處 理完畢(即IPI消息隊列為空),IPI消息接收處理結(jié)束。
1權(quán)利要求
1.一種X86計算機(jī)虛擬化的物理中斷處理方法,首先構(gòu)建虛擬機(jī)系統(tǒng),虛擬機(jī)系統(tǒng)由三部分組成最底層是X86計算機(jī)硬件與中斷;中間層是虛擬機(jī)監(jiān)控器;最上層是同時運行的多個虛擬化操作系統(tǒng),包括一個domO操作系統(tǒng),一個或多個domU操作系統(tǒng),虛擬機(jī)監(jiān)控器由物理中斷處理模塊和虛擬中斷處理模塊、CPU指令虛擬化模塊、MMU虛擬化模塊組成;其特征在于所述物理中斷處理模塊由LAPIC初始化子模塊、CPU虛擬化模式配置子模塊、domO LAPIC初始化監(jiān)視子模塊、domO設(shè)備中斷接收輔助子模塊、IPI發(fā)送與接收子模塊、NMI接收和處理子模塊這六個子模塊組成;CPU運行模式配置子模塊配置CPU的運行模式并接收從CPU發(fā)來的設(shè)備中斷信息,再調(diào)用domO設(shè)備中斷接收輔助子模塊,在domO設(shè)備中斷接收輔助子模塊的控制下,設(shè)備中斷直接傳遞給domO操作系統(tǒng);所有的NMI都傳遞給NMI接收和處理子模塊,該子模塊接收NMI后進(jìn)行判斷,如果NMI是IPI消息導(dǎo)致的,則將該NMI傳送給IPI發(fā)送與接收子模塊,否則將NMI轉(zhuǎn)發(fā)至domO操作系統(tǒng);LAPIC初始化子模塊在X86計算機(jī)系統(tǒng)加電引導(dǎo)時對LAPIC進(jìn)行部分初始化,在domO LAPIC初始化監(jiān)視子模塊的監(jiān)控下,domO操作系統(tǒng)直接訪問經(jīng)初始化的LAPIC,當(dāng)CPU指令虛擬化模塊檢測到domO對LAPIC重新初始化時,CPU指令虛擬化模塊通知domOLAPIC初始化監(jiān)視子模塊,由domO LAPIC初始化監(jiān)視子模塊調(diào)用LAPIC初始化子模塊對LAPIC進(jìn)行重配置;IPI發(fā)送與接收子模塊直接訪問LAPIC進(jìn)行IPI消息的發(fā)送與接收;構(gòu)建好虛擬機(jī)系統(tǒng)后,由虛擬機(jī)系統(tǒng)對物理中斷進(jìn)行處理,方法是第一步,NMI接收和處理子模塊構(gòu)建接收和處理NMI所需要的軟件環(huán)境構(gòu)建NMI中斷的中斷處理函數(shù),將該中斷處理函數(shù)的地址放入IDT表的第2項中;第二步,IPI發(fā)送與接收子模塊按如下方法初始化IPI發(fā)送與接收所需的軟件環(huán)境2.1選用不可屏蔽中斷NMI的中斷號2作為IPI的中斷號;2.2為每個CPU都設(shè)置一個先進(jìn)先出的隊列結(jié)構(gòu)作為IPI消息隊列,同時為每個IPI消息隊列設(shè)置一個消息隊列鎖;第三步,LAPIC初始化子模塊對本地高級可編程中斷控制器LAPIC進(jìn)行基本初始化,方法如下3.1探測X86系統(tǒng)中是否配備了LAPIC,如果系統(tǒng)中不存在LAPIC,則轉(zhuǎn)第四步,否則執(zhí)行3.2;3.2映射LAPIC的寄存器,為每個CPU的LAPIC的所有寄存器的物理地址區(qū)間映射相應(yīng)的虛擬地址;3.3啟用LAPIC,即向LAPIC的寄存器中寫入數(shù)據(jù);第四步,CPU運行模式配置子模塊按如下方法分別配置domO操作系統(tǒng)、domU操作系統(tǒng)和虛擬機(jī)監(jiān)控器的運行模式4.1對domO操作系統(tǒng),按如下方法配置CPU的運行模式●配置domO操作系統(tǒng)的運行模式為CPU的虛擬化模式;●配置domO操作系統(tǒng)的中斷觸發(fā)模式為直接觸發(fā)和處理模式,即當(dāng)domO操作系統(tǒng)運行時,到達(dá)的物理中斷不通知物理中斷處理模塊,而直接在domO操作系統(tǒng)中被觸發(fā)和處理;●當(dāng)domO操作系統(tǒng)運行時,打開CPU的中斷允許標(biāo)志;4.2對domU操作系統(tǒng),按如下方法配置CPU的運行模式●配置domU操作系統(tǒng)的運行模式為CPU的虛擬化模式;●配置domU操作系統(tǒng)的中斷觸發(fā)模式為退出運行并通知中斷處理模塊這種模式,即當(dāng)domU操作系統(tǒng)運行時,到達(dá)的物理中斷將中斷domU操作系統(tǒng)的運行,并馬上通知物理中斷處理模塊;●當(dāng)這些操作系統(tǒng)運行時,打開CPU的中斷允許標(biāo)志;4.3對虛擬機(jī)監(jiān)控器,按如下方法配置CPU的運行模式●配置虛擬機(jī)監(jiān)控器的運行模式為CPU的普通模式;●在虛擬機(jī)監(jiān)控器運行期間,始終關(guān)閉CPU的中斷允許標(biāo)志;第五步,當(dāng)domO LAPIC初始化監(jiān)視子模塊監(jiān)測到domO操作系統(tǒng)對LAPIC進(jìn)行初始化操作時,轉(zhuǎn)5.1;當(dāng)domO設(shè)備中斷接收輔助子模塊監(jiān)測到設(shè)備中斷到達(dá)時,轉(zhuǎn)5.2;當(dāng)NMI接收和處理子模塊監(jiān)測到不可屏蔽中斷NMI到達(dá)時,轉(zhuǎn)5.3;當(dāng)IPI發(fā)送與接收子模塊檢測到虛擬機(jī)的其它模塊或上層操作系統(tǒng)請求發(fā)送和接收處理器間中斷IPI時,轉(zhuǎn)5.45.1 CPU指令虛擬化模塊截獲domO操作系統(tǒng)讀寫MSR的指令rdmsr/wrmsr,并將結(jié)果交給domO LAPIC初始化監(jiān)視子模塊,domO LAPIC初始化監(jiān)視子模塊判斷domO操作系統(tǒng)是否訪問編號為0x1B的MSR,如果是則判斷LAPIC寄存器的內(nèi)存映射地址是否被改變,如果改變則將新地址記錄下來,并按3.2所示的方法重新映射LAPIC的寄存器;如果不改變則轉(zhuǎn)第五步,進(jìn)入下一次循環(huán);5.2domO設(shè)備中斷接收輔助子模塊分下列三種情況輔助domO操作系統(tǒng)接收設(shè)備中斷●當(dāng)設(shè)備中斷到達(dá)時,如果CPU正在運行domU操作系統(tǒng),則CPU中斷domU操作系統(tǒng)的運行,并將設(shè)備中斷到達(dá)情況通知domO設(shè)備中斷接收輔助子模塊,domO設(shè)備中斷接收輔助子模塊馬上請求虛擬機(jī)監(jiān)控器轉(zhuǎn)入運行domO操作系統(tǒng),等到domO操作系統(tǒng)開始運行時,設(shè)備中斷將立即被觸發(fā)并被domO操作系統(tǒng)接收;●當(dāng)設(shè)備中斷到達(dá)時,如果CPU正在運行domO操作系統(tǒng),設(shè)備中斷直接在domO操作系統(tǒng)中被觸發(fā);●當(dāng)設(shè)備中斷到達(dá)時,如果CPU正在運行虛擬機(jī)監(jiān)控器自身,到達(dá)的設(shè)備中斷不會被觸發(fā);上述處理完畢后,轉(zhuǎn)第五步進(jìn)入下一次循環(huán);5.3 NMI接收和處理子模塊接收和處理不可屏蔽中斷NMI,方法是判斷IPI發(fā)送與接收子模塊是否正在發(fā)送IPI消息,如果正在發(fā)送IPI消息,則由IPI發(fā)送與接收子模塊接收和處理IPI消息;否則,將NMI轉(zhuǎn)發(fā)到domO操作系統(tǒng),domO操作系統(tǒng)異步處理該NMI;上述兩種情況處理完成后,都轉(zhuǎn)第五步進(jìn)入下一次循環(huán);5.4如果IPI發(fā)送與接收子模塊被請求發(fā)送IPI,轉(zhuǎn)5.4.1;如果NMI接收和處理子模塊接收到NMI后調(diào)用IPI發(fā)送與接收子模塊,轉(zhuǎn)5.4.25.4.1按下述方法向一個或多個目標(biāo)CPU發(fā)送一個IPI消息5.4.1.1獲得目標(biāo)CPU的消息隊列鎖,把IPI消息加入到該IPI消息的目標(biāo)CPU的IPI消息隊列中,再釋放目標(biāo)CPU的消息隊列鎖;5.4.1.2通過訪問LAPIC的寄存器,向SMP系統(tǒng)中的其它全部CPU發(fā)送該IPI消息,發(fā)送參數(shù)中設(shè)置的IPI中斷號為NMI的中斷號2;5.4.1.3轉(zhuǎn)第五步進(jìn)入下一次循環(huán);5.4.2按下述方法接收和處理IPI消息5.4.2.1先獲得本CPU的消息隊列鎖,再判斷消息隊列是否為空,如果為空則釋放本CPU的消息隊列鎖,轉(zhuǎn)5.4.2.3;如果消息隊列不為空,執(zhí)行5.4.2.2;5.4.2.2從本CPU的IPI消息隊列中取出一個IPI消息,釋放本CPU的消息隊列鎖,調(diào)用IPI消息中包含的IPI接收和處理函數(shù)實現(xiàn)IPI通信,轉(zhuǎn)5.4.2.1。5.4.2.3轉(zhuǎn)第五步進(jìn)入下一次循環(huán)。
2.如權(quán)利要求1所述的X86計算機(jī)虛擬化的物理中斷處理方法,其特征在于探測X86 系統(tǒng)中是否配備LAPIC的方法是設(shè)置CPU的EAX寄存器為1,再執(zhí)行CPUID這條CPU指令, 最后檢查EDX寄存器的第9位是否為1,如果為1則LAPIC存在。
全文摘要
本發(fā)明公開了一種X86計算機(jī)虛擬化的物理中斷處理方法,目的是解決同時運行多個虛擬化操作系統(tǒng)的X86計算機(jī)中物理中斷處理方法實現(xiàn)復(fù)雜、代碼龐大和中斷處理開銷大等問題。技術(shù)方案是首先構(gòu)建虛擬機(jī)系統(tǒng),主要是修改物理中斷處理模塊,然后由由虛擬機(jī)系統(tǒng)對物理中斷進(jìn)行處理,包括構(gòu)建接收和處理NMI所需要的軟件環(huán)境,初始化IPI發(fā)送與接收所需的軟件環(huán)境、對LAPIC進(jìn)行基本初始化,分別對dom0操作系統(tǒng)、domU操作系統(tǒng)和虛擬機(jī)監(jiān)控器進(jìn)行配置,監(jiān)測和處理dom0操作系統(tǒng)對LAPIC的初始化、設(shè)備中斷、NMI、IPI這五個步驟。采用本發(fā)明能簡化中斷處理邏輯、縮減虛擬機(jī)監(jiān)控器的代碼量,減小中斷處理的開銷,增強(qiáng)整個計算機(jī)系統(tǒng)的穩(wěn)定性,具有優(yōu)秀的硬件適配性。
文檔編號G06F9/455GK101620547SQ200910043829
公開日2010年1月6日 申請日期2009年7月3日 優(yōu)先權(quán)日2009年7月3日
發(fā)明者劉曉建, 吳慶波, 孔金珠, 張衛(wèi)華, 戴華東, 易曉東, 譚郁松 申請人:中國人民解放軍國防科學(xué)技術(shù)大學(xué)