mmu頁表機制

給個鏈接

https://www.cnblogs.com/arnoldlu/p/8087022.html


1. 段, 大頁, 小頁, 極小頁的劃分

     4種映射長度:段(1MB)、大頁(64KB)、小頁(4KB)、極小頁(1KB)。

 

ok, 以這個爲前提, 我們設計mmu 兩級頁表的方式。


假設, 需要尋址 0x12345678這個虛擬地址。

已知它對應的頁是0x56789000頁,  即真實的物理地址爲0x56789678。

我們考慮二級頁表該如何設計。

以二級頁表方式尋址。

將0~4G空間 4K 一頁爲單位, 分成1024*1024個頁。

256個頁組成1M 稱之爲段。(Section)

4K 的大小爲0x0 1000

1M 的大小爲0x10 0000

 

4K 一頁, 分頁後

0x0000 0000

0x0000 1000

0x0000 2000

0x0000 3000

....

 

1M 一段, 分段後

0x0000 0000

0x0010 0000

0x0020 0000

0x0030 0000

0x0040 0000

....

 

共計4096個段, 

故虛擬地址前12字節, 0x123 可以作爲段的尋址序號。

即以及頁表的第0x123個就是我要找的段地址頁表。

 

這個頁表在哪裏,  首先需要找到段頁表地址的基地址, 這個存在cp15協處理器的某個寄存器中(忘記是C1還是C2啥的了)

ok, 讀取段頁表基地址, 假設是0xC100 0000, 其中每個頁表項是32位整數, 即4byte

所以, 尋找到第0x123個頁表項, 地址爲 0xC100  0| 0100 | 1000 | 1100, 即爲 0xC100 048C

ok, 找到一級段地址頁表項了。 我們就能找到實際的映射的段物理地址了。 是的0xC100 048C中存放的32位數中,

我們想想這個32位段頁表項該存放寫什麼??

沒錯, 要存放二級頁表的基地址。 假設是0xC300 0000....

ok, 二級頁表項的具體位置該如何明確呢??


先說結論, 虛擬地址的第12位到第19位這8位數據就是頁表項的序號。

1). 二級頁表應該有256個。

2). 前12位0x123爲段地址的序號。

3). 中間8位0x45是頁表項的序號。

     中間8位數字, 剛好可以表示0x00 ~ 0xFF共256個頁表項目的序號


ok, 我們找到0xC300 0000的第0x45號頁表項。

裏面存放這最終的物理頁地址。即0x56789000頁, 該頁表的基地址爲就是0x56789

總共5字節,  即20位數據。


ok, 最後12位數據爲真實的頁偏移地址/序列號。

故拼接最終的物理地址, 0x56789678。


尋址成功。

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