uboot step 11 內存一下子變大了 ----MMU的配置與使用

uboot step 11 內存一下子變大了 ----MMU的配置與使用

本文結構如下:

在前面初始化的過程中,由于MMU與Cache會影響我們進行初始化的工作,因此關閉了MMU與Cache,在那篇文章中已經說過了MMU的作用,這里再重新說下:

  • 1.完成虛擬地址到物理地址的轉換
  • 2.對內存的訪問權限進行控制

首先還是先來簡要說下相關與MMU相關的寄存器,先有個大概印象,后面用到了再去詳細的看:


mmu3.png
名稱 描述 簡寫
Translation Table Base Register 0 保存一級轉換表的物理地址 TTBR0
Translation Table Base Register 1 保存一級轉換表的物理地址 TTBR1
Translation Table Base Control Register 一級轉換表控制相關 TTBCR
Domain Access Control Register 域訪問權限控制
C1 Control Register MMU和cache使能

MMU使能

mmu enable.png
  • 1.編程所有相關的CP15寄存器正確的值
  • 2.編程建立所要求的一級頁表,二級頁表
  • 3.關閉I-cache
  • 4.使能MMU

MMU 內存訪問權限控制

  • Domains 域控制
    一個域被聯系到一些內存區域,在頁表描述符中有個Domain域來標識此區域內存屬于哪一個域Domian來控制,ARM1176 支持16個Domains,域訪問權限控制是由C3來設定的,如下圖:


    c3.png

    每個域由兩位來控制,32位寄存器,總共16個域

    • 00 無權限,任何訪問都會產生domain fault
    • 01 Client 檢查TLB頁表描述符的權限位是否允許訪問
    • 10 保留,產生domain fault
    • 11 Manager 不檢查訪問權限,不會產生權限錯誤
  • 訪問權限控制
    在域控制中,提到會檢查TLB頁表描述符的權限位,這個權限位就是APX,AP位,在頁表描述符中有這幾個域


    ap.png
  • 可執行區域XN位


    XN.png
    • 如果含有可執行區域,XN=0
    • XN=1時,在此內存區域任何試圖去執行指令的行為會產生權限錯誤

MMU 頁表描述

為了支持段和頁的映射方式,MMU使用兩級頁表描述符,一級頁表描述符決定訪問的是一個分段還是一個分頁式的表,如果訪問的是一個分頁式的頁表,處理器MMU決定頁表類型是大頁還是小頁并找到二級頁表。

一級頁表描述符地址

ARM1176 包含 兩個轉換表基地址寄存器TTBR0和TTBR1,一個轉換表基地址控制寄存器,當一個TLB未命中時,虛擬地址最高位決定使用的基地址寄存器是哪一個,采用兩個轉換表基地址期望去減少OS上下文切換的花費,每個獨立的任務或進程,有他自己的頁表而不用消耗大量內存。整個虛擬內存空間被分為兩個部分,用戶空間和內核空間

 0x0 -> 1<<(32-N) that TTBR0 controls
  1<<(32-N) -> 4GB that TTBR1 controls.

N的值在TTBCR寄存器中進行設定,N的大小決定了內核空間和用戶空間的分界線,當N=0時,表示只使用了TTBR0寄存器


N1.png

n2.png
一級頁表描述符格式分析
mmu1.png

如上圖所示:

  • bit[1:0]: 映射類型,分段式還是分頁式。
    • 00 忽略
    • 11 無效,返回Translation fault
    • 10 分段式
    • 01 分頁式
  • nG : 0 轉換表被標記為全局的; 1 轉換表屬于特定進程
  • S : 共享位,0 非共享; 1 共享內存
  • XN: 0 包含可執行代碼; 1 不包含可執行代碼
  • APX,AP位: 權限訪問控制位
  • Doman : 域標識,屬于哪個域
  • P: ECC校驗
  • TEX,C,B: 此區域是否采用緩沖buffer,cache,還是直接訪問,一般外設采用無緩沖,內存采用緩沖方式(個人理解)
  • NS:No-Secure 屬性
二級頁表描述符格式分析
mmu2.png

如上圖所示,和一級頁表描述符格式相似,相應的位的功能是一樣的。不同的是最后兩位代表了兩種不同的分頁類型。

  • bit[1:0] : 01 時,采用粗粒度大頁64K進行映射 1X時,采用小(細)頁4K進行映射

虛擬地址到物理地址的轉化

MMU對于剛接觸的人可能會感覺到有些不知所措,因為它有那么多相關的寄存器,還有什么TLB,一級頁表,二級頁表,粗細粒度,等等,完全一個大寫的懵,認為MMU的使用是個很難的過程,當你從了解地址轉化流程開始入手學習,慢慢了解了之后,便會覺得其實還是蠻簡單的,下面來看下S3c6410中MMU的地址轉化流程:

  • TLB:Translation Lookaside Buffer,可以稱為快表,當要進行虛擬地址到物理地址轉化的時候,MMU便會去查詢這個表來確定虛擬地址所對應的物理地址是多少,而這個表也被我們保存在了內存的某個地址,這個地址稱為轉換表基地址,我們需要將這個基地址寫到轉換表基地址寄存器中。

