ARM基礎學習-存儲管理單元MMU

在ARM系統中,存儲單元MMU的主要完成以下工作:
(1) 虛擬存儲空間到物理存儲空間的映射;ARM 採用頁式虛擬存儲管理,把虛擬空間分成固定大小的塊,每一塊稱爲一頁;物理內存地址空間也分成同樣大小的頁;頁的大小分爲粗粒度和細粒度;MMU需要實現虛擬地址到物理地址的轉換;
(2) 存儲器訪問權限的控制;
(3) 設置虛擬存儲空間的緩衝的特性;

頁表是實現MMU的重要手段,頁表存儲與內存中,表的每一行對應於虛擬空間的一個頁,該行包含了虛擬內存頁對應的物理內存頁的地址;通過CP15協處理器的寄存器C2來保存頁表的基地址;

TLB

(1)概念

在程序運行的一段時間內,對頁表的訪問只是侷限在少數的幾個單元中,可以採用一個容量更小,訪問速度和通用寄存器相當的存儲器來存放當前訪問需要的地址變換條目;這個小容量的頁表稱爲快表,也可以稱爲TLB(Translation Lookaside Buffer);

當CPU訪問內存時,現在TLB中查找需要的地址變換條目。如果該條目不存在,CPU從位於內存的頁表中查詢,並把相應的結果添加到TLB中。這樣,當CPU下一次又需要該地址變換條目時,可以從TLB中直接得到,從而使地址變換的速度大大加快。

當內存中的頁表內容改變,或者通過修改CP15中的寄存器C2使用新的頁表時,TLB的內容需要全部清除。MMU提供了相關的硬件支持這種操作。CP15中的寄存器C8用來 控制清除TLB內容的相關操作。

MMU可以將某些地址變換條目鎖定在TLB中,從而使得進行與該地址變換條目相關的地址變換速度保持很快。在MMU中C10用於控制TLB內容的鎖定。

注:TLB中存放的是地址變換條目,相當於一個小頁表。

(2)TLB更新變化條目

a、使能MMU時的存儲訪問過程。

當ARM處理器請求存儲訪問時,首先在TLB中查找虛擬地址。如果系統中數據TLB和指令TLB是分開的,在取指令時,從指令TLB查找相應的虛擬地址,對於其他內存訪問操作,從數據TLB中查找相應的虛擬地址。

如果虛擬地址對應的地址變換條目不在TLB中,CPU從位於內存的頁表中查詢,並把相應的結果添加到TLB中。如果TLB已經滿了,還需要根據一定的淘汰算法進行替換。這樣,當CPU下一次又需要該地址變換條目時,可以從TLB中直接得到,從而使地址變換的速度大大加快。

當得到了需要的地址變化條目以後,將進行以下操作
(1)得到該虛擬地址對應的物理地址;
(2)根據條目中的C(cache)控制位和B(Bufferable)控制位決定是否緩存該內存訪問的結果 ;
(3)根據存取權限控制位和域訪問控制位確定該內存訪問是否被允許。如果該內存訪問不被允許,CP15向ARM處理器報告存儲訪問中止。
(4)對於不允許緩存的存儲訪問,使用步驟(1)中得到的物理地址訪問內存。對於允許緩存的存儲訪問,如果在cache命中,則忽略物理地址;如果cache沒有命中,使用步驟(1)中得到的物理地址訪問內存,並把該塊數據讀取到cache中。

這裏寫圖片描述

b、禁止MMU時存儲訪問過程

  1. 禁止MMU時,是否支持cache和write buffer由各個具體芯片的設計確定。如果芯片規定禁止MMU時禁止cache和write buffer,則存儲訪問將不考慮C、B控制位。如果芯片規定當禁止MMU時可以使能cache和write buffer,則數據訪問時,C=0,B=0;指令讀取時,如果使用分開的TLB則C=1,如果使用統一的TLB則C=0;
  2. 存儲訪問不進行權限控制,MMU也不會產生存儲訪問中止信號;
  3. 所有的物理地址和虛擬地址相等,即使用平板模式;

c、禁止/使能MMU時應注意的問題

  1. 在使能MMU之前,要在內存中建立頁號表,同時CP15中的各相關寄存器必須完成初始化。
  2. 如果使用的不是平板存儲模式(物理地址和虛擬地址相等),在禁止/使能MMU時,虛擬地址和物理地址的對應關係會發生改變,這時應該清除cache中的當前地址變換條目;
  3. 如果完成禁止/使能MMU的代碼的物理地址和虛擬地址不相同,則禁止/使能MMU時會造成很大麻煩,因此強烈建議完成禁止/使能 MMU的代碼的物理地址和虛擬地址最好相同 ;

虛擬地址映射物理地址原理

多數使用虛擬存儲器的系統都使用一種稱爲分頁(paging)的機制。虛擬地址空間劃分成稱爲頁(page)的單位。而相應的物理地址空間也被進行劃分,單位是頁框(frame),頁和頁框的大小必須相同。

虛擬地址被MMU分爲兩部分:第一部分是頁號索引(page Index),第二部分則是相對該頁首地址的偏移量(offset);

