1. 程式人生 > >MMU虛擬記憶體到實體記憶體

MMU虛擬記憶體到實體記憶體

    MMU的主要作用:虛擬地址到實體地址的轉換;訪問許可權控制;設定虛擬儲存空間的緩衝。
    虛擬儲存器:程式一般存於掉電不丟失的硬碟中,但是硬碟讀寫速度慢。所以系統上電後一般只在ROM中完成小部分硬體初始化程式,並把程式搬運到記憶體中。然後,從記憶體中開始執行程式。但是,記憶體有限,不能一次性把所有程式碼載入到記憶體中,所以只把當前用到的一部分程式碼載入過來,把沒用到的搬回磁碟。此時的效果等同於把所有程式載入到記憶體中,使用者看來系統具有的記憶體比實際記憶體大的多。對於32位的CPU系統中虛擬地址空間有4GB大小,而嵌入式系統中的實際實體地址空間可能遠小於此。

這裡寫圖片描述

    把虛擬地址空間分成一個個固定大小的塊,每一塊為一頁。實體地址空間也分為同樣大小的頁。MMU要實現虛擬地址到實體地址的對映,CPU核發出虛擬地址VA;VA被轉換為變換後的虛擬地址MVA給MMU;MMU把MVA轉換成實體地址PA。
    頁表:位於記憶體中,頁表的基地址存於CP15的C2暫存器中,表中每一行(叫一個地址變換條目entry)對應於虛擬儲存空間的一個頁,這個entry包含虛擬記憶體塊和物理塊地址的對應關係、該頁的許可權、該頁的緩衝特性。
    TLB(快表):CPU和記憶體速度級別相差較大,每次到記憶體中查表代價較大。根據程式區域性性原理,把當前訪問需要的條目存放在一個和CPU中暫存器速度差不多16字左右的TLB中。MMU把儲存空間分為16個域,PC15中C3每兩位控制一個域的訪問許可權。
    ARM支援的儲存塊:段1MB;大頁64KB(可分為16KB子頁);小頁4KB(可分為1KB子頁);極小頁1KB(只能儲存在細頁表中)。
    大致過程:
    1)根據VA和C2找到一級頁表條目
    2)若是段描述符,返回實體地址
    3)若該條目是二級頁表描述符,繼續根據虛擬地址找下一個條目
    4)找到第二個頁描述符,返回實體地址

    一級頁表描述符

一級頁表描述符

        [1:0]=01粗頁表:256行,佔記憶體1KB,每個條目表示4KB空間;[31:10]是二級頁表地址。如:粗頁表+大頁,因為指向物理空間只能為1MB,所以256/16*64K或64/4;連續16個條目儲存同一大頁描述符。
    C2[31:14]+MVA[31:20]+0b00->粗頁描述符; 
    粗頁描述符[31:10]+MVA[19:12]+0b00->大頁描述符;
    大頁描述符[31:16]+MVA[15:0]->PA
        [1:0]=10段,[31:20]一塊1MB實體地址空間的起始地址。MVA[19:0]在這塊中定址。
    P15的C2[31:14]+MVA[31:20]+0b00——>段描述符。
    段描述符[31:20]+MVA[19:0]-->PA。
        [1:0]=11細頁表,1024行,每個條目表示1KB空間;[31:12]是二級頁表地址;細頁表+大頁,1024/64*64K或64/1,每個條目表示1KB,連續64個條目儲存同一大頁描述符
        二級頁表描述符

二級頁表描述符

(function () {('pre.prettyprint code').each(function () { var lines = (this).text().split(\n).length;varnumbering = $('').addClass('pre-numbering').hide(); (this).addClass(hasnumbering).parent().append(numbering); for (i = 1; i