ARM「庖丁解牛」之儲存器管理單元MMU

2022-05-02 11:24:16 字數 2761 閱讀 4615

**

最近筆者詳細地學習了由杜春雷老師編寫的《arm體系結構與程式設計》。對arm儲存管理單元mmu有了全新的認識。在這裡寫寫心得體會,也可以對知識點兒梳理一下吧。

在談mmu之前,筆者談一下關於學習方法的問題。筆者在看第5章——arm儲存系統時,反覆的對所講到的內容進行思考推敲,但是當看完一遍、兩遍時,筆者 發現還是對其中相關的一些概念理解不是很透徹,也就是有些概念很模糊,甚至老是弄的混淆了,更別說是相關的聯絡了。後來,筆者發現,杜老師的書寫的是很詳 細,但是缺少**。而大對數人在學習過程中懶得動筆,光是在哪兒閱讀課文,導致讀完一遍是暈暈乎乎的,不知所云。於是,筆者對第5章看第三遍的時候,開始 用筆在紙上寫寫畫畫,不放過任何一句話。效果顯然與前兩遍不同了。在看第三遍的時候,筆者在紙上做了很多圖,也記錄的許多要點。等第三遍看完了,筆者眼前 一亮,對arm的儲存系統有了庖丁解牛般的感覺。其實好記性不如爛筆頭完全可以這樣理解,呵呵。好了接下來筆者開始談談關於arm儲存系統的問題。

一、相關概念

說是arm儲存系統,名字有些唬人,其實說白了不就是可以理解為是乙個儲存糧食的倉庫嘛。既然是乙個儲存糧食的倉庫,那當然就需要管理員啦。假設該倉庫內 要存放20種糧食。管理員需要做的是把倉庫分成若干個分割槽,一區、二區……二十區。然後,一區放玉公尺,二區放大公尺,三區放小公尺,依次類推將20種糧食在二 十個分區內對號入座,並將資訊記錄在檔案本上。好,再來看arm儲存系統。先來看幾個概念。

1、mmu

什麼是mmu,暫且將他理解為mmu就是倉庫的管理員,後面將會對其詳細解釋。

2、虛擬位址空間

顯然,虛擬位址是乙個抽象的概念,是存在於人的思維中的乙個概念並不以實物的形式表現出來,比如在倉庫中,當管理員把玉公尺存到a區後,腦子裡就有了一條記 錄:a區存放了玉公尺,並且管理員還知道這種玉公尺產於內蒙古。這條記錄就是虛擬出來的東西了,並不以實物的形式表現出來。直到,管理員把這條記錄用筆寫到檔 案本上之後,這條記錄就以文字的形式表現出來了。虛擬位址空間就可以看作是在腦子裡而未以實物的形式表現出來的一條條記錄的集合。在arm中採用了頁式虛 擬記憶體管理。它把虛擬位址空間分成乙個個固定大小的塊,每一塊稱為一頁。而一頁就是上面提到的一條記錄。這句話用圖形語言表示出來就是:

這就是虛擬記憶體位址空間,位址空間分為若干虛擬頁來管理。這其中的每一頁便可看作是一條記錄(記錄了具體某種糧食的位址和備註資訊)。虛擬位址空間中的每

一頁同理具有自己的屬性,分別是a、b和c屬性。a屬性是該虛擬記憶體頁對應的真實物理記憶體位址;b屬性是該虛擬記憶體頁的的方位許可權;c屬性是該虛擬記憶體的

就好。接下來在介紹乙個概念。

3、物理記憶體位址空間

這些頁可分為三類,大頁、小頁和極小頁。其中:

大頁:是大小為64kb的儲存塊兒。

小頁:是大小為4kb的儲存塊兒。

極小頁:是大小為1kb的儲存塊兒。

