11 0外篇之 MMU記憶體管理單元

2021-05-22 18:49:22 字數 1585 閱讀 8904

mmu是memory management unit的縮寫,中文名是記憶體管理單元,它是**處理器(cpu)中用來管理虛擬儲存器、物理儲存器的控制線路,同時也負責虛擬位址對映為實體地址,以及 提供硬體機制的記憶體訪問授權。

許多年以前,當人們還在使用dos或是更古老的作業系統的時候,計算機的記憶體還非常小,一般都是以k為單位進行計算,相應的,當時的程式規模也不大,所以 記憶體容量雖然小,但還是可以容納當時的程式。但隨著圖形介面的興起還有使用者需求的不斷增大,應用程式的規模也隨之膨脹起來,終於乙個難題出現在程式設計師的面 前,那就是應用程式太大以至於記憶體容納不下該程式 ,通常解決的辦法是把程式分割成許多稱為覆蓋塊(overlay)的片段 。覆蓋塊0首先執行,結束時他將 呼叫另乙個覆蓋塊。雖然覆蓋塊的交換是由os完成的,但是必須先由程式設計師把程式先進行分割,這是乙個費時費力的工作,而且相當枯燥。人

然覆蓋塊的交換是由os完成的,但是必須先由程式設計師把程式先進行分割,這是乙個費時費力的工作,而且相當枯燥

們必須找到更好的辦 法從根本上解決這個問題。不久人們找到了乙個辦法,這就是虛擬儲存器(virtual memory).虛擬儲存器的基本思想是程式,資料,堆疊的總的大小可以超過物理儲存器的大小 ,作業系統把當前使用的部分保留在記憶體中,而把其他未被使用 的部分儲存在磁碟上。比如對乙個16mb的程式和乙個記憶體只有4mb的機器,作業系統通過選擇,可以決定各個時刻將哪4m的內容保留在記憶體中,並在需要時 在記憶體和磁碟間交換程式片段,這樣就可以把這個16m的程式執行在乙個只具有4m記憶體機器上了。而這個16m的程式在執行前不必由程式設計師進行分割。

當前使用的部分保留在記憶體中,其他未使用的部分保持在磁碟中。

並在不要時  在記憶體和磁碟見交換程式片段。

1:任何時候,計算機都存在乙個程式能夠產生的位址集合,我們稱之為 位址範圍。有cpu的位數決定。

arm 的位址範圍 0-0xffffffff 4 g  我們將這稱之為  虛擬位址空間。

該空間的某個位址   稱之為虛擬位址。

相對應的 實體地址空間  

列:對於一台256m的32bit x86機子,他的虛擬位址空間為0-4g  而  實體地址空間  的範圍0-0x0fffffff(256m)

2;沒有虛擬儲存器的機子  虛擬位址直接被送到記憶體匯流排 上,使具有相同位址的物理儲存器被讀寫。

2  有虛擬管理器的情況下,虛擬位址不是直接送到記憶體匯流排上,而是送到儲存器管理單元mmu,把虛擬位址對映 到實體地址

大多數使用虛擬儲存器的系統都使用一種稱為分頁(paging)機制。虛擬位址空間劃分成稱為頁(page)的單位,而相應的實體地址空間也被進行劃分, 單位是頁楨(frame).頁和頁楨的大小必須相同。

在這個例子中我們有一台可以生成32位位址的機器,它的虛擬位址範圍從 0~0xffffffff(4g),而這台機器只有256m的實體地址,因此他可以執行4g的程式,但該程式不能一次性調入記憶體執行。 這台機器必須有乙個 達到可以存放4g程式的外部儲存器(例如磁碟或是flash )(硬碟 ),以保證程式片段在需要時可以被呼叫。在這個例子中,頁的大小為4k,頁楨大小與頁相同—— 這點是必須保證 的,因為記憶體和外圍儲存器之間的傳輸總是以頁為單位的。對應4g的虛擬位址和256m的物理儲存器,他們分別包含了1m個頁和64k個頁 楨。

記憶體和外圍儲存器之間的傳輸  總是 以頁  為 單位的。

MMU記憶體管理單元

mmu記憶體管理單元主要負責虛擬位址到實體地址的對映。在沒有使用虛擬儲存器的機器上,虛擬位址被直接送到記憶體匯流排上,使具有相同位址的物理儲存器被讀寫。而在使用了虛擬儲存器的情況下,虛擬位址不是被直接送到記憶體位址匯流排上,而是送到記憶體管理單元 mmu,再由mmu對映到物理記憶體中。如上圖所示,使...

MMU記憶體管理單元介紹

本篇文章簡要闡述mmu的概念,以及以段位址的轉換過程為例,簡單說明mmu將虛擬位址轉換成實體地址的過程。更多詳細內容請檢視 arm mmu 中文手冊 pdf mmu的實現過程,實際上就是乙個查表對映的過程。建立頁表 translate table 是實現mmu功能不可缺少的一步。頁表是位於系統的記憶...

記憶體管理單元MMU實驗

mmu介紹 許可權管理 當我們使用windows時,有時候會彈出位址訪問錯誤,但這不影響整個作業系統的執行。假設a b程式的時序圖如下 因為a b程式的位址空間各不相同。許可權管理就使得a程式無法訪問b程式的位址。如果a程式寫的非常糟糕,a程式並不能破壞核心。假如有兩個hello.c檔案,如圖 這兩...