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