摘 要:嵌入式軟件目前已廣泛應(yīng)用于生活和工業(yè)中,由于其硬件開發(fā)的局限性,在微控制器(單片機)利用軟件的方式來仿真嵌入式硬件平臺的物理結(jié)構(gòu)和硬件功能目前在工業(yè)和軟件開發(fā)過程中的應(yīng)用越來越普遍,以軟件方式模擬MMU對內(nèi)存的操作,實現(xiàn)低端微處理器管理大量內(nèi)存,來代替高端的ARM內(nèi)核的微處理器能以比較快的速度進行訪問的功能,實現(xiàn)應(yīng)用上層接口比較方便的系統(tǒng)。本文先重點介紹了ARM系列微處理器中MMU的硬件結(jié)構(gòu)、MMU相關(guān)的緩存結(jié)構(gòu)以及MMU的事務(wù)處理過程。在此基礎(chǔ)上對MMU訪問的緩存硬件TLB、Cache、WriteBuffer等結(jié)構(gòu)組成和屬性進行描述,并進行軟件仿真實現(xiàn)。最后針對s3c2440微處理器與MMU所相關(guān)的行為給予軟件實現(xiàn),并進行平臺測試。
關(guān)鍵詞:存儲管理單元(MMU);軟件仿真;J_Link仿真器
中圖分類號:TP332
在微控制器(單片機)利用軟件的方式來仿真[1]嵌入式硬件平臺的物理結(jié)構(gòu)和硬件功能目前在工業(yè)和軟件開發(fā)過程中的應(yīng)用越來越普遍,如今大多數(shù)微處理器都集成了內(nèi)存管理單元[2-4](以后簡稱MMU),利用MMU協(xié)處理器進行內(nèi)存的擴展,為內(nèi)存的虛擬化[5]提供支持。而且在許多單片系統(tǒng)開發(fā)的初期,由于系統(tǒng)模型構(gòu)建的復(fù)雜性、MMU硬件本身造價的限制,也不適合直接擴展硬件MMU以求得大量快速內(nèi)存的實現(xiàn)。而現(xiàn)在對于ARM處理器中MMU的學(xué)術(shù)研究大多集中于MMU硬件的體系結(jié)構(gòu)[6-7]和設(shè)計實現(xiàn),通過軟件仿真MMU硬件的研究卻是很少,即使有所實現(xiàn),但大多是針對于高端的平臺,成本較高。本文針對市場很少開發(fā)的中低端微處理器平臺,利用軟件的方式仿真硬件MMU的物理結(jié)構(gòu)和功能,實現(xiàn)大部分硬件MMU功能,從而使系統(tǒng)能夠容易地獲得大量較快速度的內(nèi)存。
由于市場上比較廣泛應(yīng)用于嵌入式系統(tǒng)的處理器是帶有MMU的ARM處理器,文獻[8]提出了一種MMU的軟件模擬模型,但對于MMU的硬件結(jié)構(gòu)和運行機理的建模過于簡單?;诖耍訟RM處理器的MMU協(xié)處理器為研究對象,以面對對象的方式,對MMU協(xié)處理器的組件及運行機理建立軟件模擬模型,并且結(jié)合實際需要,進行測試[9]實驗。
1 ARM系統(tǒng)中MMU系統(tǒng)結(jié)構(gòu)
MMU屬于CPU的協(xié)處理器,它的兩個主要功能是:完成虛擬地址到物理地址的轉(zhuǎn)換以及硬件機制的內(nèi)存訪問權(quán)限檢查,使得每個用戶進程擁有自己獨立的地址空間,并通過內(nèi)存訪問權(quán)限的檢查保護每個進程所用的內(nèi)存不被其他進程破壞;主要訪問的部件[10]有:TLB(translation lookaside buffer),高速緩存Cache,WriteBuffer,快速上下文切換擴展FCSE硬件以及部分協(xié)處理器寄存器。
1.1 地址映射
ARM微處理器中的CPU核產(chǎn)生的地址稱為虛擬地址(Virtual Address),在確保訪問的數(shù)據(jù)已在物理內(nèi)存中后,需要先將虛擬地址轉(zhuǎn)換為物理地址,即“地址映射”,這樣CPU才能讀寫實際的數(shù)據(jù),而這個過程的完成便需要MMU的TLB[11]完成。MMU允許把虛擬地址映射成一個相應(yīng)的不同的物理地址,所對應(yīng)的物理地址指明了需要訪問的外部空間的位置。
1.2 內(nèi)存訪問權(quán)限檢查
當(dāng)一條程序指令需要對指定的存儲區(qū)域訪問時,MMU便進行訪問權(quán)限的檢查,以保護每個進程所用的內(nèi)存不被其他進程破壞。檢查的結(jié)果包括無訪問權(quán)限、只讀權(quán)限、可讀寫權(quán)限,由CP15寄存器C3(域訪問控制)、描述符的域(Domain)、CP15寄存器C1的R/S/A位、描述符的AP位共同決定,“域”決定是否對某塊內(nèi)存進行權(quán)限檢查,“AP”決定如何對某塊內(nèi)容進行權(quán)限檢查。
1.3 TLB
TLB是MMU硬件中的緩存結(jié)構(gòu),存放從虛擬地址到物理地址的地址查找表,由于從Virtual Address到Physical_Address的轉(zhuǎn)換需要訪問多次內(nèi)存,大大降低了CPU的性能,故提出TLB辦法改進。當(dāng)CPU發(fā)出一個虛擬地址Virt_Addr[12]時,MMU首先訪問TLB。如果TLB中含有能轉(zhuǎn)換這個虛擬地址的描述符,則直接利用此描述符進行地址轉(zhuǎn)換和權(quán)限檢查,不必再做TTW(Translation Table Walk),否則MMU訪問頁表找到描述符后再進行地址轉(zhuǎn)換和權(quán)限檢查,并將這個描述符填入TLB中,下次再使用這個虛擬地址時就直接使用TLB用的描述符。使用TLB需要保證TLB中的內(nèi)容與頁表一致,在啟動MMU之前,頁表中的內(nèi)容發(fā)生變化后,尤其要注意。一般的做法是在啟動MMU之前使整個TLB無效,改變頁表時,使所涉及的虛擬地址對應(yīng)的TLB中條目無效[13]。
1.4 Cache硬件
為了提高程序的運行速度,在主存和CPU通用寄存器之間通常設(shè)置一個高速的、容量相對較小的存儲器[14],把正在執(zhí)行的指令地址附近的一部分指令或數(shù)據(jù)從主存調(diào)入這個存儲器,供CPU在一段時間內(nèi)使用,實質(zhì)上起到緩存的作用,這便是Cache[15]。在ARM微處理器中,一般分為指令I(lǐng)Cache(Instruction Cache)和數(shù)據(jù)DCache(Data Cache),兩者區(qū)別只是所保存的數(shù)據(jù)類型有所不同。
1.5 FCSE硬件
在ARM中,快速上下文切換擴展FCSE(Fast Context Switch Extension)硬件針對不同進程的地址管理,通過修改系統(tǒng)中不同進程的虛擬地址,避免在進行進程間切換時造成的虛擬地址到物理地址的重映射,從而提高系統(tǒng)的性能。通常情況下,如果兩個進程占用的虛擬地址空間有重疊,系統(tǒng)在這兩個進程之間進行切換時,必須進行虛擬地址到物理地址的重映射。而虛擬地址到物理地址的重映射涉及到重建MMU中的頁表,而且cache及TLB中的內(nèi)容都必須使無效(通過設(shè)置協(xié)處理器寄存器的相關(guān)位)。這些操作將帶來巨大的開銷代價,一方面重建MMU和使無效cache及TLB的內(nèi)容需要很大的代價,另一方面重建cache和TLB內(nèi)容也需要很大的代價。FCSE的引入避免了這種開銷。在微處理器的物理結(jié)構(gòu)上,它位于CPU和MMU之間。如果兩個進程使用了同樣的虛擬地址空間,則對CPU而言,兩個進程使用了同樣的虛擬地址空間;快速上下文切換硬件對各進程的虛擬地址進行變換,將CPU產(chǎn)生的虛擬地址Virt_Addr轉(zhuǎn)換為轉(zhuǎn)換虛擬地址Mvirt_Addr,這樣系統(tǒng)中除了CPU之外的其他部分看到的是經(jīng)過快速上下文切換機構(gòu)變換的轉(zhuǎn)換虛擬地址。快速上下文切換機構(gòu)就可以把兩個進程的相同虛擬地址空間變換成不同的虛擬地址空間,在進行進程間切換時就不需要進行虛擬地址到物理地址的重映射。
1.6 寄存器
在ARM微處理器中定義了16種CP寄存器,表1給出了不同寄存器的功能:
表1 CP15協(xié)處理器的寄存器列表
要操作CP15寄存器組需使用MCR和MRC指令,要訪問則必須在特權(quán)模式下利用該指令來進行,其他的方式訪問CP1寄存器都會產(chǎn)生未定義指令異常。C1、C2、C3、C5、C6、C8和C10寄存器是與MMU操作有關(guān)的,而CPU則是通過執(zhí)行MRC和MCR指令,完成對上述寄存器的配置或讀寫,從而達到控制MMU硬件行為的目的。
2 ARM中MMU工作原理及實現(xiàn)
2.1 ARM整體結(jié)構(gòu)
我們首先整體建立MMU數(shù)據(jù)結(jié)構(gòu),然后針對每一部件逐一實現(xiàn)。
MMU數(shù)據(jù)結(jié)構(gòu)如下:
基于TLB,TTW,訪問控制,CACHE,Write Buffer,Read Buffer等MMU要素與具體處理器類型無關(guān)的,我們首先進行模擬,并且由于它實現(xiàn)了并且提供了較統(tǒng)一的接口,下面就可以較靈活地組合實現(xiàn)具體MMU模擬。
2.2 TLB的實現(xiàn)
TLB是集成到MMU硬件中的存儲結(jié)構(gòu),主要保存地址映射信息和訪問控制信息,地址轉(zhuǎn)換信息只有在該表中查詢不到時,才通過TTW在內(nèi)存中查找。因此,每一個TLB的表項的數(shù)據(jù)結(jié)構(gòu)可設(shè)計如下:
結(jié)構(gòu)體tlb_entry_s中的項mvirt_addr表示的是轉(zhuǎn)換虛擬地址,也就是從CPU提供的虛擬地址經(jīng)過FCSE以后的轉(zhuǎn)換虛擬地址;項phys_addr表示與虛擬地址相對應(yīng)的物理地址,該物理地址就是用來訪問外部存儲器中的數(shù)據(jù)或指令的真實地址;項map_type表示物理地址phys_addr所對應(yīng)內(nèi)存塊的類型,可以是段、大頁、小頁和微頁。不同的內(nèi)存塊類型,其對應(yīng)的大小不相同。而不同的接口函數(shù)如下:
2.3 TTW的實現(xiàn)
ARM系統(tǒng)中通過2級映射,實現(xiàn)了頁式地址轉(zhuǎn)換。其接口函數(shù)如下:
fault_t translate(m_state *state,unsigned int virt_addr, tlb_s *tlb_s, tlb_entry_s **tlb)
2.4 訪問控制的實現(xiàn)(接口函數(shù))
void fault_t check_access(m_state *state,unsigned int virt_addr, tlb_entry_s *tlb,int read);
2.5 Cache的實現(xiàn)
ARM系統(tǒng)中一般只實現(xiàn)組相聯(lián)Cache。組相聯(lián)Cache分成多組,一個組有包括多個Cache line,一個32位地址可以由下圖表示。
TagSetWord10
圖1
Cache緩存的數(shù)據(jù)結(jié)構(gòu)可以定義如下:
Cache接口函數(shù)
2.6 Write Buffer的實現(xiàn)
WriteBuffer高速緩存用于保存CPU需要寫回外部存儲中的數(shù)據(jù)。當(dāng)CPU需要把數(shù)據(jù)寫回到外部存儲時,并且所寫的數(shù)據(jù)可以緩存時,那么MMU先把數(shù)據(jù)寫到WriteBuffer中,到適當(dāng)?shù)臅r候再把WriteBuffer中的數(shù)據(jù)寫回到外部存儲,這樣可以避免降低CPU的速度來完成寫操作。所以用一個循環(huán)隊列模擬Write Buffer。數(shù)據(jù)結(jié)構(gòu)如下:
接口函數(shù)如下:
2.7 Read Buffer的實現(xiàn)
數(shù)據(jù)結(jié)構(gòu)定義如下:
接口函數(shù)如下:
2.8 ARM MMU的組成結(jié)構(gòu)
ARM的MMU分成指令和數(shù)據(jù)兩部分。指令包括一個指令TLB和一個指令CACHE,數(shù)據(jù)包括一個數(shù)據(jù)TLB,兩個數(shù)據(jù)CACHE(main CACHE和mini CACHE),一個Write Buffer和一個Read Buffer。數(shù)據(jù)結(jié)構(gòu)定義:
3 測試與結(jié)論
S3C2440是由三星公司生產(chǎn)的基于ARM920T[17]內(nèi)核的一款16/32-bitRISC先進微處理器,ARM920T實現(xiàn)了MMU,AMBABUS以及哈佛緩存體系構(gòu)架通過分離的16Kb指令緩存和16Kb數(shù)據(jù)緩存,并采取新的總線構(gòu)架(AMBA),0.13μmCMOS制造工藝,能耗低,適用于大多數(shù)中低端平臺。而本次實驗便是以S3C2440系列的S3C2440AZ-40處理器和對應(yīng)的J-Link仿真器為例,進行程序的測試與結(jié)果的分析。我們在開發(fā)板上運行mmu_init,啟動MMU,將部分虛擬地址空間映射到物理地址空間,然后通過操作地址用以驅(qū)動LED燈。然后運行上述程序,將內(nèi)核編譯的u-boot文件在J_Link仿真器上調(diào)試,觀察兩者的差別。最終實驗可見,利用MMU仿真模型設(shè)計實現(xiàn)的模塊和實際硬件的工作過程是類似的。操作系統(tǒng)內(nèi)核文件u-boot被仿真器啟動運行后,MMU模塊很好地完成了運行過程中CPU所有的訪問存儲器請求,完成了地址映射功能,基本達到了仿真實現(xiàn)MMU并應(yīng)用于嵌入式仿真器中的目的。
4 結(jié)束語
本文以MMU硬件構(gòu)架和功能實現(xiàn)為基礎(chǔ),設(shè)計算法并實現(xiàn)MMU 模塊。最后把所實現(xiàn)的MMU模塊應(yīng)用于仿真器中,編譯測試例子進行驗證。本文在研究MMU仿真實現(xiàn)過程中,重點放在對MMU仿真過程的分析,期望建立正確的MMU仿真模型,從而給完整實現(xiàn)MMU模塊并應(yīng)用于仿真器中提供重要的保證。MMU是微處理器芯片的一個協(xié)處理器,只能屬于微處理器中的一小部分,還有很多個其他控制器,要實現(xiàn)完整的部件,軟件仿真還有很多。和實現(xiàn)MMU協(xié)處理器一樣,其他的部件需要正確描述控制器所用到的緩存結(jié)構(gòu),更復(fù)雜的是正確描述控制器處理事務(wù)的詳細過程。這樣,仿真實現(xiàn)穩(wěn)定和正確的控制器就顯得尤其重要,這在一定程度上存在著一些不足,因為運行一個內(nèi)核文件沒有出現(xiàn)問題,并不能保證運行其他系統(tǒng)程序或者應(yīng)用程序時不發(fā)生一些異常情況,而一些異常可能會造成系統(tǒng)崩潰。所以還有更多的需要考慮,那也是后續(xù)的事情了。
參考文獻:
[1]孫緒紅,曾獻君,陳吉華,李思昆.硬件仿真與軟件模擬[J].計算機應(yīng)用,2000.
[2]宋傳華,Cheng Xu,Zhu Dexin.TheMMUImplementation of Unity-1 Microprocessor[J].高技術(shù)通訊(英文版),2003(04):27-32.
[3]李樹國,劉詩斌,高德遠.存儲器管理部件的研究[J].西北工業(yè)大學(xué)學(xué)報,2000(03):357-359.
[4]屈文新,樊曉椏.\"龍騰\"R2微處理器存儲管理單元的設(shè)計與實現(xiàn)[J].西北工業(yè)大學(xué)學(xué)報,2007(01):137-141.
[5]王華斌,夏清泉,李希然.內(nèi)存管理單元MMU虛擬化代價研究[J].哈爾濱商業(yè)大學(xué)學(xué)報(自然科學(xué)版),2012(04):447-450.
[6]李瑛,高德遠,張盛兵,樊曉椏.32位RISC中存儲管理單元的設(shè)計[J].西北工業(yè)大學(xué)學(xué)報,2004(03):365.
[7]蔡珊.嵌入式32位RISC處理器中存儲管理單元的研究與設(shè)計[D].西安電子科技大學(xué),2009.
[8]王宏宇.ARM32位處理器存儲器管理單元系統(tǒng)級軟件模擬模型的研究[D].北京:華北電力大學(xué),2009.
[9]唐英,徐良賢.一種軟件代碼精細分析技術(shù)[J].電子學(xué)報,2002(12A):2.
[10]袁平.內(nèi)存管理硬件單元的設(shè)計與實現(xiàn)[J].微電子學(xué)與計算機,1992(09):28.
[11]吳春瑜,林爽,陶洪亮.基于SRAM的MMU新設(shè)計方法[J].遼寧大學(xué)學(xué)報(自然科學(xué)版).
[12]王慶民,劉福巖.ARM MMU中虛地址轉(zhuǎn)換研究[J].機械工程與自動化,2007(01):44-46.
[13]張秀平,楊國武,李曉瑜.MMU協(xié)處理器的一種軟件模擬模型[J].計算機工程與應(yīng)用,2011(03):57-60.
[14]百度文庫.MMU與CACHE詳解.http://wenku.baidu.com/,2010-10-18.
[15]劉振宇,齊家月.高性能RISC微處理器硬件仿真器設(shè)計[J].計算機研究與發(fā)展,2004(08):1436-1441.
[16]百度文庫.MMU的描述符.http://wenku.baidu.com/,2010-11-11.
[17]周潔,楊心懷.32位RISC CPU ARM芯片的應(yīng)用和選型[J].電子技術(shù)應(yīng)用,2002(08):6-9.
作者簡介:張加林(1992-),男,河南開封人,本科,研究方向:信電仿真;王海琳(1991-),男,河北廊坊人,本科,研究方向:信電仿真。
作者單位:中國礦業(yè)大學(xué) 孫越崎學(xué)院,江蘇徐州 221116