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