控制器中如何設計MMU--虛擬內存管理機制

高級處理器CPU通常都會實現內存管理單元(MMU),其也是Linux等高級操做系統運行的必備條件。虛擬內存管理是linux操做系統的基本組件之一,其目的是讓每一個應用程序都單獨擁有足夠大的(G字節級別)邏輯空間,並共享同一塊較小的物理內存空間。虛擬內存管理正是依賴內存管理單元(MMU)來實現的。各進程在內存中的頁表和MMU中的TLB(至關於頁表的cache)是虛擬內存管理中的重要概念。linux

        在不少場景下的產品並不須要高級處理器那麼強的計算能力,而基於控制器的SOC更具競爭力,更低功耗,更省成本!可是基於MMU的虛擬內存管理思想對於輕量化的多任務操做系統來講相當重要。假如,咱們但願在基於控制器的SOC中實現MMU單元,而後經過定製操做系統的虛擬管理模塊來實現內存管理,該怎麼作呢?算法

 

1、內存管理單元(MMU)的工做機制數組

    在闡述控制器領域的內存管理設計以前,仍是要先介紹處理器領域的虛擬內存管理機制,前者很大程度上是對後者核心機制精髓的借鑑。實現虛擬內存管理有幾個模塊是協調工做的:CPU、MMU、操做系統、物理內存,如圖示(假設該芯片系列沒有cache):架構

咱們根據上圖來分析一下CPU訪問內存的過程,假設尋址是0x10000008,一頁大小爲4K(12比特)。則虛擬地址會分紅兩個部分:頁映射部分(20bit,0x10000)+頁內偏移(12bit, 0x8)。CPU經過總線把地址信號(0x10000008)送給MMU,MMU會把該地址的頁映射部分(20bit)拿到TLB中匹配。ide

TLB是什麼東西?Translation Lookaside Buffer,網上有稱爲「翻譯後備緩衝器」。這個翻譯都不知道它幹什麼。它的做用就是頁表的緩衝,我喜歡叫它爲頁表cache。其結構圖以下:性能

能夠想象,TLB就是索引地址數組,數組的每一個元素就是一個索引結構,包含虛擬頁地址和物理頁地址。其在芯片內部表現爲寄存器形式,通常寄存器都是32位,實際上TLB中的頁地址也是32位寄存器,只不過索引比較時是比較前20bit,後12bit其實也是有用的,例如能夠設置某個bit是表示常駐的,即該索引是永遠有效的,不能更換,這種場景通常是爲適合一些性能要求特別高的編解碼算法而設計的。很是駐內存的通常在某個時刻(如TLB填滿時訪問一個新的頁地址)就會發生置換。學習

 

1)  假如 0x10000008的前20bit在TLB中第M個索引中命中,這時就表示該虛擬頁在物理內存中已經給它分配好對應的物理內存,頁表中也已經作好記錄。至於虛擬地址對應的代碼頁是否從外存儲(flash,card,硬盤)的程序中加載到內存中還須要要另外的標記,怎麼標記呢?就是利用上面所講的TLB低12位的某一bit(咱們稱爲K)來標識,1標識代碼數據已經加載到內存,0表示還沒加載到內存。假如是1,那就會用M中的物理地址做爲高20bit,以頁內偏移0x8做爲低12bit,造成一個物理地址,送到內存去訪問。此時該次訪問就會完成。操作系統

2)  假如 K是0,那意味着代碼數據還沒有加載到內存,這時MMU會向中斷管理模塊輸出信號,觸發一箇中斷進行內核態,由操做系統負責將對應的代碼頁加載到內存。並修改對應頁表項的K比特和TLB對應項的K比特爲1.架構設計

3)  假如 0x10000008的前20bit在TLB全部索引中都沒有命中,則MMU也會向中斷管理模塊輸出一個信號觸發中斷進入內核態,由操做系統將0x10000008右移12位(即除以4K)到頁表中去取得對應的物理頁值,假如物理頁值非0有效,說明代碼已經加載到內存了,這時將頁表項的值填入到某一個空閒的TLB項中;假如物理頁值爲0,說明還沒有給這個虛擬頁分配實際的物理內存空間,這時會給它分配實際的物理內存,並寫好頁表的對應項(這時K是0),最後將這索引項寫入TLB的其中一條。翻譯

2)和3)其實都是在中斷內核態中完成的,爲何不一塊作了呢?主要是由於一次中斷不該該作太多事情,以加大中斷延時,影響系統性能。固然若是有芯片將二者作成一箇中斷也是能夠理解的。咱們再來看看頁表的結構。頁表固然也能夠按TLB那樣作成索引數組,可是這樣有兩個很差的地方:

1)頁表是要映射全部的虛擬頁面的,其維護在內存中也須要不小的空間。頁大小是4K時,那映射所有就是4G/4K=1M條索引,每條索引4*2=8個字節,就是8M內存。

2)假如按TLB那種結構,那匹配索引的過程就是一個for循環匹配電路,效率很低,要知道咱們作這個都是在中斷態完成的。

因此通常的頁表都是設計成一維數組,即以整個線性虛擬地址空間按頁爲單位依次做爲數組的下標,即頁表的第一個字(4字節)就映射虛擬地址空間的最低4K,第二個字映射虛擬地址最低的第二個4K,以此類推,頁表的第N個字就映射虛擬地址空間的第N個4K空間,即(N-1)*4K~4KN的地址空間。這樣頁表的大小就是1M*4=4M字節,並且匹配索引的時候只是一個偏移計算,很是快。

2、控制器領域SOC內存管理單元設計

在這裏,貼出前公司同事(彭洪、江小煒)的專利,主要闡述了控制器SOC中內存管理單元的設計過程,我在基於MIPS核的SOC中整合並驗證了該專利的可行性,並經過定製操做系統和重構應用程序來高效實現了虛擬管理。良好的軟、硬件協同設計也是該系列芯片成功量產上億顆的前提條件。

如下只是MMU的系統設計,有關適配該機制的虛擬內存管理和應用程序重構之後再作分解。你們也能夠經過查看「SOC軟件架構設計」系列學習更多的軟硬件協同設計知識。專利有點長,關鍵的地方就在於尋址命中時要作什麼,不命中時要作什麼。

相關文章
相關標籤/搜索