張麗果, 劉 雄
(西安郵電大學(xué) 電子工程學(xué)院, 陜西 西安 710121)
圖形處理器(graphics processing unit,GPU)以其強(qiáng)大的渲染能力被廣泛應(yīng)用于PC機(jī)、多媒體以及嵌入式設(shè)備中,已經(jīng)成為圖形處理技術(shù)的研究重點(diǎn)之一[1]。隨著嵌入式設(shè)計(jì)復(fù)雜度不斷提升,存儲(chǔ)管理成為嵌入式GPU設(shè)計(jì)的關(guān)鍵部件。虛擬存儲(chǔ)技術(shù)是一種基于操作系統(tǒng)的存儲(chǔ)管理方法,為用戶提供比實(shí)際物理存儲(chǔ)器更大的存儲(chǔ)空間。
存儲(chǔ)管理單元(memory management unit,MMU)是虛擬存儲(chǔ)技術(shù)的硬件基礎(chǔ),其中地址轉(zhuǎn)換后援緩沖器(translation look-aside buffer, TLB)則是MMU的核心部件,用于完成虛擬地址到物理地址的映射,并提供訪問權(quán)限檢查。嵌入式GPU支持32位地址總線,因此,MMU最大可以管理4G(232)的虛擬內(nèi)存空間。內(nèi)存管理方式分為頁式管理和段式管理。在嵌入式系統(tǒng)中,一般采用頁式管理。對(duì)于連續(xù)的內(nèi)存空間存放頁表的問題,采用兩級(jí)頁表的TLB結(jié)構(gòu)。在進(jìn)行地址翻譯時(shí),傳統(tǒng)的TLB結(jié)構(gòu)[2]只能按級(jí)進(jìn)行查找,一旦TLB失靶,就會(huì)導(dǎo)致頁表切換,造成能量消耗和時(shí)鐘延遲,從而導(dǎo)致處理器的性能降低[2-3]。
為了高效并靈活地管理內(nèi)存空間,減少頁切換[4],本文擬設(shè)計(jì)一種適用于嵌入式GPU存儲(chǔ)管理單元的硬件結(jié)構(gòu)。采用樹狀頁表結(jié)構(gòu)[5]進(jìn)行地址翻譯,將一級(jí)頁表索引和兩級(jí)頁表索引同時(shí)與TLB比較,若兩級(jí)頁表命中,直接翻譯出物理地址。最后采用DC工具進(jìn)行綜合,并在ZC706開發(fā)板上進(jìn)行驗(yàn)證。
MMU的主要功能是地址翻譯和內(nèi)存保護(hù)。嵌入式GPU中存儲(chǔ)管理單元采用兩級(jí)頁表的管理方式進(jìn)行地址翻譯,兩級(jí)頁表的結(jié)構(gòu)如圖1所示,其中每頁的大小為4 KB。第一級(jí)為頁目錄(page directory),共有1 024(210)個(gè)目錄表項(xiàng)(directory table entries,DTEs);第二級(jí)為頁表(page table),共有1 024(210)個(gè)頁表項(xiàng)(page table entries,PTEs)。
圖1兩級(jí)頁表結(jié)構(gòu)
將虛擬地址的高10位(DTE索引)與TLB中的DTE_Tag、虛擬地址的高20位(DTE和PTE索引)與PTE_Tag同時(shí)比較,實(shí)現(xiàn)兩級(jí)頁表同時(shí)匹配,有效的減少了頁切換。地址變換機(jī)構(gòu)如圖2所示,具體翻譯過程如下。
(1) PTE_Tag命中時(shí),直接讀取PTE對(duì)應(yīng)的物理頁號(hào)與虛擬地址的頁內(nèi)偏移拼接為32位物理地址,完成地址翻譯。
(2) DTE_Tag命中、PTE_Tag失靶,讀取DTE對(duì)應(yīng)的物理頁號(hào)并與PTE索引位拼接后,組成尋找PTE的“虛擬地址”,訪問L2cache或主存,讀取PTE后,更新PTE_Tag和TLB,最后,讀取PTE對(duì)應(yīng)的物理頁號(hào)與虛擬地址的頁內(nèi)偏移拼接組成32位物理地址。
(3) DTE_Tag和PTE_Tag失靶,硬件邏輯產(chǎn)生一個(gè)基址(DTE_ADDR),再拼接DTE索引,組成尋找DTE的“虛擬地址”,訪問L2cache或主存,讀取DTE后,更新DTE_Tag和TLB后,讀取DTE對(duì)應(yīng)的物理頁號(hào),接下來的操作和情況(2)相同。
PTE在TLB中以4字節(jié)(32 bits)存儲(chǔ),高20位存儲(chǔ)物理頁表;對(duì)主存和cache同時(shí)管理,PTE[11∶3]為cache控制位;低3位為存儲(chǔ)保護(hù)位,提供訪問權(quán)限檢查。
圖2 地址變換機(jī)構(gòu)
TLB是MMU的核心部件,用于保存最近使用的頁表項(xiàng)以及相應(yīng)的訪問權(quán)限控制信息,并利用程序訪問的局部性原理,加速虛擬地址到物理地址的轉(zhuǎn)換。TLB的結(jié)構(gòu)如圖3所示,主要由CAM和SRAM組成,CAM用來存儲(chǔ)最近使用的4個(gè)頁目錄標(biāo)簽(DTE_Tag)和28個(gè)頁表項(xiàng)標(biāo)簽(PTE_Tag),SRAM中主要存儲(chǔ)16個(gè)DTE、112個(gè)PTE,其中PTE中包含物理頁號(hào)、cache控制信息以及存儲(chǔ)保護(hù)信息。
TLB的相聯(lián)方式對(duì)時(shí)鐘頻率和功耗的影響較大[6]。對(duì)面積、功耗、速度的折中考慮,采用全相聯(lián)的TLB結(jié)構(gòu)。
MIPS是最早提供軟件管理TLB的商用體系結(jié)構(gòu)之一[7]。軟件管理TLB失靶的方式就是,硬件向操作系統(tǒng)發(fā)送中斷請(qǐng)求信號(hào)并轉(zhuǎn)移到查表中斷處理子程序處理中斷,處理完中斷后,本條指令重新訪問TLB,繼續(xù)執(zhí)行后續(xù)指令[8]。
這種軟件管理TLB失靶的機(jī)制具有非常高的靈活性,但卻帶來了大量時(shí)鐘周期的開銷。TLB失靶時(shí),需要到cache或外部存儲(chǔ)器中查找頁表,用于查表的處理程序是一段10~100條指令組成的操作原語[9],如果處理程序的指令不在cache中,那么查找失靶的頁表所需要的時(shí)鐘周期將比傳統(tǒng)硬件狀態(tài)機(jī)遍歷頁表所需的時(shí)鐘周期更長,并且在更新頁表時(shí),暫停和清除流水線又將浪費(fèi)多個(gè)時(shí)鐘周期,此外,還需清除緩存中的多條指令,這將為查表增加成百上千個(gè)時(shí)鐘周期開銷[10]。
為了減少軟件在查表過程中造成的額外的開銷,采用硬件管理TLB失靶,當(dāng)DTE失靶時(shí),硬件邏輯產(chǎn)生頁表基地址,并寫入寄存器DTE_ADDR[11],基址拼接DTE索引組成查找DTE的“虛擬地址”;PTE失靶,DTE和PTE索引組成查找PTE的“虛擬地址”,如圖3所示。硬件管理TLB失靶的方式不用暫?;蚯宄魉€,減少了時(shí)鐘周期的開銷。查表的整個(gè)過程由狀態(tài)機(jī)控制。
MMU另一個(gè)重要的功能就是存儲(chǔ)保護(hù),如果試圖訪問沒有權(quán)限的存儲(chǔ)空間就會(huì)產(chǎn)生錯(cuò)誤。對(duì)于虛擬存儲(chǔ)而言,多個(gè)進(jìn)程可以共享數(shù)據(jù),然而,非法的讀寫操作會(huì)產(chǎn)生“硬件陷阱”,因此,對(duì)不同的進(jìn)程,應(yīng)賦予不同的讀寫權(quán)限,這樣既能保證信息安全,又能滿足運(yùn)行需要。
圖3 TLB的結(jié)構(gòu)
存儲(chǔ)保護(hù)保證當(dāng)前讀寫訪問是合法的,當(dāng)DTE_Tag命中,在SRAM中讀取DTE時(shí),應(yīng)檢查有效位(DTE[0])是否有效,若有效位為0,則該DTE不能指向下級(jí)頁表;當(dāng)PTE_Tag命中,在SRAM中讀取PTE時(shí),不僅需要檢查有效位是否有效,還需檢查讀寫訪問權(quán)限,存儲(chǔ)保護(hù)規(guī)則如表1所示。PTE[0]為PTE有效位,PTE[2∶0]為讀寫檢查的標(biāo)志位,若違反以下規(guī)則中任意一種情況,會(huì)導(dǎo)致異常,硬件向操作系統(tǒng)發(fā)送中斷請(qǐng)求信號(hào)并轉(zhuǎn)移到中斷子程序處理中斷。
表1 存儲(chǔ)保護(hù)規(guī)則
MMU的工作過程主要由狀態(tài)機(jī)來完成,如圖4 所示。頁錯(cuò)誤狀態(tài)、停頓狀態(tài)、總線錯(cuò)誤狀態(tài)為異常狀態(tài),狀態(tài)機(jī)之間的跳轉(zhuǎn)由控制信號(hào)(page_fault、read_error等)以及系統(tǒng)配置MMU命令寄存器來完成。
圖4 MMU工作狀態(tài)轉(zhuǎn)移圖
(1)禁止?fàn)顟B(tài):系統(tǒng)復(fù)位之后,MMU是處于禁止訪問狀態(tài),此時(shí)命令寄存器(MMU_CMD_register,MCR)的值為1。
(2)使能狀態(tài):當(dāng)MMU發(fā)現(xiàn)GPU或cache發(fā)送訪問存儲(chǔ)器請(qǐng)求時(shí),此時(shí)MCR的值是0,MMU進(jìn)入使能狀態(tài),MMU開始進(jìn)行地址翻譯。
(3)頁錯(cuò)誤狀態(tài):當(dāng)DTE或PTE失靶、有效位為0或沒有讀寫訪問權(quán)限時(shí),會(huì)產(chǎn)生page fault信號(hào),狀態(tài)機(jī)會(huì)跳到頁錯(cuò)誤狀態(tài),硬件會(huì)產(chǎn)生頁錯(cuò)誤中斷請(qǐng)求信號(hào),同時(shí)虛擬地址將會(huì)被存儲(chǔ)到Replay_buffer中,等待總線沒有訪問請(qǐng)求時(shí),將失靶虛擬地址再次匹配;頁錯(cuò)誤處理完后,MCR的值為5,并跳出頁錯(cuò)誤狀態(tài)。
(4)停頓狀態(tài):當(dāng)總線空閑時(shí),MCR中的值為2,MMU進(jìn)入停頓狀態(tài),停止地址翻譯;等待GPU或Cache發(fā)送請(qǐng)求時(shí),MCR的值為3,狀態(tài)機(jī)跳出停頓狀態(tài)。
(5)總線錯(cuò)誤狀態(tài):如果出現(xiàn)讀請(qǐng)求失敗,產(chǎn)生read error信號(hào),MMU會(huì)進(jìn)入總線錯(cuò)誤狀態(tài),同時(shí)會(huì)產(chǎn)生總線錯(cuò)誤中斷請(qǐng)求信號(hào),MCR中的值為6,此時(shí)復(fù)位MMU。
當(dāng)TLB命中且沒有違反存儲(chǔ)保護(hù)規(guī)則時(shí),直接完成地址翻譯;若TLB未命中或違反存儲(chǔ)保護(hù)規(guī)則,狀態(tài)機(jī)跳到頁錯(cuò)誤狀態(tài);若出現(xiàn)總線讀錯(cuò)誤時(shí),狀態(tài)機(jī)跳轉(zhuǎn)到總線錯(cuò)誤狀態(tài);若總線空閑時(shí),狀態(tài)機(jī)跳轉(zhuǎn)到停頓狀態(tài),狀態(tài)機(jī)跳轉(zhuǎn)到這三種狀態(tài)下,則會(huì)導(dǎo)致異常。
硬件會(huì)修改中斷狀態(tài)寄存器(MMU_interrupt_status_register,MISR)和狀態(tài)寄存器(MMU_status_register,MSR)的值,并跳轉(zhuǎn)到中斷子程序處理中斷[9],處理完中斷后重新訪問TLB,繼續(xù)后續(xù)地址翻譯,MMU異常處理如表2所示。
表2 MMU異常處理
為了驗(yàn)證嵌入式GPU的存儲(chǔ)管理單元的硬件電路的正確性。利用DC工具進(jìn)行仿真與綜合,在SIMC 0.18 μm工藝庫下,頻率可達(dá)225 MHz,滿足嵌入式GPU設(shè)計(jì)頻率要求。將帶有MMU的GPU封裝為IP核下載至ZC706開發(fā)板中,并在開發(fā)板上移植Linux操作系統(tǒng),采用OpenGL ES 2.0圖形應(yīng)用程序語言編寫牛和兔子的測試場景,并在GPU下運(yùn)行,如圖5所示,牛和兔子的輪廓清晰,圖形效果逼真。由此可知,MMU硬件電路設(shè)計(jì)可行,且滿足嵌入式GPU存儲(chǔ)管理的要求。
圖5 OpenGL ES 2.0圖形應(yīng)用程序效果
采用樹狀頁表的TLB結(jié)構(gòu)以及硬件處理TLB失靶的方式,設(shè)計(jì)并實(shí)現(xiàn)了一種嵌入式圖形處理器的存儲(chǔ)管理單元的硬件設(shè)計(jì)結(jié)構(gòu)。在SIMC 0.18 μm工藝庫下進(jìn)行了綜合,并在ZC706開發(fā)板進(jìn)行系統(tǒng)級(jí)驗(yàn)證,結(jié)果表明,該設(shè)計(jì)頻率可達(dá)225 MHz,能夠?qū)崿F(xiàn)嵌入式GPU存儲(chǔ)管理的要求。