這個大小就是反映了儲存量了,就好比倉庫裡a區能夠儲存多少噸玉公尺乙個意思啦。通過觀察知每一頁又被分成一行一行的樣子。那麼其中的每一行被稱為乙個頁描述符。到這兒只需了解一下頁描述符這個概念就可以了,詳細後面會對其詳細的介紹。

4、頁表

頁表是什麼呢?想想看,物理記憶體空間中的某一頁(實頁)在倉庫中對應著具體儲存某種糧食的一塊兒地方(有一定的面積)。虛擬位址空間中的某一頁(虛頁)又

對應著一條記錄,比如說在管理員腦子中有條資訊:a區儲存著玉公尺,玉公尺產於內蒙古。那麼像這樣的記錄要是多了,管理員肯定是就不住的,所以他要把這一條一

條的記錄記到乙個檔案本子上,以便之後取糧食的時候方便查詢。其實這個檔案本兒就是頁表了。**頁表:

頁表是真實存在於記憶體中的一張表,頁表中的每一行被稱為乙個位址變換條目,每個位址變換條目就是一條記錄,即每個位址變換條目對應了虛擬位址空間中的某一虛頁。

5、快表tlb(translation lookaside buffer)

那什麼是快表呢?來看例子:比如說倉庫裡有上千中糧食,即檔案本兒上有上千條記錄,如果現在來個取糧食的貨車要拉走1噸小麥,而小麥這條記錄正好在589

條處記錄著。貨車司機來到倉庫後,肯定要去查檔案本了,看看小麥放在什麼位址處。你想想看,如果他從第一條記錄處開始查起,找到小麥得多長時間?不用說,

這肯定是很費勁兒的。你再想想看,當第乙個貨車拉走小麥後,又來了一輛貨車(奇怪的是又是拉小麥,其實這種現象在微機中稱作時間區域性性:在一段相鄰的時間

內,cpu訪問相同資料的概率很大),司機在查詢位址上又得費一番周折。再想想,如果接下來乙個接乙個的又來了10輛拉小麥的貨車。真實鬱悶了……。

呵呵,現在想想,有沒有一種好辦法讓這個查詢位址的效率提高點兒?答案是肯定的。如果在檔案本的旁邊再放乙個快速查詢記錄本,記錄下上次拉走的糧食種類和

位址。如果是這樣再回頭想想,後面來拉糧食的司機,一到倉庫首先去檢視這個快速查詢記錄本,看看有沒有自己需要的記錄。如果有,是不是就為自己節省了不少

時間。如果沒有,再去檔案本兒上查,查到後,這位司機再把自己需要的記錄抄寫到快速查詢記錄本上。這種方式是不是就大大提高了查詢位址的效率。哈哈,不用

說,這個快速查詢記錄本就是快表tlb了。**tlb:

顯然,這個快表tlb就是頁表的乙個子集。當cpu需要訪問記憶體時,現在tlb中查詢需要的位址變換條目,如果該條目不存在,cpu從位於記憶體中的頁表中查詢,並把相應的結果新增到tlb中。這樣,當cpu下一次又需要該位址變換條目時,就可以從tlb中直接得到,從而使位址變換的速度大大加快。

庖丁解牛 資料結構(一)之稀陣列

稀疏陣列可以看做是普通陣列的壓縮,簡單點 稀疏陣列中都是有用資料且,結構int sparsearray new int sum 1 3 說明 sum為二維陣列中有用資料個數。棋盤 標準的二維陣列 11 11 0代表無子 1 代表黑子 2 代表 白子 將上述二維陣列轉為稀疏陣列如下展示 說明 第一行 ...

庖丁解牛 資料結構(二)之陣列模擬佇列

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。去銀行排對取錢 public class arrayqueuedemo catch ex...

庖丁解牛 資料結構(三)之陣列模擬環形佇列

環形佇列,個人粗粗的理解,可以反覆使用,上一張寫的資料模擬佇列是乙個一次性佇列用過就不能用了,環形佇列是取出資料後可重複利用空餘時間。可用2 已用 3 已用 public static void main string args catch exception e break case a syst...