歷史
許多年以前,當人們還在使用
DOS或是更古老的
作業系統的時候,計算機的記憶體還非常小,一般都是以K為單位進行計算,相應的,當時的程式規模也不大,所以記憶體容量雖然小,但還是可以容納當時的程式。但隨著圖形界面的興起還有用戶需求的不斷增大,
應用程式的規模也隨之膨脹起來,終於一個難題在程式設計師的面前,那就是
應用程式太大以至於記憶體容納不下該程式,通常解決的辦法是把程式分割成許多稱為
覆蓋塊(
overlay)的片段。
覆蓋塊0首先運行,結束時他將調用另一個覆蓋塊。雖然覆蓋塊的交換是由
OS完成的,但是必須先由
程式設計師把程式先進行分割,這是一個費時費力的工作,而且相當枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了一個辦法,這就是
虛擬存儲器(
virtual memory)。
虛擬存儲器的基本思想是程式,數據,
堆疊的總的大小可以超過物理存儲器的大小,
作業系統把當前使用的部分保留在記憶體中,而把其他未被使用的部分保存在磁碟上。比如對一個16MB的程式和一個記憶體只有4MB的機器,
作業系統通過選擇,可以決定各個時刻將哪4M的內容保留在
記憶體中,並在需要時在記憶體和磁碟間交換程式片段,這樣就可以把這個16M的程式運行在一個只具有4M記憶體機器上了。而這個16M的程式在運行前不必由
程式設計師進行分割。
簡介
記憶體管理單元通常套用在桌面型
計算機或者
伺服器,通過
虛擬存儲器使得
計算機可以使用比實際的物理記憶體更多的存儲空間。同時,記憶體
管理單元還對實際的物理記憶體進行分割和保護,使得每個軟體任務只能訪問其分配到的記憶體空間。如果某個任務試圖訪問其他任務的記憶體空間,記憶體管理單元將自動產生異常,保護其他任務的程式和數據不受破壞。概述圖顯示了一個典型的使用記憶體
管理單元為多個任務劃分的
記憶體映射圖。記憶體管理單元的這個機制是調試指針錯誤或數組下標越界等錯誤的非常強大的工具。
基本概念
MMU位於
處理器核心和連線
高速快取以及
物理存儲器的
匯流排之間。當處理器
核心取指令或者存取數據的時候,都會提供一個有效地址(effective address),或者稱為
邏輯地址、
虛擬地址。這個地址是
可執行代碼在編譯的時候由連結器生成的。不同於開發
嵌入式處理器系統的程式設計師,桌面型計算器的程式開發人員通常對硬體的物理配置信息所知甚少。將
存儲器系統虛擬化,程式設計師就不需要了解存儲器的物理配置細節。當套用代碼需要使用存儲空間時,作業系統通過MMU為其分配合適的物理存儲空間。
有效地址不需要和系統的實際硬體物理地址相匹配,而是通過MMU將有效地址映射成對應的
物理地址,以訪問指令和數據。
每條MMU匹配規則所對應的
存儲器的大小定義為頁。頁的大小通常設定為不會對程式的性能造成顯著影響的最小的程式和代碼的長度。當暫時不使用
物理記憶體的內容時,可將其保存到硬碟等
外部存儲器里,將其空間用於其他程式;當再次使用這部分內容時再從外部存儲器寫回到實際物理記憶體中。通過這種方法,系統就可以提供多於實際物理記憶體容量的“
虛擬記憶體”。如果MMU定義的頁太大,那么進行
虛擬記憶體頁面替換所花費的時間就太長;如果頁太小,就會引起過於頻繁的頁面替換。通常最小的頁設定為4 KB。
為了加快MMU規則匹配的處理過程,
有效地址和實際
物理地址的對應表通常保存在一塊單獨的高速快取中,稱為對應查找表(Translation Lookaside Buffer,TLB),
TLB和實際物理存儲器可以同時進行並行的訪問。有效地址的高位作為在
TLB進行匹配查找的依據,而
有效地址的低位作為頁面內的偏址。
TLB可以包含很多個表項(
entry),每個表項對應一個MMU的頁。作業系統或者套用啟動代碼必須正確的初始化TLB的所有表項。當應用程式提供的有效地址正好位於某個
TLB表項制定的地址範圍內時,稱為產生了一次TLB命中;如果這個有效地址沒有位於任何一個
TLB表項制定的地址範圍內,稱為一個TLB
缺失,或者TLB未
命中。TLB未命中往往發生在應用程式出現錯誤的時候,所以TLB未命中所引發的
異常處理可以很有效的發現和調試這類錯誤。虛擬記憶體利用TLB未命中的異常來完成頁面交換,並根據交換的內容對應的調整TLB表項的參數。通常TLB表項還會指定一些
存儲器讀寫的其他參數,只有當這些參數也和當前的存儲器讀寫的參數符合的時候,才能產生TLB命中。
MMU屬性
MMU符合
Power體系結構的規範。TLB表項都是相連映射的,並且提供了額外的硬體來加速
TLB未命中異常的處理。有幾條特殊的指令用於管理TLB表項。
頁面大小
①指定的有效映射地址。
②讀寫許可權。
MMU具有32個TLB表項,可以支持32個頁面。每個頁面的容量可以指定為4 KB,16 KB,64 KB,256 KB,1 MB,4 MB,16 MB,64 MB和256 MB。
實際頁面地址 (RealPageNumber,
RPN) 確定了頁面對應的起始
物理地址。這個起始地址必須是頁面大小的整數倍,例如16 KB的頁面的起始地址必須位於0,16 KB,32 KB或48KB的邊界上。這樣,將頁面和MPC 5554 / 5553的實際
物理地址對應起來的時候,就需要格外注意。
實際上,存儲器
分配表也考慮到了這一點,仔細地分配了每個片上模組的起始地址和模組地址空間,使得需要用到的TLB表項儘可能少。實際上,
BAM代碼中只需要使用前5個
TLB表項就可以覆蓋微處理器的全部地址空間。多個頁面也允許占用相同的
物理地址空間。
例如,可以將片內的一段64KB的
FLASH存儲器映射成一個64 KB的
唯讀頁面;另外將一段16 KB的讀寫頁面映射到這64 KB的起始地址。這樣,這64KB的
地址空間實際上就被分成了48KB和16KB兩個部分,如圖1所示。雖然這兩個頁面有可能產生相同的
物理地址,但是通過結合其他的頁面屬性可以避免多個頁面同時命中。注意讀寫許可權並不能用來避免多頁面命中。
在這種配置方式下,48 KB的
唯讀部分可以用於保存
常數和表等固定數據,而16 KB的讀寫部分則可以用於模擬EEP-
ROM存儲區。應用程式必須非常仔細的確認那些對48KB常數段進行操作的代碼不會錯誤的訪問到前面的16KB區域,因為在這種情況下MMU無法檢查對48KB區域的訪問
越界。如果要實現對48 KB區域的訪問越界檢查,將一共需要使用4個
TLB表項才能實現。使用3個
TLB表項將這48 KB空間必須映射到3個獨立的16 KB頁面,並且和原來的16 KB頁面沒有任何重疊。
通過配置
TLB表項,也可以將全部的片
記憶體儲器和I/O空間都映射成一個大的連續的
虛擬地址空間。MPC 5554 / 5553 的
I/O模組的地址空間分散在整個4 GB
定址空間里。圖2的例子裡,eTPU模組的16 KB雙口共享RAM和片內的64 KB
RAM被映射成了一個連續的80KB
虛擬空間。
TS地址空間類型指示
根據
Power體系規範的規定,有效地址還包含了兩個額外的位分別用於指明當前的有效地址是否是指令獲取操作和
數據讀寫操作。對於指令操作,這個額外的位保存在MSR暫存器的IS位;對於數據操作,這個額外的位保存在
MSR暫存器的DS位。這兩個位可以通過程式指令進行修改,但是當發生中斷的時候,MSR暫存器中的這兩個位都會被清除為0。
當
處理器進行指令獲取或數據讀寫操作時,IS和DS位會分別和
TLB表項中保存的TS位進行比較,比較的結果將對是否產生
TLB命中產生影響。
由於在發生中斷時,MSR
暫存器中IS和DS位都被清為0,所以對於中斷處理程式所在的頁面,其TS必須置為0.正常的應用程式所在的頁面的TS就需要置為1。
TID TLB處理ID號
根據
Power體系規範的規定,MMU還提供了PID(ProcessID)的特性。當TLB進行
有效地址映射處理的時候,
PID暫存器的值也和TLB表項中的TID值進行比較。不管是指令操作還是數據操作,都要進行PID和TID的比較。
如果
TID被設定為0值,那么將忽略PID和TID比較的結果,也不會對
TLB命中的處理產生影響。
多個
TLB表項對應相同的
有效地址的情況,可以通過TID來進行區分。通過修改TID暫存器的值,可以很容易地在運行時切換存儲器.例如當應用程式運行時,通過
NEXUS調試接口修改TID暫存器的值後,相同的有效地址所對應的數據將變成從另外--個物理存儲空間得到。這對於調試是非常有用的。
EPN、RPN有效頁面地址,實際頁面地址
●
有效地址的特定位數的內容和TLB表項中有效頁面地址EPN相同。
●MSR
暫存器的IS位(對於指令操作)或DS位(對於數據操作)和TLB表項中的TS位相同。
●PID
暫存器的值和TLB表項中TID的值相同,或者TID的值為零。
圖3給出了有效TLB命中的邏輯處理結構圖。
對一個有效地址,如果沒有任何一個
TLB表項滿足上述條件,就產生了一個TLB
缺失,這可以引起一個指令或數據的
TLB缺失異常。
TLB表項中定義的頁大小決定了
有效地址的多少個位的信息需要和TLB表項中的EPN進行比較。當TLB命中後,TLB表項中的
RPN就替換了有效地址中的對應位,而構成實際的物理地址。
存儲器訪問許可權
程式可以為每個虛擬頁面指定一定的
訪問許可權,包括是系統態還是普通態,是否允許讀、寫和
運行指令。對於某些套用,這些
訪問許可權設定只能在系統復位後配置一次。
例如,程式代碼所在區域被配置為只能運行,數據
變數區被設定為讀寫非運行,數據
常數區被配置為唯讀非運行。對於另一些套用,這些
訪問許可權由作業系統根據應用程式的需要和系統運行的策略進行動態的修改。
UX,SX,UW,SW,UR和SR訪問許可權位用於設定一個虛擬頁面的訪問許可權。這些位的具體描述如下:
●SR--系統態讀許可權:在系統態下(MSR[PR=0]),允許進行存儲區讀操作和讀取形式的快取管理操作。
●SW--系統態寫許可權:在系統態下(MSR[PR=0]),允許進行
存儲器寫操作和寫入形式的快取管理操作。
●SX--系統態運行許可權:在系統態下(MSR[PR= 0]) ,允許從
存儲器獲取和執行指令。
●UR--普通態讀許可權:在普通態下(MSR[PR=1]),允許進行存儲區讀操作和讀取形式的快取管理操作。
●UW--普通態寫許可權:在普通態下(MSR[PR= 1]),允許進行
存儲器寫操作和寫入形式的快取管理操作。
●UX--普通態運行許可權:在普通態下(MSR[PR= 1]) ,允許從
存儲器獲取和執行指令。
在地址比較和頁面屬性比較完成後,還需要檢查這些
訪問許可權設定。如果產生了許可權衝突,會引發一個指令或數據存儲
中斷(ISI或DSI)。
相關概念
任何時候,計算機上都存在一個程式能夠產生的地址集合,我們稱之為地址範圍。
地址範圍的大小由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個頁幀。
功能
1)將線性地址映射為物理地址
現代的多用戶
多進程作業系統,需要MMU,才能達到每個用戶進程都擁有自己獨立的
地址空間的目標。使用MMU,作業系統劃分出一
段地址區域,在這塊地址區域中,每個進程看到的內容都不一定一樣。例如MICROSOFT
WINDOWS作業系統將地址範圍4M-2G劃分為用戶地址空間,進程A在地址0X400000(4M)映射了
執行檔,進程B同樣在地址0X400000(4M)映射了執行檔,如果A進程讀地址0X400000,讀到的是A的執行檔映射到RAM的內容,而進程B讀取地址0X400000時,則讀到的是B的執行檔映射到RAM的內容。
這就是MMU在當中進行地址轉換所起的作用。
2)提供硬體機制的記憶體訪問授權
當應用程式的所有執行緒共享同一
存儲器空間時,任何一個執行緒將有意或無意地破壞其它執行緒的代碼、數據或
堆疊。異常執行緒甚至可能破壞核心代碼或內部數據結構。例如執行緒中的指針錯誤就能輕易使整個
系統崩潰,或至少導致系統工作異常。
就安全性和可靠性而言,基於進程的實時作業系統(RTOS)的性能更為優越。為生成具有單獨地址空間的進程,RTOS只需要生成一些基於RAM的數據結構並使MMU加強對這些數據結構的保護。基本思路是在每個關聯轉換中“接入”一組新的
邏輯地址。MMU利用當前映射,將在指令調用或數據讀寫過程中使用的邏輯地址映射為
存儲器物理地址。MMU還標記對非法邏輯地址進行的訪問,這些非法邏輯地址並沒有映射到任何物理地址。
這些進程雖然增加了利用查詢表訪問存儲器所固有的
系統開銷,但其實現的效益很高。在進程邊界處,疏忽或錯誤操作將不會出現,
用戶接口執行緒中的缺陷並不會導致其它更關鍵執行緒的代碼或數據遭到破壞。在可靠性和安全性要求很高的複雜嵌入式系統中,仍然存在采無存儲器保護的作業系統的情況,這實在有些不可思議。
採用MMU還有利於選擇性地將頁面映射或解映射到
邏輯地址空間。物理存儲器頁面映射至邏輯空間,以保持當前進程的代碼,其餘頁面則用於數據映射。類似地,物理存儲器頁面通過映射可保持進程的執行緒
堆疊。RTOS可以在每個執行緒堆疊解映射之後,很容易地保留邏輯地址所對應的頁面內容。這樣,如果任何執行緒分配的堆疊發生溢出,將產生硬體
存儲器保護故障,核心將掛起該執行緒,而不使其破壞位於該地址空間中的其它重要存儲器區,如另一執行緒堆疊。這不僅線上程之間,還在同一地址空間之間增加了存儲器保護。
存儲器保護(包括這類
堆疊溢出檢測)在
應用程式開發中通常非常有效。採用了存儲器保護,
程式錯誤將產生異常並能被立即檢測,它由
原始碼進行跟蹤。如果沒有存儲器保護,程式錯誤將導致一些細微的難以跟蹤的故障。實際上,由於在扁平
存儲器模型中,RAM通常位於
物理地址的零頁面,因此甚至NULL指針引用的解除都無法檢測到。
系列介紹
INTEL出品的80386CPU或者更新的CPU中都集成有MMU. 可以提供32BIT共4G的
地址空間。
X86 MMU提供的定址模式有4K/2M/4M的PAGE模式(根據不同的CPU,提供不同的能力),此處提供的是大部分作業系統使用的4K
分頁機制的描述,並且不提供ACCESS CHECK的部分。
1.涉及的暫存器:
a) GDT
b) LDT
c) CR0
d) CR3
e) SEGMENT REGISTER
a) SEGMENT REGISTER作為GDT或者LDT的INDEX,取出對應的GDT/LDT ENTRY。
注意: SEGMENT是無法取消的,即使是FLAT模式下也是如此。 說FLAT模式下不使用SEGMENT REGISTER是錯誤的.。任意的RAM定址指令中均有DEFAULT的SEGMENT假定。
ENTRY格式
typedef struct
{
UINT16 limit_0_15;
UINT16 base_0_15;
UINT8 base_16_23;
UINT8 accessed : 1;
UINT8 readable : 1;
UINT8 conforming : 1;
UINT8 code_data : 1;
UINT8 app_system : 1;
UINT8 dpl : 2;
UINT8 present : 1;
UINT8 limit_16_19 : 4;
UINT8 unused : 1;
UINT8 always_0 : 1;
UINT8 seg_16_32 : 1;
UINT8 granularity : 1;
UINT8 base_24_31;
} CODE_SEG_DESCRIPTOR,*PCODE_SEG_DESCRIPTOR;
typedef struct
{
UINT16 limit_0_15;
UINT16 base_0_15;
UINT8 base_16_23;
UINT8 accessed : 1;
UINT8 writeable : 1;
UINT8 expanddown : 1;
UINT8 code_data : 1;
UINT8 app_system : 1;
UINT8 dpl : 2;
UINT8 present : 1;
UINT8 limit_16_19 : 4;
UINT8 unused : 1;
UINT8 always_0 : 1;
UINT8 seg_16_32 : 1;
UINT8 granularity : 1;
UINT8 base_24_31;
} DATA_SEG_DESCRIPTOR,*PDATA_SEG_DESCRIPTOR;
共有4種ENTRY格式,此處提供的是CODE SEGMENT和DATA SEGMENT的ENTRY格式. FLAT模式下的ENTRY在base_0_15,base_16_23處為0,而limit_0_15,limit_16_19處為0xfffff. granularity處為1。表名SEGMENT
地址空間是從0到0XFFFFFFFF的4G的地址空間。
b) 從SEGMENT處取出BASE ADDRESS 和LIMIT. 將要訪問的ADDRESS首先進行ACCESS CHECK,是否超出SEGMENT的限制。
c) 將要訪問的ADDRESS+BASE ADDRESS,形成需要32BIT訪問的
虛擬地址. 該地址被解釋成如下格式:
typedef struct
{
UINT32 offset :12;
UINT32 page_index :10;
UINT32 pdbr_index :10;
} VA,*LPVA;
d) pdbr_index作為CR3的INDEX,獲得到一個如下定義的數據結構
typedef struct
{
UINT8 present :1;
UINT8 writable :1;
UINT8 supervisor :1;
UINT8 writethrough:1;
UINT8 cachedisable:1;
UINT8 accessed :1;
UINT8 reserved1 :1;
UINT8 pagesize :1;
UINT8 ignoreed :1;
UINT8 avl :3;
UINT8 ptadr_12_15 :4;
UINT16 ptadr_16_31;
}PDE,*LPPDE;
e) 從中取出PAGE TABLE的地址. 並且使用page_index作為INDEX,得到如下數據結構
typedef struct
{
UINT8 present :1;
UINT8 writable :1;
UINT8 supervisor :1;
UINT8 writethrough:1;
UINT8 cachedisable:1;
UINT8 accessed :1;
UINT8 dirty :1;
UINT8 pta :1;
UINT8 global :1;
UINT8 avl :3;
UINT8 ptadr_12_15 :4;
UINT16 ptadr_16_31;
}PTE,*LPPTE;
f) 從PTE中獲得PAGE的真正物理地址的BASE ADDRESS. 此BASE ADDRESS表名了物理地址的.高20位. 加上
虛擬地址的offset就是物理地址所在了.
ARM出品的CPU,MMU作為一個協處理器存在。根據不同的系列有不同搭配。需要查詢DATASHEET才可知道是否有MMU。如果有的話,一定是編號為15的協處理器。可以提供32BIT共4G的地址空間。
ARM MMU提供的
分頁機制有1K/4K/64K 3種模式,這裡介紹的是
作業系統通常使用的4K模式。
ARM cpu地址轉換涉及三種地址:
虛擬地址(VA,Virtual Address),變換後的虛擬地址(MVA,Modified Virtual Address),
物理地址(PA,Physical Address)。沒有啟動MMU時,
CPU核心、cache、MMU、外設等所有部件使用的都是物理地址。啟動MMU後,CPU核心對外發出的是虛擬地址VA,VA被轉換為MVA供cache、MMU使用,並再次被轉換為PA,最後使用PA讀取實際設備。
ARM沒有SEGMENT的暫存器,是真正的FLAT模式的CPU。給定一個ADDRESS,該地址可以被理解為如下數據結構:
typedef struct
{
UINT32 offset :12;
UINT32 page_index :8;
UINT32 pdbr_index :12;
} VA,*LPVA;
從MMU暫存器2中取出BIT14-31,pdbr_index就是這個表的索引,每個入口為4BYTE大小,結構為
typedef struct
{
UINT32 type :2; //always set to 01b
UINT32 writebackcacheable:1;
UINT32 writethroughcacheable:1;
UINT32 ignore :1; //set to 1b always
UINT32 domain :4;
UINT32 reserved :1; //set 0
UINT32 base_addr:22;
} PDE,*LPPDE;
獲得的PDE地址,獲得如下結構的ARRAY,用page_index作為索引,取出內容。
typedef struct
{
UINT32 type :2; //always set to 11b
UINT32 ignore :3; //set to 100b always
UINT32 domain :4;
UINT32 reserved :3; //set 0
UINT32 base_addr:20;
} PTE,*LPPTE;
從PTE中獲得的基地址和上offset,組成了
物理地址。
PDE/PTE中其他的BIT,用於訪問控制。這邊講述的是一切正常,物理地址被正常組合出來的狀況。
ARM/X86 MMU使用上的差異:
⒈X86始終是有SEGMENT的概念存在. 而ARM則沒有此概念(沒有SEGMENT REGISTER.).
⒉ARM有個DOMAIN的概念. 用於訪問授權. 這是X86所沒有的概念. 當通用OS嘗試同時適用於此2者的CPU上,一般會拋棄DOMAIN的使用。
工作機理
現代的記憶體管理單元是以頁的方式,分割虛擬
地址空間(處理器使用的地址範圍)的;頁的大小是2的n次方,通常為幾
KB(千位元組)。地址尾部的n位(頁大小的2的次方數)作為頁內的偏移量保持不變。其餘的地址位(address)為(虛擬)頁號。
頁表條目
記憶體管理單元通常藉助一種叫做轉譯旁觀緩衝器(Translation Lookaside Buffer,縮寫為TLB)的相聯高速快取(associative cache)來將虛擬頁號轉換為物理頁號。當後備緩衝器中沒有轉換記錄時,則使用一種較慢的機制,其中包括專用硬體(hardware-specific)的數據結構(Data structure)或軟體輔助手段。這個數據結構稱為分頁表,頁表中的數據就叫做分頁表項(page table entry,縮寫為PTE)。物理頁號結合頁偏移量便提供出了完整的物理地址。
頁表或轉換後備緩衝器中數據項包括的信息有:
一、“髒位”(頁面重寫標誌位,dirty bit)——表示該頁是否被寫過。
二、“訪問位”(accessed bit)——表示該頁最後使用於何時,以便於
最近最少使用頁面置換算法(least recently used page replacement algorithm)的實現。
三、哪種進程可以讀寫該頁的信息,例如用戶模式(user mode)進程還是
特權模式(supervisor mode)進程。
四、該頁是否應被高速緩衝的信息。
有時,TLB或PTE會禁止對虛擬頁的訪問,這可能是因為沒有物理
隨機存取存儲器(random access memory)與虛擬頁相關聯。如果是這種情況,MMU將向CPU發出
頁錯誤(page fault)的信號。
作業系統(operating system)將進行處理,也許會嘗試尋找RAM的空白幀,同時創建一個新的PTE將之映射到所請求的虛擬地址。如果沒有空閒的RAM,可能必須關閉一個已經存在的頁面,使用一些替換算法,將之保存到磁碟中(這被稱之為頁面調度(paging)。在一些MMU中,PTEs或者TLB也存在一些缺點,在這樣的情況下作業系統將必須釋放空間以供新的映射。
益處
有些情況下,頁錯誤的出現表示可能存在軟體錯誤,並能夠被套用記憶體管理單元的記憶體保護特性通過禁止出錯程式避免出現非法訪問其他程式記憶體。通常地, 作業系統會為每個程式分配虛擬記憶體地址。
此外,記憶體管理單元能夠減少程式的記憶體碎片化現象。當程式分配並釋放記憶體塊後,釋放的記憶體可能出現碎片化,從而導致最大的連續可用記憶體塊遠小於已分配記憶體總量。在虛擬記憶體實現後,虛擬記憶體可以映射多個不連續的物理記憶體區塊為一個連續區塊,而這種不連續分配機製得益於記憶體分頁。