一.虛存的工作原理 為了使任務(wù)有各自的虛擬存儲映射,MMU硬件采用地址重定位(address relocation),即在地址訪問主存之前,轉(zhuǎn)換由處理器核輸出的存儲器地址。可認(rèn)為在介于內(nèi)核和主存間的MMU中有一個重定位寄存器,這樣就能很容易理解這個轉(zhuǎn)換過程。 當(dāng)處理器核產(chǎn)生一個虛擬地址時,MMU取出這個虛擬地址的高位,并用重定位寄存器中的值來替換它,從而形成一個物理地址。虛擬地址的低位是一個偏移量,它轉(zhuǎn)換成物理存儲器的一個特定地址。一個重定位寄存器只能轉(zhuǎn)換一塊存儲空間,這塊存儲空間的大小由虛擬地址的偏移量部分所占的位數(shù)所決定。這樣的一塊虛擬存儲空間稱為一頁(page),而轉(zhuǎn)換過程中所對應(yīng)的那塊物理存儲空間稱為一個頁幀(page frame)。 ARM MMU臨時存放轉(zhuǎn)換數(shù)據(jù)的一組重定位寄存器實際上是一個由64個重定位寄存器組成的全相聯(lián)cache。這個cache稱為轉(zhuǎn)換旁路緩沖器(TLB),TLB緩存最近被訪問的頁的轉(zhuǎn)換數(shù)據(jù)。除了使用重定位寄存器外,MMU還使用主存中的表來存放描述系統(tǒng)中用到的虛擬存儲器映射的數(shù)據(jù),這些轉(zhuǎn)換數(shù)據(jù)的表稱為頁表(page tables)。頁表中的每個頁表項PTE(Page Table Entry)包含關(guān)于虛擬頁的以下信息:用于將虛擬頁轉(zhuǎn)換為物理頁的物理基地址,分配給該頁的訪問權(quán)限,頁的cache和寫緩沖器配置。 通過上下文切換時激活不同的頁表,使得執(zhí)行有重疊虛擬地址的多個任務(wù)成為可能。MMU可以重定位一個任務(wù)的執(zhí)行地址,而無需在物理存儲器中移動這個任務(wù)。任務(wù)的物理存儲空間只是簡單地通過激活和不激活頁表來映射到虛擬存儲空間。當(dāng)剛剛提到的地址轉(zhuǎn)換發(fā)生時,cache可能包括無效的,從舊的頁表映射來的虛擬數(shù)據(jù)。為了保證存儲器數(shù)據(jù)的一致性,cache可能需清理和清除。TLB可能也需清除,因為它也可能緩存了舊的轉(zhuǎn)換數(shù)據(jù)。 任務(wù)切換需要以下步驟: 1)保存活躍任務(wù)的上下文,并將該任務(wù)置于睡眠態(tài); 2)清除cache,如果使用回寫策略,則需要清理D-cache; 3)清除TLB,從而移除原任務(wù)的轉(zhuǎn)換數(shù)據(jù); 4)配置MMU,以使用新的頁表,把虛擬運(yùn)行空間轉(zhuǎn)換為被喚醒任務(wù)在物理存儲器中的位置; 5)恢復(fù)被喚醒任務(wù)的上下文 6)繼續(xù)執(zhí)行恢復(fù)的任務(wù) 二.頁表 ARM MMU硬件采用2級頁表結(jié)構(gòu):一級頁表(L1)和二級頁表(L2)。一級頁表只有一個L1主頁表(L1 master page table)。L1主頁表包含兩種類型的頁表項:保存指向二級頁表起始地址指針的頁表項和保存用于轉(zhuǎn)換1MB段的頁表項。L1主頁表也稱為段頁表(section page table)。L1主頁表將4GB的地址空間劃分為多個1MB的段(section),因此L1頁表包含4096個頁表項,L1主頁表是一個混合表,可作為L2頁表的頁目錄,也可作為用于轉(zhuǎn)換1MB虛擬空間的L2粗(coarse)頁表或L2細(xì)(fine)頁表的指針;當(dāng)L1頁表用于轉(zhuǎn)換一個1MB的段時,其頁表項(PTE)包含的是物理存儲器中1MB頁幀(page frame)的首地址。目錄頁表項和1MB的段頁表項可以共存于L1主頁表。 一級頁表項: 一級頁表支持4種類型的頁表項: 1)1MB段轉(zhuǎn)換項 2)指向L2細(xì)頁表的目錄項 3)指向L2粗頁表的目錄項 4)產(chǎn)生中止異常的錯誤項 二級頁表項: L2頁表有4種可能的頁表項: 1)定義64KB頁幀屬性的大(large)頁表項; 2)定義4KB頁幀的小(small)頁表項; 3)定義1KB頁幀的微(tiny)頁表項; 4)訪問時產(chǎn)生頁錯誤中止異常的錯誤頁表項; L1轉(zhuǎn)換表基址 CP15:c2寄存器保存轉(zhuǎn)換表基地址TTB(Translation Table Base address)-指向L1主頁表在虛存中的位置。CP15:c2寄存器的格式如圖: 三.轉(zhuǎn)換旁路緩沖器(TLB) 單步頁表搜索: 如果MMU搜索的是1MB大小的段頁,則硬件能用單步搜索找到所要的頁表項,因為1MB的頁表項是存放在L1主頁表里的。 2步頁表搜索: 如果MMU搜索的是大小為1KB,4KB,16KB或64KB的頁,則頁表搜索須執(zhí)行2步才能找到地址轉(zhuǎn)換數(shù)據(jù)。 四.域和訪問權(quán)限 有兩種不同的控制用來管理一個任務(wù)的存儲器訪問權(quán)限,:域(domain)用于主控制(primay control),頁表中的訪問權(quán)限用于次控制(secondary control)。有16種不同的域可以分配給虛存的1MB段,并通過設(shè)置L1主頁表項(PTE)中的域的有關(guān)位(位域)來分配給一個段。 當(dāng)一個域分配給了一個段時,它必須遵守分配給這個域的訪問權(quán)限。域的訪問權(quán)限在CP15:c3寄存器中分配,它控制處理器核訪問虛存段的能力。16個可用的域,每個域使用CP15:c3寄存器的2位來定義訪問權(quán)限,域訪問位取值及對應(yīng)的意義如下表所列: 基于頁表的訪問權(quán)限。頁表項中的AP位決定該頁的訪問權(quán)限。“AP”,“ap3”,“ap2”,“ap1”,“ap0”結(jié)合CP15寄存器C1的R/S位,決定如何進(jìn)行訪問權(quán)限檢查。段描述符中的“AP” 控制整個段(1MB)的訪問權(quán)限;大頁描述符中的每個“apx”(x為0~3)控制一個大頁(64KB)中1/4內(nèi)存的訪問權(quán)限,即“ap3”對應(yīng)大頁高端的16KB,“ap0”對應(yīng)大頁低端的16KB;小頁描述符與大頁描述符相似,每個“apx”控制一個小頁(4KB)的1/4內(nèi)存的訪問權(quán)限。極小頁中的“ap”就控制整個極小頁1KB的訪問權(quán)限。 五.Cache和寫緩沖 六.CP15:c1控制寄存器 七.快速上下文切換擴(kuò)展 快速上下文切換擴(kuò)展FCSE(Fast Context Switch Extension),是MMU中的一個附加硬件,用于提高ARM嵌入式系統(tǒng)的系統(tǒng)性能。FCSE使得多個獨(dú)立的任務(wù)可以運(yùn)行在一個固定的重疊存儲空間中,而上下文切換時又不需要清理或清除cache,或TLB。如果沒有FCSE,則從一個任務(wù)切換到另一個任務(wù)需要改變虛擬存儲映射。如果涉及兩個有重疊地址的任務(wù),則保存在cache和TLB中的信息將變?yōu)闊o效,這樣系統(tǒng)就必須清除cache和TLB中的無效數(shù)據(jù)。清除這些模塊的過程使任務(wù)切換增加了很多時間,因為內(nèi)核不僅要清除cache和TLB中的無效數(shù)據(jù),還要從主存中裝載新的數(shù)據(jù)到cache和TLB。使用FCSE,虛擬存儲管理增加了一次地址轉(zhuǎn)換。FCSE在虛擬地址到達(dá)cache和TLB前,使用一個特殊的,包含進(jìn)程ID值的重定位寄存器來修改虛擬地址。把修改之前的虛存地址稱為VA(Virtual Address),把第一次轉(zhuǎn)換之后的地址稱為修改后虛地址MVA(Modified Virtual Address)。這樣,任務(wù)間的切換就不用涉及到改變頁表,只需簡單的將新任務(wù)的進(jìn)程ID寫到位于CP15的FCSE進(jìn)程ID寄存器。為了利用FCSE,編譯鏈接所有的任務(wù),使他們都運(yùn)行在虛存的第一個32MB塊空間,為每個任務(wù)分配一個進(jìn)程ID;然后通過下邊的公式,將每個任務(wù)放置在修改后虛存的不同32MB分區(qū)中: MVA = VA +(0x2000000 * 進(jìn)程ID) 下圖是一個快速上下文切換擴(kuò)展的例子:在一個3任務(wù)的多任務(wù)環(huán)境中,切換前任務(wù)1運(yùn)行,切換后任務(wù)2運(yùn)行。 作者:李萬鵬 |