Linux與ulinux的主要區(qū)別其中一點就是有沒有mmu,。所以我想在這里記錄一下我對它的理解。文章分2個部分來記錄,,第一部分就是講述當虛擬地址傳遞給cpu后,,cpu是如何解析它,把它裝換成物理地址,,再把這個地址送到內(nèi)存總線上,;第二部分就是要討論MMU是如何控制存儲空間的訪問權(quán)限的。 這里我先述說第一部分: 我先在這里述說一下一些基本概念,,頁表,,頁表項。表是用來干什么的,?其實就是反應(yīng)虛擬地址和物理地址的映射關(guān)系,。具體來說就是當一個虛擬地址穿給cpu后,cpu就會根據(jù)這個地址找到對應(yīng)頁表,,再找到頁表項,。然后只要訪問頁表項的內(nèi)容,你就知道這個虛擬地址是對應(yīng)哪個物理地址了。ARM可以通過一級表就可以完成目的,,但是也可以通過二級表來完成任務(wù),。linux是選擇后者來實現(xiàn)的,所以我只是討論后者的情況,。頁表項就是頁表里面的每一項咯,。 關(guān)于"頁表項"可參見:文章"邏輯地址、線性地址,、物理地址和虛擬地址" 的"CPU的頁式內(nèi)存管理部分"講的比較通俗易懂. 虛擬存儲空間到物理存儲空間的映射是以塊為單位的,,ARM支持的存儲塊的大小有以下幾種: 1.段,大小為1MB 2.大頁,,大小為64KB 3.小頁,,大小為4KB 4.極小頁,大小為1KB 對于一級頁表來說,,它的基址是存放在cp15的c2寄存器里面的,。一級頁表的頁表項的結(jié)構(gòu)是這樣的: 31位~10位細粒度二級頁表基址;(其實這只是其中的一種變換方法,,一共有6種變換方法,,我這里只說linux里面常用的粗粒度小頁地址變換方法。這里說的小頁就是我們上面剛說的存儲塊的大小中的一種,。) 1位~0位:這兩位數(shù)可以有4種組合,,對于這種方法,我們用的是01,。 對于中間的幾位與訪問權(quán)限和cache有關(guān),。這里以免弄混,用到時我們再來討論,。 好了現(xiàn)在了解了一級頁表項里面的結(jié)構(gòu)了,。 我們現(xiàn)在來說說二級頁表,和它的頁表項結(jié)構(gòu),。但是在說這個之前,,我先要說說一個規(guī)則。當以二級分頁管理某段存儲空間時,,要同時設(shè)置一級頁表項和二級頁表項,,一個一級頁表項對應(yīng)1段(1MB)虛擬存儲空間的映射關(guān)系,一個一級頁表項對應(yīng)一張二級頁表,,這張二級頁表中的所有頁表項對應(yīng)的虛擬空間映射關(guān)系的總和,,就是一級頁表的頁表項虛擬存儲空間的映射了。舉個例子,,假設(shè)物理存儲空間一頁的大小設(shè)置為4kb,,0~4kb這個地址空間就有一頁的大小了,。剛才不是說了,一級頁表的一個頁表項對應(yīng)1段大小的虛擬存儲空間的映射,。再加上兩個兩個限制:二級頁表的大小為1KB,;每個頁表項占4個字節(jié)(4byte)。這樣就可以知道二級頁表一共有256項,,也就是有256個頁表項?,F(xiàn)在如果一個頁表項映射0~4kb的物理存儲空間。那么256個頁表項就一共映射了0~1024kb的物理存儲空間了,。很明顯這個空間的大小為1M,。就是一級頁表一個頁表項對應(yīng)的虛擬存儲空間映射關(guān)系的范圍。 好了,,說了那么多,,大家應(yīng)該明白了吧,如果還是不明白就畫畫圖吧,。 其實剛才打的例子就是粗粒度小頁地址變換方法的具體規(guī)則,,我再敘述一遍:一級頁表的每個頁表項對應(yīng)的虛擬存儲空間映射關(guān)系的范圍是1MB,其頁表項結(jié)構(gòu)告訴我們31位~10位是粗粒度二級頁表的基址,;二級頁表的大小為1KB,;每個頁表項占4個字節(jié),它對應(yīng)的虛擬存儲空間映射關(guān)系的范圍是4kb,。 接下來,我們來看看二級頁表的頁表項的結(jié)構(gòu): 31位~12位存放著小頁基地址,。 這樣就把整個頁表結(jié)構(gòu)說了一遍了,。好了,現(xiàn)在我們來討論虛擬地址是如何轉(zhuǎn)換成物理地址的,。 從虛擬地址得到物理地址: 傳給cpu的虛擬地址的結(jié)構(gòu)如下: 31位~20位存放著一級頁表內(nèi)偏移序號,; 19位~16位存放著二級頁表內(nèi)偏移序號; 15位~0位存放著頁內(nèi)偏移序號,; 首先會提取31位~20位的一級頁表內(nèi)偏移序號,,再去訪問CP15的C2寄存器,把一級頁表的頁表基址提取出來,。頁表基址加上一級頁表偏移序號就可以找到一級頁表里面相應(yīng)的頁表項,。訪問這項可以得到二級頁表的基址。 然后會再提取19位~16位的二級頁表內(nèi)偏移序號,,加上剛才獲得的二級頁表的基址,。這樣就可以得到二級頁表的頁表項了。訪問其內(nèi)容,,可以得到物理地址的基址,。 最后提取15位到0位的頁內(nèi)偏移序號,,加上剛才的物理地址基址,就可以得到物理地址了。 這就是整個轉(zhuǎn)換過程了,。 接下來,,我要討論的是MMU的訪問控制基址(就是內(nèi)存保護機制) 先要說說這個方面涉及到幾個元素: CP15的C3、C5,、C6,、還有C1的S和R位。還有就是各級頁表的頁表項結(jié)構(gòu)中的某些位,,這些位構(gòu)成了AP和DOMAIN,。(以后我們把頁表項的結(jié)構(gòu)稱為描述符) 我們先來說說C3,這個寄存器記錄了D0~D15這十六個域,,每個域用2位來表示,。什么是域?MMU把整個存儲空間劃分成16個域,,每個域都有對應(yīng)的存儲區(qū)域的,。那么用這兩位來表示什么呢?是權(quán)限,,是訪問這個域的權(quán)限,。這2位有4種組合,每個的具體意義如下: 00:沒有訪問權(quán)限 01:客戶(client)根據(jù)CP15的C1中的R和S位,,再加上各級頁表的描述符里面的AP來確定是否允許各系統(tǒng)工作模式的存儲訪問,。 10:保留 11:管理者,可以在任何工作模式都可以訪問,。 接下來我們來具體分析一下在粗粒度小頁地址裝換方法的情況下是如何來控制訪問權(quán)限的,。 對于一級頁表的頁表項描述符里,8位~5位存放著DOMAIN,,我們根據(jù)它就可以知道這個段是屬于哪個域的,。 對于二級頁表的頁表項描述符里,11位~4位存放著AP3~AP0的信息,,每個各占兩位,。 我們可以根據(jù)C3來判斷那個域的權(quán)限。大家肯定會問到,,AP3~AP0還有剛才提到的C1的S和R位他們好像沒有起到作用,。關(guān)鍵就在這里,如果這個域的權(quán)限是client的話,,就要對應(yīng)一張表來確定在特權(quán)模式下的訪問權(quán)限是怎樣,,還有在用戶模式下的訪問權(quán)限是怎么樣的。關(guān)于這張表在網(wǎng)上很容易找到(Interpreting Access Permission(AP)Bits),。 http://blog.csdn.net/satanwxd/article/details/5296798 |
|
來自: 筆錄收藏 > 《MMU 物理/虛擬地址》