李 暉,王振華,靳國(guó)杰
(1.中國(guó)南方電網(wǎng)有限責(zé)任公司,廣州510623;2.中國(guó)科學(xué)院大學(xué)計(jì)算機(jī)與控制工程學(xué)院,北京100049;3.中國(guó)科學(xué)院計(jì)算技術(shù)研究所,北京100190;4.龍芯中科技術(shù)有限公司,北京100190)
二進(jìn)制翻譯技術(shù)是一種直接翻譯并運(yùn)行可執(zhí)行程序的二進(jìn)制代碼的技術(shù),是實(shí)現(xiàn)不同指令集架構(gòu)(Instruction Set Architecture,ISA)兼容的重要手段。在二進(jìn)制翻譯技術(shù)中,代碼翻譯前的平臺(tái)叫客戶機(jī)(Guest),代碼翻譯后的平臺(tái)叫宿主機(jī)(Host)[1]。通過(guò)將客戶機(jī)二進(jìn)制代碼翻譯到宿主機(jī)平臺(tái),二進(jìn)制翻譯器可以在宿主機(jī)上模擬運(yùn)行客戶機(jī)平臺(tái)的程序,從而實(shí)現(xiàn)對(duì)客戶機(jī)體系結(jié)構(gòu)的兼容。
龍芯處理器[2]是由中科院計(jì)算所是研制的MIPS兼容處理器,生態(tài)環(huán)境還很脆弱。通過(guò)使用二進(jìn)制翻譯技術(shù),龍芯可以模擬運(yùn)行為X86架構(gòu)編寫的程序,從而以較低的成本實(shí)現(xiàn)對(duì)X86指令系統(tǒng)的兼容,達(dá)到擴(kuò)大自身的軟件生態(tài)的目的。因此,研究二進(jìn)制翻譯技術(shù)對(duì)龍芯有重要意義。
然而,二進(jìn)制翻譯的客戶機(jī)訪存模擬代價(jià)較高。在二進(jìn)制翻譯系統(tǒng)中,客戶機(jī)的訪存指令在模擬執(zhí)行時(shí)要進(jìn)行3次地址轉(zhuǎn)換:
(1)二進(jìn)制翻譯器將客戶機(jī)虛擬地址(Guest Virtual Address,GVA)轉(zhuǎn)換成客戶機(jī)物理地址(Guest Physical Address,GPA)。
(2)二進(jìn)制翻譯器將客戶機(jī)物理地址轉(zhuǎn)換成宿主機(jī)虛擬地址(Host Virtual Address,HVA)。
(3)宿主機(jī)將 HVA轉(zhuǎn)換成宿主機(jī)物理地址(Host Physical Address,HPA)。前2次地址轉(zhuǎn)換帶來(lái)了大量的軟件開銷。例如,在龍芯上使用動(dòng)態(tài)二進(jìn)制翻譯器QEMU[3]運(yùn)行X86軟件時(shí),一條X86訪存指令需要用十多條MIPS指令來(lái)模擬。
本文分析在龍芯上運(yùn)行X86軟件的性能,指出客戶機(jī)訪存性能是主要的性能瓶頸,提出一種軟硬件結(jié)合的性能優(yōu)化方法。該方法通過(guò)在龍芯處理器中增加能直接進(jìn)行X86虛實(shí)地址轉(zhuǎn)換的硬件,消除二進(jìn)制翻譯器的訪存地址轉(zhuǎn)換的軟件開銷。
QEMU是一個(gè)支持多種指令系統(tǒng)的二進(jìn)制翻譯器,在客戶機(jī)程序運(yùn)行時(shí)對(duì)執(zhí)行到的代碼片斷進(jìn)行翻譯并運(yùn)行。QEMU支持的客戶機(jī)指令系統(tǒng)包括X86,PowerPC,ARM和SPARC,支持宿主機(jī)指令系統(tǒng)包括X86,PowerPC,ARM,SPARC,Alpha和 MIPS。
在QEMU這樣的二進(jìn)制翻譯器中,客戶機(jī)的物理內(nèi)存使用宿主機(jī)的虛擬內(nèi)存模擬,如圖1所示。因此,執(zhí)行訪存指令翻譯后指令時(shí),訪存地址要經(jīng)過(guò)3次轉(zhuǎn)換。二進(jìn)制翻譯器在做第1次地址轉(zhuǎn)換時(shí)要查詢客戶機(jī)的頁(yè)表,做第2次地址轉(zhuǎn)換時(shí)要查詢目標(biāo)機(jī)物理地址(Guest Physical Address,GPA)到本機(jī)物理地址(Host Physical Address,HVA)的映射表。第3次地址轉(zhuǎn)換由宿主機(jī)硬件地址轉(zhuǎn)換裝置宿主機(jī)翻譯后備緩沖(Host Translation Look-aside Buffer,HTLB)完成。TLB是頁(yè)表的高速緩存,用于快速地轉(zhuǎn)換地址。使用TLB可以消除查詢多級(jí)頁(yè)表帶來(lái)的軟件開銷,從而提高訪存性能。HTLB做第3次地址轉(zhuǎn)換時(shí)分2種情況:HTLB命中時(shí),由HTLB直接轉(zhuǎn)換;HTLB不命中時(shí),宿主機(jī)查詢自身的頁(yè)表完成地址轉(zhuǎn)換。前2次地址轉(zhuǎn)換通過(guò)軟件查詢完成,因此,存在大量開銷。第3次地址轉(zhuǎn)換由HTLB完成,當(dāng)運(yùn)行具有高TLB命中率的訪存密集型應(yīng)用時(shí),TLB不命中時(shí)引發(fā)的軟件處理開銷可忽略不計(jì)。
圖1 QEMU軟件TLB數(shù)據(jù)結(jié)構(gòu)
作為一個(gè)二進(jìn)制翻譯器,QEMU精心設(shè)計(jì)了一套軟件TLB機(jī)制,可以較快地將GVA轉(zhuǎn)換成HVA。這套機(jī)制包含2個(gè)部分:(1)用來(lái)存放GVA到HVA映射關(guān)系的數(shù)據(jù)結(jié)構(gòu),由QEMU自動(dòng)維護(hù);(2)用來(lái)訪問GVA-HVA映射的算法,在客戶機(jī)訪存指令翻譯后代碼執(zhí)行時(shí)使用。
2.2.1 QEMU的軟件TLB數(shù)據(jù)結(jié)構(gòu)
QEMU的軟件TLB數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)在客戶機(jī)模擬硬件的數(shù)據(jù)區(qū)中。該軟件TLB采用直接相聯(lián)結(jié)構(gòu),包含256項(xiàng)特權(quán)態(tài)表項(xiàng)和256項(xiàng)用戶態(tài)表項(xiàng)。特權(quán)態(tài)訪存使用特權(quán)態(tài)表項(xiàng)轉(zhuǎn)換地址,用戶態(tài)訪存使用用戶態(tài)表項(xiàng)轉(zhuǎn)換地址。每個(gè)GVA只會(huì)被映射到一個(gè)唯一的表項(xiàng)。每個(gè)表項(xiàng)中都存儲(chǔ)了3個(gè)客戶機(jī)虛擬頁(yè)面基址(Guest Virtual-page Base,GVB)的值和一個(gè)HVA與GVA的差值addr_end。
3個(gè)GVB分別是:讀操作的虛擬地址GVB_read,寫操作的虛擬地址GVB_write,可執(zhí)行代碼的虛擬地址GVB_code。這3個(gè)地址分別控制著其對(duì)應(yīng)的客戶機(jī)虛擬頁(yè)面的讀、寫、可執(zhí)行權(quán)限。根據(jù)一個(gè)訪存操作的類型,軟件TLB地址轉(zhuǎn)換算法會(huì)取出3個(gè)地址中的一個(gè),將其作為GVB,繼續(xù)轉(zhuǎn)換地址。由于客戶機(jī)的物理內(nèi)存是在QEMU虛擬內(nèi)存中劃分的一段連續(xù)空間,因此GPA和HVA之間擁有簡(jiǎn)單的數(shù)學(xué)關(guān)系:HVA=Guest_PhyBase+GPA。從而使得二進(jìn)制翻譯器不需要維護(hù)GPA-HVA映射。
2.2.2 QEMU的軟件TLB地址轉(zhuǎn)換算法
QEMU的軟件TLB地址轉(zhuǎn)算法的主要工作是將GVA轉(zhuǎn)換成HVA,具體步驟如圖2所示。
圖2 軟件TLB地址轉(zhuǎn)換算法流程
該算法分為兩部分:快速檢索和慢速檢索。快速檢索用于查詢軟件TLB,它被嵌入到訪存指令的翻譯后指令中。慢速檢索用于查詢客戶機(jī)頁(yè)表,在快速檢索失敗后調(diào)用。因此,每次執(zhí)行訪存指令的翻譯后代碼時(shí),都會(huì)運(yùn)行快速檢索來(lái)查詢軟件TLB,如果TLB命中,從軟件TLB中取出addr_end;如果TLB不命中,模擬X86的頁(yè)表查找操作??焖偎惴ㄊ菆D2中從開始到結(jié)束,并且TLB命中的路徑,慢速檢索是TLB未命中后接下來(lái)的3步。
由于軟件TLB的地址轉(zhuǎn)換算法步驟較多,因此相對(duì)于使用硬件TLB做地址轉(zhuǎn)換,QEMU采用的軟件TLB做地址轉(zhuǎn)換的代價(jià)仍然很高。在龍芯上模擬運(yùn)行X86時(shí),QEMU會(huì)將一條X86訪存指令翻譯成十多條MIPS指令。圖3展示了一個(gè)訪存指令的翻譯實(shí)例和每條指令的具體操作含義,它和圖2中快速檢索過(guò)程對(duì)應(yīng)。而一個(gè)常規(guī)的應(yīng)用程序中,有30%左右的指令是訪存相關(guān)指令[4]。這導(dǎo)致在翻譯后代碼中,有70%的指令是為了作地址轉(zhuǎn)換,代價(jià)太高。因此,在二進(jìn)制翻譯系統(tǒng)中,客戶機(jī)訪存模擬的性能有著巨大的可挖掘空間。
圖3 訪存指令翻譯后的代碼實(shí)例
虛擬機(jī)的客戶機(jī)訪存性能低下,針對(duì)這一問題有3種改進(jìn)方法,即模擬客戶機(jī)TLB、影子頁(yè)表(Shadow Page Table)和 硬 件 輔 助 (Hardware-assisted)優(yōu) 化方法。
2.3.1 模擬客戶機(jī)TLB的優(yōu)化方法
模擬客戶機(jī)TLB通過(guò)緩沖客戶機(jī)頁(yè)表來(lái)快速完成GVA-GPA轉(zhuǎn)換,是一種純軟件優(yōu)化方法。這種機(jī)制往往和指令翻譯系統(tǒng)緊密結(jié)合,對(duì)客戶機(jī)透明,且易于實(shí)現(xiàn)的方案。如2.2節(jié)所述,QEMU采用的就是模擬客戶機(jī)TLB方法。
2.3.2 影子頁(yè)表優(yōu)化方法
影子頁(yè)表中存儲(chǔ)了GVA-HPA映射,將原本需要3次查詢的地址轉(zhuǎn)換合并為一次。影子頁(yè)表的每個(gè)表項(xiàng),都由運(yùn)行于內(nèi)核態(tài)的虛擬機(jī)監(jiān)視器(Virtual Machine Monitor,VMM),經(jīng)過(guò)3次地址轉(zhuǎn)換得到。在客戶機(jī)運(yùn)行時(shí),部分影子頁(yè)表的表項(xiàng)會(huì)被緩存在HTLB。在后續(xù)訪存中,如果GVA命中HTLB,客戶機(jī)訪存的速度可匹敵宿主機(jī)訪存。內(nèi)存開銷大是影子頁(yè)表的主要缺陷,因?yàn)閂MM要為每個(gè)客戶機(jī)進(jìn)程維護(hù)一個(gè)影子頁(yè)表。內(nèi)核虛擬機(jī)(Kernel-based Virtual Machine,KVM)是一個(gè)采用影子頁(yè)表的典型方案[5]。
2.3.3 硬件輔助優(yōu)化方法
硬件輔助優(yōu)化方法依賴于在處理器中增加新的硬件支持[6-8]。隨著虛擬化技術(shù)逐漸普及,以Intel為代表的處理器廠商都為自己的產(chǎn)品增加了虛擬化硬件支持功能。
Intel擴(kuò) 展 頁(yè) 表 (Extended Page Table,EPT)[9]、AMD 嵌 套 頁(yè) 表 (Nested Page Table,NPT)[10]是用于X86平臺(tái)的客戶機(jī)訪存加速方案,它們的主要特點(diǎn)是用硬件實(shí)現(xiàn)了二級(jí)地址轉(zhuǎn)換和客戶機(jī)頁(yè)表搜索器。二級(jí)地址轉(zhuǎn)換通過(guò)在HTLB中同時(shí)緩存GVA-HPA映射和HVA-HPA映射實(shí)現(xiàn),HTLB可以直接執(zhí)行GVA-HPA轉(zhuǎn)換。客戶機(jī)頁(yè)表搜索器在客戶機(jī)TLB缺失時(shí)啟動(dòng),通過(guò)自動(dòng)檢索客戶機(jī)頁(yè)表將GVA轉(zhuǎn)換成HVA,再通過(guò)檢索宿主機(jī)頁(yè)表將HVA轉(zhuǎn)換成HPA,最后將GVA-HPA映射加入HTLB中,以便下次訪存時(shí)使用。這2種方案對(duì)虛擬機(jī)的性能提升都非常顯著,AMD NPT使訪存性能提升了42%,Intel EPT使訪存性能提升了48%[11]。
IBM在Power架構(gòu)上提出了虛實(shí)地址轉(zhuǎn)換(Logical to Real Address Translation,LRAT)方案[12]。這種方案在處理器中增加了一個(gè)類似TLB的裝置,即LRAT,其中存儲(chǔ)著GPA-HPA映射。在該系統(tǒng)中,HTLB中也緩存了GVA-HPA映射,客戶機(jī)TLB缺失例外由客戶機(jī)和硬件協(xié)同處理。首先,客戶機(jī)查詢自身頁(yè)表得到GVA-GPA映射;其次,客戶機(jī)嘗試將這對(duì)映射寫入HTLB;再次,處理器用GPA檢索LRAT得到HPA;最后,處理器將GVA-HPA映射更新到TLB中。LRAT方法將系統(tǒng)性能提高了232%。
Intel和AMD的技術(shù)適用于硬件管理TLB的體系結(jié)構(gòu),IBM的技術(shù)適用于軟件管理TLB的結(jié)構(gòu)。但這些方案都只能應(yīng)用在相同ISA虛擬化系統(tǒng)中。目前尚未出現(xiàn)針對(duì)不同ISA虛擬化環(huán)境的客戶機(jī)訪存性能優(yōu)化的硬件輔助手段。
針對(duì)QEMU這類二進(jìn)制翻譯器在轉(zhuǎn)換客戶機(jī)訪存地址時(shí)性能低下的問題,本文提出一種硬件輔助訪存性能優(yōu)化方案,大幅提升了客戶機(jī)的訪存性能。該方案主要包含4部分:
(1)在處理器中增加支持直接將GVA轉(zhuǎn)換為HPA的客戶機(jī)專用TLB,從而消除QEMU軟件TLB做地址轉(zhuǎn)換的開銷。
(2)通過(guò)在處理器中增加客戶機(jī)的專用訪存指令,從而將客戶機(jī)訪存指令和宿主機(jī)訪存指令區(qū)分開,使得客戶機(jī)的訪存指令能直接將GVA作為訪存地址。
(3)針對(duì)上述2項(xiàng)硬件支持,優(yōu)化了二進(jìn)制翻譯器的指令翻譯規(guī)則,大幅降低了訪存指令的翻譯后指令規(guī)模。
(4)新增的TLB引入了客戶機(jī)TLB例外。本文設(shè)計(jì)了一套軟件機(jī)制來(lái)處理這種例外,從而保障二進(jìn)制翻譯系統(tǒng)正常運(yùn)行。
從QEMU的例子可以看到,即使采用了精心設(shè)計(jì)的軟件TLB機(jī)制,二進(jìn)制翻譯器在為客戶機(jī)做訪存地址轉(zhuǎn)換時(shí)還是有很高的額外開銷。為了降低這種開銷,一種直觀的思路是使用硬件TLB直接將GVA轉(zhuǎn)換成HPA,從而在TLB命中時(shí)將三步轉(zhuǎn)換整合成一步。因?yàn)榭蛻魴C(jī)地址轉(zhuǎn)換由硬件TLB完成,所以可以完全消除軟件開銷。
3.1.1 直接使用HTLB存在的難題
然而,對(duì)于不同ISA虛擬化系統(tǒng)來(lái)說(shuō),直接使用HTLB來(lái)轉(zhuǎn)換地址存在困難。一個(gè)體系結(jié)構(gòu)的地址空間機(jī)制通常是該體系結(jié)構(gòu)的特性,同一個(gè)虛擬地址在2種體系結(jié)構(gòu)中的地址轉(zhuǎn)換規(guī)則有可能是不同的。這種差異使得HTLB將無(wú)法將GVA轉(zhuǎn)換成HPA。
例如,在MIPS中,虛擬地址和物理地址總是不同的,并且,最高位為1的地址只有核心態(tài)可以使用。而對(duì)于在X86上運(yùn)行的Linux來(lái)說(shuō),32位虛擬地址空間映射分為2段:0x0000_0000-0xBFFF_FFFF是用戶地址空間;0xC000_0000-0xFFFF_FFFF是內(nèi)核地址空間。它們總是由TLB作地址轉(zhuǎn)換。可見,當(dāng)在 MIPS上模擬運(yùn)行 X86時(shí),因?yàn)?x8000_0000-0xBFFF_FFFF地址段在 MIPS中是不經(jīng)過(guò)TLB轉(zhuǎn)換的,所以不能使用HTLB將X86虛擬地址轉(zhuǎn)換成MIPS物理地址。
為了解決使用HTLB將GVA轉(zhuǎn)換成HPA存在的困難,可以在客戶機(jī)硬件中增加專門用于將GVA轉(zhuǎn)換成HPA的客戶機(jī)專用地址轉(zhuǎn)換裝置GTLB(Guest TLB)。GTLB將二進(jìn)制翻譯器軟件TLB和HTLB的地址轉(zhuǎn)換工作合并。通過(guò)使用GTLB,客戶機(jī)訪存指令的翻譯后指令在GTLB命中的情況下,地址轉(zhuǎn)換次數(shù)從3次減少到1次,完全消除了二進(jìn)制翻譯器軟件TLB帶來(lái)的開銷。
3.1.2 MIPS架構(gòu)的傳統(tǒng)TLB
龍芯的TLB表項(xiàng)結(jié)構(gòu)如圖4所示。傳統(tǒng)的MIPS體系結(jié)構(gòu)TLB表項(xiàng)包含5個(gè)重要的域,結(jié)構(gòu)如圖 4(a)所示。VPN2:虛頁(yè)號(hào) (Virtual Page Number),在地址轉(zhuǎn)換時(shí),虛擬地址的第12位決定取出哪一個(gè)PFN(Physical Frame Number),為0時(shí)取出第1個(gè),為1時(shí)取出第2個(gè);ASID(Address Space IDentifier):地址空間標(biāo)識(shí)符,通常被操作系統(tǒng)用來(lái)標(biāo)識(shí)進(jìn)程;PageMask:頁(yè)面掩碼,用來(lái)控制被映射的頁(yè)面大??;G(Global):全局位,當(dāng)該位被置為1時(shí),TLB表項(xiàng)匹配時(shí)總是將ASID域視為匹配的;PFN:物理幀號(hào);Flags:頁(yè)面屬性位(包含3個(gè)描述頁(yè)面權(quán)限的屬性:V表示該頁(yè)在內(nèi)存中沒有對(duì)應(yīng)的物理頁(yè),D表示該頁(yè)允許寫入,C表示該頁(yè)Cache(高速緩存)算法)。
圖4 龍芯的TLB表項(xiàng)結(jié)構(gòu)
對(duì)于每次地址轉(zhuǎn)換,傳統(tǒng)TLB的輸入是<VPN2,PageMask,ASID>,轉(zhuǎn)換成功時(shí)輸出是<PFN>,轉(zhuǎn)換失敗時(shí)會(huì)觸發(fā)TLB例外。
3.1.3 支持客戶機(jī)地址轉(zhuǎn)換的GTLB
本文通過(guò)結(jié)合MIPS的TLB結(jié)構(gòu)特點(diǎn)和QEMU軟件TLB的特點(diǎn),在龍芯處理器上實(shí)現(xiàn)了一套能夠?qū)86虛擬地址直接轉(zhuǎn)換成MIPS物理地址的硬件裝置GTLB,其表項(xiàng)結(jié)構(gòu)如圖4(b)所示。和傳統(tǒng)的MIPS TLB相比,GTLB有2點(diǎn)不同:
(1)GTLB表項(xiàng)沒有單獨(dú)的PageMask域,而是增加一個(gè)用于描述所有頁(yè)面掩碼的寄存器GTLB_PageMask。由于X86中所有頁(yè)面大小一致,因此可以為整個(gè)GTLB設(shè)置一個(gè)統(tǒng)一的PageMask來(lái)描述X86的頁(yè)面大小。
(2)在每個(gè)GTLB表項(xiàng)中增加了一個(gè)機(jī)器標(biāo)識(shí)符(Machine IDentifier,MID)域,用來(lái)區(qū)分 MIPS和X86的地址空間。在實(shí)際應(yīng)用中,MID為0或1時(shí)表示該表項(xiàng)的地址屬于MIPS地址空間,MID為2或3時(shí)表示該表項(xiàng)的地址屬于X86地址空間。其中,MID為2時(shí)表示X86特權(quán)態(tài);MID為3時(shí)表示X86用戶態(tài)。
新增的GTLB簡(jiǎn)化了從GVA到HPA的地址轉(zhuǎn)換,消除了二進(jìn)制翻譯器的地址轉(zhuǎn)換開銷。與此同時(shí),由于硬件擁有2套地址轉(zhuǎn)換裝置,即HTLB和GTLB,對(duì)于任意一條訪存指令,處理器要判斷使用哪一套TLB來(lái)完成地址轉(zhuǎn)換工作。為了解決這個(gè)問題,在處理器中增加了一個(gè)新的客戶機(jī)專用指令SETMID。該指令用于指定下一條指令是否是客戶機(jī)訪存指令。如果是,處理器就使用GTLB作地址轉(zhuǎn)換,否則使用HTLB。
通過(guò)在硬件上增加GTLB和客戶機(jī)專用訪存指令SETMID這2項(xiàng)支持,客戶機(jī)的訪存指令經(jīng)過(guò)簡(jiǎn)單的格式轉(zhuǎn)換就可以在宿主機(jī)上執(zhí)行。
通過(guò)改造QEMU的軟件TLB算法,可以完全消除翻譯后指令在檢索QEMU軟件TLB數(shù)據(jù)結(jié)構(gòu)的步驟,大大降低訪存指令翻譯后指令規(guī)模。對(duì)于一條常規(guī)的X86訪存指令,新的翻譯規(guī)則將其翻譯成SETMID+Load/Store指令對(duì)。其中,X86訪存指令的訪存地址直接作為MIPS的訪存地址來(lái)使用。下面是一個(gè)X86的用戶態(tài)訪存指令及其翻譯后指令實(shí)例:X86code:
作為對(duì)比,圖3是優(yōu)化指令翻譯規(guī)則之前的代碼??梢钥吹?,原本需要數(shù)十條MIPS指令才能模擬執(zhí)行的X86訪存指令,現(xiàn)在只需要2條MIPS就可以模擬執(zhí)行。優(yōu)化后訪存相關(guān)的翻譯后指令規(guī)模僅為優(yōu)化前的20%,效果顯著。
在增加客戶機(jī)專用TLB、增加客戶機(jī)訪存相關(guān)指令、優(yōu)化二進(jìn)制翻譯器的同時(shí),客戶機(jī)TLB例外出現(xiàn)了。能否處理好客戶機(jī)TLB例外是決定這套硬件輔助優(yōu)化方案成敗的關(guān)鍵。
3.4.1 處理客戶機(jī)TLB例外存在的困難
在傳統(tǒng)的MIPS體系結(jié)構(gòu)中,TLB例外分為3種:(1)TLB miss,TLB缺失例外,當(dāng)TLB中找不到訪存地址對(duì)應(yīng)的表項(xiàng)時(shí)發(fā)生;(2)TLB invalid,TLB無(wú)效例外,當(dāng)訪存地址所在頁(yè)面不再物理內(nèi)存中時(shí)發(fā)生;(3)TLB modify:TLB修改例外,當(dāng)一個(gè)store指令嘗試修改只讀頁(yè)面里的數(shù)據(jù)時(shí)發(fā)生。TLB miss有獨(dú)立的例外入口,TLB invalid和TLB modify共享例外入口,這3種例外在內(nèi)核中有各自獨(dú)立的處理程序。
和傳統(tǒng)的MIPS TLB例外類似,龍芯中新增的GTLB也有3種例外,即 GTLB miss,GTLB invalid,GTLB modify。為這3個(gè)例外編寫新的例外處理程序存在一定的困難,因GTLB的例外無(wú)法由內(nèi)核或QEMU單獨(dú)處理。因?yàn)檐浖谛薷腉TLB時(shí),至少要滿足2個(gè)條件:(1)有用來(lái)更新GTLB表項(xiàng)的數(shù)據(jù),主要是GVA和HPA;(2)有更新GTLB的權(quán)限,即軟件運(yùn)行在核心態(tài)。對(duì)內(nèi)核來(lái)說(shuō),它擁有更新GTLB的權(quán)限,擁有GVA,但沒有與之對(duì)應(yīng)的HPA。對(duì)QEMU來(lái)說(shuō),它擁有GVA到GPA的映射關(guān)系,即X86頁(yè)表,也擁有GPA到HVA的映射關(guān)系,但沒有HVA到HPA的映射關(guān)系,即MIPS頁(yè)表。同時(shí),QEMU運(yùn)行在用戶態(tài),沒有修改GTLB的權(quán)限。因此,GTLB的例外需要內(nèi)核和QEMU協(xié)作才能處理。
3.4.2 處理客戶機(jī)TLB例外的軟件系統(tǒng)
為了處理GTLB例外,本文設(shè)計(jì)了一套軟件系統(tǒng),主要分為3個(gè)部分:
(1)支持GTLB例外處理的定制版Linux內(nèi)核:在GTLB例外入口處編寫函數(shù),該函數(shù)的作用是保存運(yùn)行時(shí)上下文,通過(guò)內(nèi)核的信號(hào)機(jī)制向QEMU發(fā)送SIGILL信號(hào),將例外現(xiàn)場(chǎng)信息傳遞給QEMU。由于該函數(shù)放置在GTLB例外入口處,因此只有以SETMID為前綴指令的訪存指令觸發(fā)GTLB例外時(shí)才會(huì)執(zhí)行。
(2)支持處理SIGILL信號(hào)的QEMU:修改后的QEMU接管了SIGILL信號(hào),因此,當(dāng)內(nèi)核向QEMU發(fā)送SIGILL信號(hào)時(shí),會(huì)調(diào)用QEMU中的信號(hào)處理函數(shù)。在SIGILL信號(hào)的處理函數(shù)中,QEMU分析內(nèi)核傳遞過(guò)來(lái)的例外現(xiàn)場(chǎng),調(diào)用相關(guān)函數(shù)查詢X86頁(yè)表得到GPA,再將GPA轉(zhuǎn)換成HVA,最后將GVA,HVA,MID等信息通過(guò)proc文件系統(tǒng)傳遞給內(nèi)核模塊KQ(Kernel Qemu)。
(3)輔助QEMU修改GTLB的內(nèi)核模塊KQ:KQ接收到來(lái)自QEMU的GTLB操作請(qǐng)求,如若是添加GTLB表項(xiàng)請(qǐng)求,則用HVA查MIPS頁(yè)表得到HPA。至此,用來(lái)修改GTLB的數(shù)據(jù)已經(jīng)齊備。接下來(lái),如果是刪除GTLB表項(xiàng)請(qǐng)求,就刪除掉GVA,MID對(duì)應(yīng)的GTLB表項(xiàng);如果是添加GTLB表項(xiàng)請(qǐng)求,則用GVA,HPA,MID和讀寫權(quán)限更新GTLB。
GTLB miss例外的處理流程如圖5所示。
圖5 GTLB miss例外的處理流程
從左開始第1列是硬件的相關(guān)步驟,第2列是內(nèi)核的相關(guān)步驟,第3列是QEMU的相關(guān)步驟。GTLB modify例外擁有類似的處理流程;而GTLB invalid例外不會(huì)發(fā)生,因?yàn)镚TLB miss例外在處理時(shí)已經(jīng)真正執(zhí)行了訪存指令,所有GTLB表項(xiàng)對(duì)應(yīng)的頁(yè)都已經(jīng)在物理內(nèi)存中分配。
通過(guò)使用這套軟件系統(tǒng),GTLB例外被完善地處理,使得客戶機(jī)訪存指令翻譯后指令在優(yōu)化后能正常執(zhí)行,從而為大幅提高客戶機(jī)的訪存性能提供保障。
本文在EVE硬件仿真加速平臺(tái)上建立軟硬件系統(tǒng)環(huán)境,在客戶機(jī)中運(yùn)行性能測(cè)試程序,從而評(píng)估二進(jìn)制翻譯性能。EVE是Synopsys公司的快速硬件仿真系統(tǒng),它使得在芯片流片前驗(yàn)證整個(gè)軟硬件系統(tǒng)的功能和性能成為可能。
測(cè)試的硬件平臺(tái)是龍芯3A1500處理器,這款處理器包含了針對(duì)X86客戶機(jī)的硬件支持,包括X86專用的GTLB和指令SETMID。軟件平臺(tái)包括優(yōu)化了訪存指令翻譯機(jī)制的QEMU、支持GTLB例外處理的Linux內(nèi)核和輔助QEMU修改GTLB的內(nèi)核模塊KQ(Kernel Qemu)。運(yùn)行的客戶機(jī)性能測(cè)試基準(zhǔn)程序包括:用于測(cè)試峰值訪存性能的memcpy,用于測(cè)試平均性能Linux內(nèi)核。由于仿真平臺(tái)的運(yùn)行速度較慢,在客戶機(jī)中運(yùn)行SPECCPU2000這樣的測(cè)試程序耗時(shí)約長(zhǎng)達(dá)數(shù)月,因此本文沒有測(cè)試。
測(cè)試過(guò)程包含4步:(1)在EVE上啟動(dòng) MIPS的Linux內(nèi)核;(2)在 MIPS內(nèi)核中啟動(dòng)QEMU;(3)在QEMU中啟動(dòng)X86的Linux;(4)在X86的Linux上運(yùn)行X86性能測(cè)試基準(zhǔn)程序,獲得測(cè)試分值。
性能對(duì)比方法是,通過(guò)在EVE上運(yùn)行優(yōu)化前和優(yōu)化后的二進(jìn)制翻譯系統(tǒng),分別在客戶機(jī)Linux中運(yùn)行各項(xiàng)測(cè)試,對(duì)比優(yōu)化前Origin配置和優(yōu)化后Optimize的數(shù)據(jù),分析優(yōu)化成果。2種配置的差異在于二進(jìn)制翻譯系統(tǒng)是否啟用了硬件輔助優(yōu)化功能來(lái)加速客戶機(jī)地址轉(zhuǎn)換。
內(nèi)存拷貝性能測(cè)試基于C庫(kù)中的Memcpy函數(shù)編寫,測(cè)試配置為拷貝內(nèi)存大小為X的數(shù)組Y次。
圖6的實(shí)驗(yàn)結(jié)果表明,在不同的配置下,優(yōu)化后的內(nèi)存拷貝性能為優(yōu)化前的100倍,優(yōu)化效果極其突出。
圖6 內(nèi)存拷貝性能測(cè)試
Linux在工業(yè)界應(yīng)用極為廣泛,本文采用其啟動(dòng)花費(fèi)的時(shí)間來(lái)評(píng)估系統(tǒng)的平均性能。2種配置的Linux內(nèi)核啟動(dòng)時(shí)間如圖7所示。
圖7 Linux內(nèi)核啟動(dòng)時(shí)間測(cè)試
可以看到,優(yōu)化后Linux內(nèi)核啟動(dòng)時(shí)間縮短了19.12%,優(yōu)化效果明顯。
本文分析了龍芯二進(jìn)制翻譯系統(tǒng)性能,指出了其性能瓶頸在于客戶機(jī)訪存,設(shè)計(jì)一套軟硬件結(jié)合的客戶機(jī)訪存性能優(yōu)化方案,并測(cè)試了優(yōu)化后系統(tǒng)的性能。該方案以用硬件TLB轉(zhuǎn)換客戶機(jī)地址為思路,以雙重硬件TLB為特征。優(yōu)化后的系統(tǒng)完全消除了客戶機(jī)地址轉(zhuǎn)換過(guò)程中的軟件開銷。實(shí)驗(yàn)結(jié)果表明,優(yōu)化后內(nèi)存拷貝性能提升了100倍,Linux內(nèi)核啟動(dòng)時(shí)間縮短了19.12%,優(yōu)化效果明顯。本文方案是在不同ISA虛擬環(huán)境中,用硬件實(shí)現(xiàn)客戶機(jī)地址轉(zhuǎn)換,對(duì)其他處理器平臺(tái)的客戶機(jī)性能優(yōu)化有借鑒意義。
隨著二進(jìn)制翻譯中客戶機(jī)訪存性能的優(yōu)化空間被硬件輔助方案挖掘得所剩無(wú)幾,該領(lǐng)域的熱點(diǎn)研究方向?qū)⑥D(zhuǎn)向I/O設(shè)備模擬,特別是圖形顯示加速器的模擬。如果I/O模擬的性能取得顯著成果,虛擬化技術(shù)的應(yīng)用將會(huì)得到進(jìn)一步普及。
[1]James S,Ravi N. Virtual Machines: Versatile Platforms for Systems and Processes[M].San Francisco,USA:Morgan Kaufmann Publishers,2005.
[2]Hu Weiwu, Zhang Fuxing, Li Zusong.Microarchitecture of the Godson-2Processor[J].Journal of Computer Science and Technology,2005,20(2):243-249.
[3]Bellard F.QEMU,a Fast and Portable Dynamic Translator[EB/OL].(2010-11-21).http://laokaddk.blog.51cto.com/368606/743624/.
[4]Hennessy J L,Patterson D A.Computer Architecture:A Quantitative Approach[M].5th ed.San Francisco,USA:Morgan Kaufmann Publishers,2011.
[5]Kivity A,Kamay Y,Laor D,et al.KVM:The Linux Virtual Machine Monitor[EB/OL].(2011-10-19).http://www.techrepublic.com/resource-library/whitepape rs/kvm-the-linux-virtual-machine-monitor/.
[6]Ebciogˇlu K, Altman E R. DAISY: Dynamic Compilation for 100%Architectural Compatibility[C]//Proceedings of the 24th Annual International Symposium on Computer Architecture.New York,USA:ACM Press,1997:26-37.
[7]Chernoff A,Herdeg M,Hookway R,et al.FX!32:A Profile-directed Binary Translator[J].IEEE Micro,1998,18(2):56-64.
[8]Dehnert J C,Grant B K,Banning J P,et al.The Transmeta Code Morphing Software:Using Speculation,Recovery,and Adaptive Retranslation to Address Real-life Challenges[C]//Proceedings of International Sym-posium on Code Generation and Optimization: Feedback-directed and Runtime Optimization.Seattle,USA:IEEE Computer Society,2003:15-24.
[9]張雪蘭,譚毓安,李元章.RIntel 80X86/Pentium匯編語(yǔ)言程序設(shè)計(jì)[M].3版.北京:北京理工大學(xué)出版社,2009.
[10]Bhargava R,Serebrin B,Spadini F,et al.Accelerating Two-dimensional Page Walks for Virtualized Systems[J].ACM SIGOPS Operating Systems Review,2008,42(2):26-35.
[11]Bhatia N.Performance Evaluation of AMD RVI Hardware Assist[EB/OL].(2009-03-17).http://www.yellow-bricks.com/2009/03/17.
[12]Chang Xiaotao,F(xiàn)ranke H,Ge Yi,et al.Improving Virtualization in the Presence of Software Managed Translation Lookaside Buffers[C]//Proceedings of the 40th Annual International Symposium on Computer Architecture.New York,USA:ACM Press,2013:120-129.