摘 要: 龍芯2F系統(tǒng)在TLB替換處理上開銷較大,現(xiàn)有軟TLB技術(shù)從減少TLB重載入異常處理時間方面考慮,,利用軟TLB來緩存TLB表項,,提高替換處理中Cached命中率,減少了重載入異常處理時間,。為進一步提高TLB效率,,設計采用多頁技術(shù)提高TLB的覆蓋率,減少TLB替換次數(shù),,進而減少重載入異常處理的次數(shù),,達到提高系統(tǒng)性能的目的。
關(guān)鍵詞: TLB,;重載入異常處理,;多頁技術(shù);龍芯2F
隨著軟件規(guī)模增大,,內(nèi)存需求越來越大?,F(xiàn)代系統(tǒng)提出虛空間的概念,軟件運行在獨立的虛空間中,被訪問時才從物理內(nèi)存中建立與之對應的空間,。TLB(Translate Look-aside Buffer)是加速線性地址向物理地址轉(zhuǎn)換的緩沖器,,即緩存最近使用過的頁的物理地址。使用線性地址和TLB中的存儲項進行比較,,如果相同就直接獲得目標頁的物理地址,,不需要訪問外存,這樣可大大提高地址轉(zhuǎn)換速度,。
龍芯2F是中科院計算所自主研發(fā)的高性能通用64位處理器[1],,在龍芯2F的Linux系統(tǒng)中,最占TLB替換處理時間的就是訪存操作,,減少訪存操作就可提高TLB使用效率,,從而提高龍芯2F的整體系統(tǒng)性能。現(xiàn)有軟TLB技術(shù)可減少TLB替換處理時間,,多頁技術(shù)的采用更可以減少TLB替換次數(shù),,從而進一步提高TLB替換效率,幫助對龍芯2F系統(tǒng)進行優(yōu)化,。
1 龍芯2F TLB重載入異常處理
龍芯2F系統(tǒng)采用Debian Linux,,其TLB只負責地址轉(zhuǎn)譯,表項維護由操作系統(tǒng)負責,,所以表頁發(fā)生修改時TLB內(nèi)容必須被及時更新[2],。Linux系統(tǒng)通過flush_tlb_all、flush_tlb_mm,、flush_tlb_page,、flush_tlb_range等函數(shù)來操作TLB內(nèi)容。龍芯2F為了提高TLB重載入異常處理效率,,提供了兩個TLB專用寄存器K0和K1,,這樣在進入重載入異常處理時就不需要對用戶寄存器進行保存,從而減少操作時間,。
TLB重載入異常處理流程為:進入重載入異常處理后,,首先獲取該進程頁全局目錄首地址,取得頁全局目錄和頁中間目錄內(nèi)容,,然后獲取兩個連續(xù)頁表項用來進行TLB替換寫入,,處理完畢后返回異常處理現(xiàn)場。
2 軟TLB處理實現(xiàn)
龍芯2F系統(tǒng)為64位,,頁表為3級頁表,,且操作地址不連續(xù),每次訪問三級頁表內(nèi)容時,,TLB重載入需要5次訪存操作,,產(chǎn)生3次左右的Cache失效,,使得TLB重載入異常處理時間大大加長。
龍芯2F系統(tǒng)中設計用軟TLB技術(shù)來減少TLB替換處理時間,,軟TLB技術(shù)在內(nèi)存空間中開辟出一個全局TLB緩沖區(qū)域,,作為硬件TLB的緩存,在系統(tǒng)進行TLB表項替換前,,要先查詢該TLB緩沖區(qū),,如果所查內(nèi)容在緩沖區(qū)內(nèi),,則將內(nèi)容寫入TLB,,如果查詢不到,則按照原來的TLB查詢過程進行查詢,。所以只訪問一次緩沖區(qū)且訪存操作連續(xù)的軟TLB方法產(chǎn)生Cache失效的幾率被大大降低了[3],。如果軟TLB查詢失敗,該次查詢只會造成系統(tǒng)多作一次訪問操作的額外開銷,,因此軟TLB技術(shù)減少TLB替換處理時間的重點在于提高軟TLB查詢命中率,。圖1為龍芯2F軟TLB重載入異常處理流程。
系統(tǒng)在修改頁表項時,,除修改硬件TLB對應項外,,還要查詢該頁表項是否緩存于軟TLB中,若已有緩沖則修改軟TLB中的頁表項,,否則就將該TLB表項緩存入軟TLB中,。
3 分頁對Linux系統(tǒng)的影響
龍芯2F采用軟硬協(xié)同實現(xiàn)內(nèi)存管理,硬件完成TLB地址轉(zhuǎn)譯,,軟件完成TLB表項替換,。為了增大TLB的覆蓋率,必須增加每項TLB表項的覆蓋范圍,,系統(tǒng)設計每個表項可以有不同的分頁大小,,從4 KB~16 MB按4倍增長。CP0寄存器PageMask用于記錄映射的頁的大小,,并且這個記錄在寫一個新的表項的同時載入TLB中[1],。因此操作系統(tǒng)可以支持不同大小的頁表項以適用于不同的目的,然而在同一運行的時刻只能是固定大小的頁,。
當TLB表項均采用4 KB分頁大小時,,TLB可為512 KB的地址進行轉(zhuǎn)譯;16 MB分頁大小時可為2 GB地址進行轉(zhuǎn)譯,。對于某個運算集合在4 MB和8 MB之間的程序來說,,如果分頁大小為32 KB,則在運算集合大于4 MB時TLB重載入異常處理會大量產(chǎn)生,,TLB替換次數(shù)會大量增加,。如果分頁大小為64 KB,,TLB就可以覆蓋整個8 MB運算集合,會大大減少TLB重載入異常的發(fā)生,。但是分頁也不是越大越好,,例如文件系統(tǒng)I/O操作與TLB無關(guān),如果用戶讀取數(shù)據(jù)小于頁大小,,分頁過大反而會增加系統(tǒng)I/O操作[4],;同樣,大的分頁會使得系統(tǒng)每個進程所需資源增加,,使系統(tǒng)能支持的進程數(shù)減少,,降低系統(tǒng)多進程的性能;大頁還會造成內(nèi)存使用緊張,,碎片增多,,頁的換入換出操作增多,降低系統(tǒng)內(nèi)存使用率,。
不同分頁大小對系統(tǒng)TLB重載入異常處理和替換次數(shù)有不同影響,,進而對系統(tǒng)性能有不同影響,所以應根據(jù)不同應用需求采用不同頁大小,。
4 多頁技術(shù)的實現(xiàn)
多頁技術(shù)針對TLB每個表項可分配頁大小,,根據(jù)實際需求按需分配頁大小,該頁大小信息保存在頁表項中,,用戶申請大空間時用大頁進行分配,,申請小空間時用小頁進行分配,有利于減少內(nèi)存碎片,。系統(tǒng)最小的頁被定為基本頁,,其他不同大小的頁用多個連續(xù)的基本頁來表示,在TLB頁表項中有頁大小的信息項,。由于線性區(qū)內(nèi)映射的TLB表項中的頁屬性在頁分配時并不分析該頁所屬線性區(qū)內(nèi)的其他頁信息,,所以在建立線性空間時就要將用戶所需的頁大小信息保存入頁表中,進行頁分配時再根據(jù)信息進行不同大小的頁分配,。
多頁技術(shù)主要通過修改Linux系統(tǒng)內(nèi)存管理子系統(tǒng)實現(xiàn),。線性空間建立主要通過Linux內(nèi)存分配函數(shù)mmap()實現(xiàn),應用軟件的代碼段和數(shù)據(jù)段均通過mmap()實現(xiàn)線性空間的建立,,并和文件系統(tǒng)關(guān)聯(lián),,使得線性空間成為文件內(nèi)容的映射區(qū)域[5]。要實現(xiàn)多頁技術(shù)需要對mmap()進行修改,,為了方便大頁的產(chǎn)生,,在查找空閑的線性空間時,要根據(jù)申請空間大小找到滿足條件的頁大小對齊的線性地址,,如果找不到,,則從大到小進行頁對齊,。在線性空間分配完成后,要建立多頁屬性的頁表,,根據(jù)傳入的線性空間大小,,盡量采用大頁,將分配好的頁信息保存至TLB頁表項的頁大小區(qū)域內(nèi),。
完成線性空間建立后,,根據(jù)用戶需求來決定頁大小并將頁信息存入頁表中,根據(jù)這些信息進行實際頁分配,。Linux系統(tǒng)有頁緩存頁和匿名頁兩種頁面,,為了實現(xiàn)多頁技術(shù),需對這兩種頁面的分配進行修改,。多頁技術(shù)的修改主要在于對原有頁分配函數(shù)進行修改替換,,通過對filemap_nopage()函數(shù)的修改實現(xiàn)將分配大頁后的文件數(shù)據(jù)讀入到連續(xù)頁緩存中,通過對do_no_page()函數(shù)的修改實現(xiàn)頁表的建立,。具體多頁申請分配流程見圖2。
現(xiàn)有龍芯Linux操作系統(tǒng)軟件規(guī)模日益增大與TLB覆蓋空間小的矛盾,,使得系統(tǒng)在TLB替換處理上開銷很大,,需要在系統(tǒng)內(nèi)存管理方面進行性能優(yōu)化[6]。通過軟件TLB重載入異常處理實現(xiàn)了TLB替換處理中命中率的提高,,減少了處理時間,。根據(jù)用戶需求進行分配的多頁技術(shù)進一步改進了軟TLB重載入異常處理,提高了TLB覆蓋率,,減少了重載入異常處理次數(shù),,能夠發(fā)揮各種頁大小的優(yōu)勢,使得系統(tǒng)性能得到明顯提升,。
參考文獻
[1] 北京龍芯中科技術(shù)服務中心有限公司.龍芯2F處理器用戶手冊V1.0.2008.
[2] 蘇波,,李凱.龍芯2F上的訪存優(yōu)化[J].計算機系統(tǒng)應用,2010,,19(1):171-175.
[3] 許先超.減少TLB失效開銷提高64位Linux系統(tǒng)性能的方法[J].計算機工程,,2006,32(1):70-72.
[4] 孫益輝,,陳凱,,白英彩.嵌入式操作系統(tǒng)內(nèi)存管理機制分析及改進[J].計算機應用與軟件,2006,,23(3):98-99,,115.
[5] 謝長生,劉志斌.Linux2.6內(nèi)存管理研究[J].計算機應用研究,,2005(3):58-60.
[6] 李小群,,孫玉芳.Linux內(nèi)存管理機制的分析與研究[J].計算機科學,,2002,29(4),,18-20.