### date: 2017/5/19
### author: soaringlee
mmu是memory management unit的縮寫,中文名是
記憶體管理
單元,它是
**處理器
(cpu)中用來管理
虛擬儲存器
、物理儲存器的控制線路,同時也負責
虛擬位址
對映為實體地址
,以及提供硬體機制的記憶體訪問授權,多使用者多程序作業系統。
虛擬位址又稱為線性位址,將線性位址轉換到實體地址,需要用到頁式mmu;而將邏輯位址轉換到虛擬位址,需要用到段式mmu。
虛擬儲存器的基本思想是程式,資料,
堆疊的總的大小可以超過物理儲存器的大小,作業系統把當前使用的部分保留在記憶體中,而把其他未被使用的部分儲存在磁碟上。比如對乙個16mb的程式和乙個記憶體只有4mb的機器,作業系統通過選擇,可以決定各個時刻將哪4m的內容保留在記憶體中,並在需要時在記憶體和磁碟間交換程式片段,這樣就可以把這個16m的程式執行在乙個只具有4m記憶體機器上了。而這個16m的程式在執行前不必由程式設計師進行分割。
——位址範圍、虛擬位址對映為實體地址 以及 分頁機制
任何時候,計算機上都存在乙個程式能夠產生的位址集合,我們稱之為位址範圍。這個範圍的大小由cpu的位數決定,例如乙個32位的cpu,它的位址範圍是0~0xffffffff (4g),而對於乙個64位的cpu,它的位址範圍為0~0xffffffffffffffff (16e).這個範圍就是我們的程式能夠產生的位址範圍,我們把這個位址範圍稱為虛擬位址空間,該空間中的某乙個位址我們稱之為虛擬位址。與虛擬位址空間和虛擬位址相對應的則是實體地址空間和實體地址,大多數時候我們的系統所具備的實體地址空間只是虛擬位址空間的乙個子集。這裡舉乙個最簡單的例子直觀地說明這兩者,對於一台記憶體為256m的32bit x86主機來說,它的虛擬位址空間範圍是0~0xffffffff(4g),而實體地址空間範圍是0x00000000~0x0fffffff(256m)。
在沒有使用虛擬儲存器的機器上,位址被直接送到記憶體匯流排上,使具有相同位址的物理儲存器被讀寫;而在使用了虛擬儲存器的情況下,虛擬位址不是被直接送到記憶體位址匯流排上,而是送到儲存器管理單元mmu,把虛擬位址對映為實體地址。
大多數使用虛擬儲存器的系統都使用一種稱為分頁(paging)機制。虛擬位址空間劃分成稱為頁(page)的單位,而相應的實體地址空間也被進行劃分,單位是頁幀(frame).頁和頁幀的大小必須相同。在這個例子中我們有一台可以生成32位位址的機器,它的虛擬位址範圍從0~0xffffffff(4g),而這台機器只有256m的實體地址,因此他可以執行4g的程式,但該程式不能一次性調入記憶體執行。這台機器必須有乙個達到可以存放4g程式的外部儲存器(例如磁碟或是flash),以保證程式片段在需要時可以被呼叫。在這個例子中,頁的大小為4k,頁幀大小與頁相同——這點是必須保證的,因為記憶體和外圍儲存器之間的傳輸總是以頁為單位的。對應4g的虛擬位址和256m的物理儲存器,他們分別包含了1m個頁和64k個頁幀。
x86 mmu提供的定址模式有4k/2m/4m的page模式(根據不同的cpu,提供不同的能力),此處提供的是目前大部分作業系統使用的4k
分頁機制的描述,並且不提供access check的部分。
虛擬位址
(va,virtual address),變換後的虛擬位址(mva,modified virtual address),
實體地址
(pa,physical address)。沒有啟動mmu時,cpu核心、cache、mmu、外設等所有部件使用的都是實體地址。啟動mmu後,cpu核心對外發出的是虛擬位址va,va被轉換為mva供cache、mmu使用,並再次被轉換為pa,最後使用pa讀取實際裝置。
推薦blog:
實體地址和邏輯位址(虛擬位址)
1.實體地址 實體地址是載入到記憶體位址暫存器中的位址,是指記憶體中各物理儲存單元的位址從統一的基位址進行的順序編址。又稱絕對位址,它是資料在記憶體單元的真正位址。在前端匯流排上傳輸的記憶體位址都是物理記憶體位址,編號從0開始一直到可用物理記憶體的最高端。這些數字被北橋 nortbridge chi...
邏輯位址 實體地址 虛擬位址
用於記憶體晶元級的單元定址,與處理器和cpu連線的位址匯流排相對應。雖然可以直接把實體地址理解成插在機器上那根記憶體本身,把記憶體看成乙個從0位元組一直到最大空量逐字節的編號的大陣列,然後把這個陣列叫做實體地址,但是事實上,這只是乙個硬體提供給軟體的抽像,記憶體的定址方式並不是這樣。所以,說它是 與...
邏輯位址與實體地址
邏輯位址 logical address 是指由程式產生的與段相關的偏移位址部分。例如,你在進行c語言指標程式設計中,可以讀取指標變數本身值 操作 實際上這個值就是邏輯位址,它是相對於你當前程序資料段的位址,不和絕對實體地址相干。只有在intel實模式下,邏輯位址才和實體地址相等 因為實模式沒有分段...