當CPU訪問一個地址時,該地址是虛擬地址,於是該地址被送到MMU,MMU再根據虛擬地址的高几位作爲頁號索引,在頁表中尋找對應的地址變換條目。從地址變換條目中找到物理地址的頁基地址,再加上虛擬地址中的偏移量,便得到了真正的物理地址,然後由MMU將物理地址發送到地址總線上,訪問物理內存。

例:如圖所示,如果分頁大小爲1M,虛擬地址爲0x30000012,
虛擬地址的二進制碼爲 00110000 00000000 00000000 00010010 前12位爲頁號索引,後20位爲偏移量,因爲2^20 = 1M
前12位頁號索引爲00110000 0000 = 768,所以在頁表中找到相對於頁表基地址的偏移量爲768的地址,然後得到地址變換條目。於是0x0300 << 20位,便得到了物理頁基地址,再加上虛擬地址中的偏移位 0000 00000000 00010010 = 0x12,便得到了真正的物理地址 0x30000012 。

一級地址變換

MMU中的地址變換過程

在ARM中,虛擬地址到物理地址的映射有兩種方式,一級映射和二級映射。

(1)一級映射

當使用一級映射時,只會用到一張頁表,我們將它稱爲一級頁表,用L1表示。一級映射時,虛擬空間被劃分成段的單位,每段的大小爲1M。而相應的物理空間也被進行這樣的劃分,單位是段框,段和段框的大小必須相同。

首先在內存中建立一張頁表(這個頁表由我們自己建立),頁表中的每一項存放的是一個物理段基地址,該頁的訪問權限和緩衝特性等。頁表中每一項的大小爲4字節,所以每一項的地址是字對齊。我們將頁表中的每一格稱爲一個項。

因爲ARM的可尋址範圍爲4G,且虛擬空間的每段大小爲1M,所以如圖所示,頁表有4096個項。每一項對應一個段,每一項中存放的是一個物理段基地址,該頁的訪問權限和緩衝特性等。
虛擬地址被MMU分爲兩部分,第一部分爲頁索引號(bits[31:20]),第二部分是相對物理地址的偏移量(bits[0:19])。
所以當訪問一個地址時,此地址是虛擬地址。MMU會用協處理器CP15的C2寄存器中的頁表基地址+頁索引號便查到了頁表中對應的一項,從頁表中相應的項中找到物理段基地址,然後:物理段基地址 + 偏移量(這個是虛擬地址的第二部分) = 物理地址。

例:
CPU要訪問0x300008的地址,此地址爲虛擬地址。MMU會根據頁索引號(也就是 0x3 )找到相對頁表基地址偏移量爲0x3的項。這個項中的物理段基地址爲0x006。
物理地址 = (0x006<<20)+0x8=0x600008

這裏寫圖片描述

 b、二級映射
 
當使用二級映射時,一級頁表L1仍然存在,但是一級頁表中不再存放物理段基地址了,而是存放了二級頁表的基地址,也就是二級頁表的首地址。

一級頁表要表示4G的地址範圍,一共4096項,每一項都表示1M 的大小。二級頁表相當於對一級頁表這1M的範圍作更詳細的劃分,所以每個二級頁表要表示1M 的地址範圍。

對這1M地址範圍進行分頁,有三種分法:
1. 大頁:將這1M地址範圍分成單位爲64KB大小
2. 小頁:將這1M地址範圍分成單位爲4KB大小
3. 極小頁:將這1M地址範圍分成單位爲1KB大小

注:二級頁表分爲兩類:粗粒度的二級頁表和細粒度的二級頁表。

這裏寫圖片描述

一級和二級頁表的理解

假設系統有4GB存儲空間,規定頁面大小爲4KB(linux),那麼就有1M個頁面,由於頁表中一個表項對應一個頁面,那麼採用一級頁表需要4G/4K = 1M個頁表項,如果每個頁表項是4B,那麼需要4MB的內存空間。

在看看二級頁表:採用二級頁表系統時,假設一級頁表有1K個表項,那麼每個二級頁表應該有1K個表項,這裏每個一級頁表的表項存放的是對應二級頁表的首地址(一個一級表項對應一個二級頁表),二級頁表的每個表項存放的是一個物理塊號,那麼就有1K個二級頁表,二級頁表項一共就有1K*1K=1M(單位:表項),再加上一級頁表佔用的1K,這個二級頁表系統所有頁表佔用的內存(1M+1K)x 4B = 4MB + 4KB;

但是大多數程序根本用不到4G的虛擬內存空間,比如一個簡單的hello world程序,這樣一個幾kb的程序卻需要4MB的內存空間是很浪費的。如果採用二級頁表,那麼一級頁表只需要(1K x 4b)4KB的空間用來索引二級頁表的地址,像hello world這樣的程序可能只需要一個物理頁,那麼只需要一條記錄就可以了,故對於二級頁表也只要(1K x 4b)4KB就足夠了,而一級頁表中的其他表項可能爲空,所以這樣只需要8KB就能解決問題。

所以二級頁表是按程序需要來加載多少項的;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章