ARM存儲(chǔ)器之:存儲(chǔ)管理單元MMU
⑤域控制位失效
域控制位失效包括兩種類(lèi)型。一種基于段的存儲(chǔ)訪問(wèn)域控制失效。在一級(jí)描述符中包含4位的域標(biāo)識(shí)符。該標(biāo)識(shí)符指定了本段所屬的域,在MMU讀取一級(jí)描述符時(shí),它檢查域訪問(wèn)控制寄存器c3中對(duì)應(yīng)于該域的控制位,如果相應(yīng)的兩位控制位為0b00,說(shuō)明該域不允許存儲(chǔ)訪問(wèn),這時(shí),就產(chǎn)生了基于段的存儲(chǔ)訪問(wèn)域控制失效。第二種是基于頁(yè)的存儲(chǔ)訪問(wèn)中域控制位失效。在一級(jí)描述符中包含4位的域標(biāo)識(shí)符。該標(biāo)識(shí)符指定了本頁(yè)所屬的域,在MMU讀取一級(jí)描述符時(shí),它檢查域訪問(wèn)控制寄存器c3中對(duì)應(yīng)于該域的控制位,如果相應(yīng)的兩位控制位為0b00,說(shuō)明該域不允許存儲(chǔ)訪問(wèn),這時(shí)就產(chǎn)生了基于頁(yè)的存儲(chǔ)訪問(wèn)域控制失效。
⑥訪問(wèn)權(quán)限失效
訪問(wèn)權(quán)限失效的檢查是在域控制位失效檢查時(shí)進(jìn)行的。這時(shí)如果域訪問(wèn)控制器中對(duì)應(yīng)于該域的控制位為0b01,則要進(jìn)行相應(yīng)的權(quán)限檢查。訪問(wèn)權(quán)限失效有兩種類(lèi)型。一種基于段的存儲(chǔ)訪問(wèn)權(quán)限控制失效,對(duì)于基于段的存儲(chǔ)訪問(wèn),在一級(jí)描述符中包含一個(gè)兩位的訪問(wèn)權(quán)限控制位AP。如果字段AP標(biāo)識(shí)了不允許進(jìn)行相關(guān)存儲(chǔ)訪問(wèn)時(shí),產(chǎn)出基于段的存儲(chǔ)訪問(wèn)權(quán)限控制失效。第二種是基于頁(yè)的存儲(chǔ)訪問(wèn)控制失效。對(duì)于基于頁(yè)的存儲(chǔ)訪問(wèn),在二級(jí)描述符中定義的可能為大頁(yè)、小頁(yè)或者微頁(yè)。當(dāng)二級(jí)描述符中定義的為微頁(yè)時(shí),該二級(jí)描述符中包含一個(gè)對(duì)應(yīng)于該微頁(yè)的訪問(wèn)控制字段AP,如果字段AP標(biāo)識(shí)了不允許進(jìn)行相關(guān)的存儲(chǔ)訪問(wèn),這時(shí)產(chǎn)生基于子頁(yè)的存儲(chǔ)訪問(wèn)權(quán)限控制失效。同樣,當(dāng)二級(jí)頁(yè)表描述符中定義的為小頁(yè)或大頁(yè)時(shí),操作過(guò)程同微頁(yè)。
(3)外部存儲(chǔ)訪問(wèn)失效
除處理器內(nèi)部MMU向CPU報(bào)告錯(cuò)誤外,ARM體系結(jié)構(gòu)還定義了一個(gè)外部訪問(wèn)中斷引腳。該引腳可以用于外部存儲(chǔ)器向CPU訪問(wèn)失效異常。但是,并不是所有失效異常都可以通過(guò)這種方式報(bào)告,所以該引腳在連線時(shí)要非常注意。下面列舉了存儲(chǔ)訪問(wèn)操作,可以通過(guò)這種機(jī)制中止和重啟動(dòng)。
·讀操作(reads)。
·非緩存的寫(xiě)操作(unbufferedwrites)。
·一級(jí)描述符預(yù)取(first-leveldescriptorfetch)。
·二級(jí)描述符預(yù)取(second-leveldescriptorfetch)。
·非緩存的信號(hào)量操作(semaphoresinuncachable/unbufferablememoryareas)。
在Cache預(yù)取時(shí),可以在任意字時(shí)終止存儲(chǔ)訪問(wèn)過(guò)程。如果存儲(chǔ)訪問(wèn)發(fā)生在存儲(chǔ)器想要獲取的數(shù)據(jù)中,這時(shí)該存儲(chǔ)訪問(wèn)將立即被中止。如果產(chǎn)生中止的數(shù)據(jù)是在Cache預(yù)取時(shí),從存儲(chǔ)器順序讀出的,那么直到這些數(shù)據(jù)被存儲(chǔ)器訪問(wèn)時(shí),該存儲(chǔ)訪問(wèn)才會(huì)被中止。
帶緩存的寫(xiě)操作不能通過(guò)這種方式向CPU報(bào)告異常。因此,在系統(tǒng)中標(biāo)記為可外部中止的存儲(chǔ)區(qū)域不要進(jìn)行可緩存的寫(xiě)操作。
15.5.9快速上下文切換擴(kuò)展(FCSE,F(xiàn)astContextSwitchExtension)
(1)快速上下文切換擴(kuò)展原理
快速上下文切換擴(kuò)展(FCSE,F(xiàn)astContextSwitchExtension)是MMU中的一個(gè)附加硬件,用于提高ARM嵌入式系統(tǒng)的系統(tǒng)性能。FCSE使得多個(gè)獨(dú)立任務(wù)可以運(yùn)行在一個(gè)固定的重疊存儲(chǔ)空間中,而在上下文切換時(shí),不需要清理(clean)或清除(flush)Cache和TLB。FCSE主要特征就是不需要清除Cache和TLB。
通常情況下,如果兩個(gè)進(jìn)程占有的虛擬地址空間有重疊,系統(tǒng)在兩個(gè)進(jìn)程之間進(jìn)行切換時(shí),必須進(jìn)行虛擬地址到物理地址的重映射。而虛擬地址到物理地址重映射涉及到重建MMU中頁(yè)表,而且Cache及TLB中的內(nèi)容都必須使無(wú)效。這樣操作將帶來(lái)巨大的系統(tǒng)開(kāi)銷(xiāo),一方面重建MMU和使無(wú)效Cache及TLB的內(nèi)容需要很大的開(kāi)銷(xiāo),另一方面重建Cache和TLB內(nèi)容也需要很大的開(kāi)銷(xiāo)。
快速上下文切換擴(kuò)展的引入避免了這種開(kāi)銷(xiāo)。它位于CPU和MMU之間,如果兩個(gè)進(jìn)程使用了同樣的虛擬地址空間,則對(duì)CPU而言,兩個(gè)進(jìn)程的空間地址是一樣的。快速上下文切換擴(kuò)展對(duì)各進(jìn)程的虛擬地址進(jìn)行變換,這樣系統(tǒng)中CPU之外的部分看到的是經(jīng)過(guò)快速上下文切換擴(kuò)展變換的虛擬地址。快速上下文切換擴(kuò)展將各進(jìn)程的虛擬空間變換成不同的虛擬空間。這樣在進(jìn)行進(jìn)程間切換時(shí)就不需要進(jìn)行虛擬地址到物理地址的重映射。
快速上下文切換擴(kuò)展將CPU發(fā)出的每個(gè)虛擬地址按照上述的規(guī)則進(jìn)行變換,然后發(fā)送到系統(tǒng)中的其他部分。變換過(guò)程如圖15.37所示。
圖15.37快速上下文切換擴(kuò)展變換過(guò)程
使用快速上下文切換擴(kuò)展,虛擬存儲(chǔ)管理增加了一次地址轉(zhuǎn)換。快速上下文切換擴(kuò)展在虛擬地址到達(dá)Cache和TLB前,使用一個(gè)特殊的、包含進(jìn)程ID值的重定位寄存器來(lái)修改虛地址。把第一次變換前的地址稱(chēng)為虛地址VA(VirtualAddress),把第一次變換后的地址稱(chēng)為修改后虛擬地址MVA(ModifiedvirtualAddress)。
這樣,任務(wù)間的切換就不用涉及到改變頁(yè)表,只需簡(jiǎn)單地將新任務(wù)的進(jìn)程ID寫(xiě)到位于CP15地FCSE進(jìn)程ID寄存器。正是因?yàn)槿蝿?wù)切換不需要改變頁(yè)表,因而切換后Cache和TLB中的值依然保持有效,不需要清除。
ARM系統(tǒng)中,4GB的虛擬空間被分為128個(gè)進(jìn)程空間快,每個(gè)進(jìn)程空間塊大小為32MB。每個(gè)進(jìn)程空間塊中可以包含一個(gè)進(jìn)程,該進(jìn)程可以使用虛擬地址空間0x00000000~0x01ffffff,這個(gè)地址范圍也就是CPU看到的進(jìn)程的虛擬空間。系統(tǒng)128個(gè)進(jìn)程空間塊的編號(hào)為0~127,編號(hào)為1的進(jìn)程空間塊中的進(jìn)程實(shí)際使用虛擬地址空間為1×0x02000000~1×0x02000000+0x01ffffff。這個(gè)地址空間是系統(tǒng)中除CPU之外的其他部分看到的該進(jìn)程所占有的虛擬地址空間。
由地址VA到MVA的變換算法如下所示。
MVA=VA+(ox02000000×進(jìn)程ID)
保存在CP15寄存器c13寄存器中的值包含進(jìn)程ID,c13中從bit[31]~bit[25]共7位標(biāo)識(shí)進(jìn)程ID,因此可以有128個(gè)進(jìn)程。寄存器格式如圖15.38。
圖15.38快速上下文切換寄存器c13
訪問(wèn)寄存器c13的指令格式如下所示:
MCRp15,0,Rd>,c13>,c0,0
MRCp15,0,Rd>,c13>,c0,0
其中,在讀操作時(shí),結(jié)果中位[31:25]返回PID,其他位的數(shù)值是不可預(yù)知的。寫(xiě)操作將設(shè)置PID的值。
當(dāng)PID=0時(shí),MVA=VA,相當(dāng)于禁止了FCSE。系統(tǒng)復(fù)位后PID為0。
當(dāng)正在運(yùn)行的進(jìn)程訪問(wèn)別的進(jìn)程時(shí),被訪問(wèn)的進(jìn)程標(biāo)識(shí)不能為0。這時(shí),CPU發(fā)生的地址VA的高7位不是全0。
完整的VA到MVA的變換算法如下所示。
If(VA[31:25]==0b0000000)then
MVA=VA|(PID<<25=
Else
MVA=VA
存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理
評(píng)論