ARMv7-A 架構下的MMU

       ARM架構中MMU的做用主要就是將CPU發出的虛擬地址轉換成爲物理地址,從實現內核和用戶程序和用戶程序之間的虛擬地址空間隔離。MMU的主要組成爲兩部分,其一是內部的TLBs緩存;還有就是轉換表裝換單元。CPU發出虛擬地址會被MMU攔截從而進行地址轉換,地址裝換過程優先查詢MMU內部的Cacha是否有現成的轉換條目。若是有則直接映射出物理地址,不然須要轉換單元按配置的方式和裝換表進行地址裝換以獲得物理地址,若是成功裝換虛擬地址到物理地址則MMU還會新建這-條目。轉換後的物理地址就能夠被總線拿來訪問物理內存了,不過在物理存儲以前還須要查詢對應的Cacha是否有當前地址的數據的緩存,由於真正的物理存儲的訪問速度相對於處理器的處理速度是十分緩慢的。若是在cacha中命中了對應的數據則省去了去訪問外部存儲的時間,反之則須要訪問外部存儲獲取數據,而後更新cacha-----利用程序地址空間侷限性提升cacha的命中率。緩存

    在啓用MMU以前必須先創建好MMU轉換須要的轉換表,並經過協處理器的特殊寄存器保存轉換表的基址。轉換表不一樣的系統的實現方式不一樣。MMU的映射是以頁爲單位的,不一樣的頁面size轉換是的方式略有差異可是本質的原理流程通用。須要注意的是大的頁size能提升TLB的命中率,可是會形成內存的浪費。小的頁面能更好的控制內存訪問屬性和節省內存,可是TLB的命中率就會比較低。架構

TLB的結構大體以下
TAG    [ASID]       DESCRIPTION
VA    [ASID]       PA + Attributes
VA    [ASID]       PA + Attributes
VA    [ASID]       PA + Attributes
.
.
.spa

使用後SID的緣由是避免應用程序在TLB中的轉換條目沒法區分的問題,由於用戶空間程序的虛擬地址空間都是相同的在TLB中使用ASID進行區分。TLBs中的緩存可能存在過時的狀況,若是系統軟件修改了裝換表,此時應該經過對應的協處理器指令使對應的TLB條目無效,或者粗獷一點直接使全部的裝換條目無效。進程

常見的轉換過程有不少種這裏說一下兩級4K頁的轉換過程:內存

     兩級頁面的映射須要兩級頁表,第一級頁表的頁面項保存看二級頁表的基址,二級頁表項加虛擬地址低12bits 描述看物理頁面和頁面屬性。拿一個32位的4K頁面的系統來講虛擬地址將分爲三個位域,其中最低12位做爲業內偏移,餘下的20位如何劃分取決於實現可按10和10的分法分配,即最高10bits用來表示一級表項在一級頁表的偏移,中間10bits則表示二級頁表的目錄項偏移。一級頁表的基址保存在協處理器的基址寄存器中一共有兩個TTBR0/1,若是按32位4G空間的映射的話,則一級頁表有1024個目錄項每個佔四個字節,二級表項每個也有1024個表項每個也一樣佔4個字節。這樣下來轉換表總共佔的內存空間是1024*4+1024*1024*4 < 4.1M的物理內存空間。因此如何安排32位虛擬地址到物理地址之間的映射講決定裝換表所佔的內存空間。仔細查上面的頁表大小和處理器的要,arm內核要求一級頁表必須是對其在16K字節邊界上,而二級頁表的大小是4K天然也是對其到4K的邊界上方便訪問,因此一級頁表項和二級頁表項的低12位必定是爲0的,鑑於此低12位就被用來,就被用來描述對應映射到的內存空間的屬性信息,這樣一級頁表項的屬性描述的就是4M的物理地址空間的內存屬性;進而二級頁表項描述的就是一個頁的屬性。屬性主要由權限位和訪問屬性、緩存屬性等信息。it

爲何內核硬件上會實現兩個裝換表基址寄存器TTBR0和TTBR1呢?原理

       使用兩個轉換表基址寄存器是爲了節省內存,避免16K的L1轉換表存在N個副本。由於每一個進程的裝換表中都包括了部份內核的地址空間映射,一般內核區域的映射都是固定不變的因此避免每一個進程都重複創建內核部分的地址映射纔出現了兩個裝換表基址寄存器。使用TTB控制寄存器配置虛擬地址最高N個bit都爲0時使用TTBR0不然使用TTRB1,這樣就能區別使用內核空間或用戶空間裝換轉表基址。假如配置N爲7則虛擬地址低32M空間使用TTBR0,如Linux就將其配置爲2因此,低0-1G的內核空間使用TTBR0,用戶空間使用1-4G的3G虛擬內存空間使用TTBR1。軟件

 

 

這裏隨便一條心得:Linux 自旋鎖能夠採用WFE和SEV配合以下降功耗。配置

相關文章
相關標籤/搜索