下面分四種情況對映射轉化過程作下說明:

  • 分段式映射,大小1M
  • 分段式映射,大小16M
  • 分頁式映射,大小64KB 粗頁
  • 分頁式映射,大小4KB 細頁
1M分段式映射
1M.png
  • 頁表基地址(TTBRx寄存器中)18bits[31:14]+虛擬地址12bits[31:20] +2[00] 構成了一級頁表描述符的地址
  • 取得了一級頁表描述符的地址,訪問這個地址從中可以得到真實的物理段基地址[31:20]
  • 將得到的物理段基地址[31:20]加上虛擬地址中的[19:0]位偏移地址構成了真正的物理地址
    每個虛擬地址可以索引 2^12 個一級描述符地址,每個一級描述符可以包含 2^20 個物理地址,總共可以索引4G空間
16M分段映射
16M.png

與1M的段映射相似,只是有些地址線的范圍發生了改變,另外一級描述符的第18位為1表示16M的段映射,0表示1M段映射

64KB分頁映射
64KB.png
  • 頁表基地址+虛擬地址的[31:20]位得到了一級描述符的地址
  • 一級描述符的[31:10]位為二級描述符的基地址
  • 二級描述符的基地址+虛擬地址的[19:16]位,最后幾位補0構成了二級頁表描述符的地址
  • 二級頁表描述符的第[31:16]位為物理基地址+虛擬地址的[15:0]頁內偏移地址構成了真正的物理地址
    注:上圖映射是從內核手冊中截取的,有些錯誤,二級頁表描述符的Second-level tabel index 應該為96位,50位應為0
4KB分頁映射
4kb.png
  • 頁表基地址+虛擬地址的[31:20]位得到了一級描述符的地址
  • 一級描述符的[31:10]位為二級描述符的基地址
  • 二級描述符的基地址+虛擬地址的[19:12]位,最后幾位補0構成了二級頁表描述符的地址
  • 二級頁表描述符的第[31:12]位為物理基地址+虛擬地址的[11:0]頁內偏移地址構成了真正的物理地址

代碼實現-控制led

#define GPKCON (volatile unsigned long*)0xA0008800
#define GPKDAT (volatile unsigned long*)0xA0008808


/* 
* 用于段描述符的一些宏定義
 */ 
#define MMU_FULL_ACCESS     (3 << 10)   // 訪問權限  AP
#define MMU_DOMAIN          (0 << 5)    // 屬于哪個域 Domain
#define MMU_SPECIAL         (1 << 4)    // 必須是1  XN 
#define MMU_CACHEABLE       (1 << 3)    // cacheable C
#define MMU_BUFFERABLE      (1 << 2)    // bufferable B
#define MMU_SECTION         (2)         // 表示這是段描述符 10
#define MMU_SECDESC         (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL | MMU_SECTION)
#define MMU_SECDESC_WB      (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL | MMU_CACHEABLE | MMU_BUFFERABLE | MMU_SECTION)


void create_page_table(void)
{
    unsigned long *ttb = (unsigned long *)0x50000000;
    unsigned long vaddr, paddr;

    vaddr = 0xA0000000;
    paddr = 0x7f000000;
    *(ttb + (vaddr >> 20)) = (paddr & 0xFFF00000) | MMU_SECDESC;  //將虛擬地址A000映射到led所對應的物理地址區間

    vaddr = 0x50000000;
    paddr = 0x50000000;
    while (vaddr < 0x54000000)//64M的區間地址虛擬地址與物理地址映射相同, 或者說相當于沒有進行地址轉化
    {
        *(ttb + (vaddr >> 20)) = (paddr & 0xFFF00000) | MMU_SECDESC_WB;
        vaddr += 0x100000;
        paddr += 0x100000;
    }

}


void mmu_init()
{
   __asm__(
    
    /*設置TTB Base addr*/
    "ldr    r0, =0x50000000\n"                  
    "mcr    p15, 0, r0, c2, c0, 0\n"    
    
    /*不進行權限檢查 Domain*/
    "mvn    r0, #0\n"                   
    "mcr    p15, 0, r0, c3, c0, 0\n"    
    
    
   /*使能MMU*/
    "mrc    p15, 0, r0, c1, c0, 0\n"    
    "orr    r0, r0, #0x0001\n"          
    "mcr    p15, 0, r0, c1, c0, 0\n"    
    : 
    : 
  );
}


int main()
{
    create_page_table();
    mmu_init();

    *(GPKCON) = 0x11110000;
    *(GPKDAT) = 0xa0;

    return 0;    
}

此去經年
zhaiyk@sina.cn
August 10, 2016

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容