arm-linux學習-(MMU內存管理單元)
什么是MMU
MMU(Memory Management Unit)主要用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬件機制的內存訪問授權、多任務多進程操作系統。(來自百度百科,對其幾個點不熟悉,因此可以只考慮加粗部分)
發展歷史
注意:學習一個知識點,很重要的一步是了解其為什么而存在?它的存在是為了解決什么問題?然后,在學習的過程中帶着這些問題去理解、去思考。
在許多年以前,還是使用DOS或一些古老的操作系統時,內存很小,同時,應用程序也很小,將程序存儲在內存中基本能夠滿足需要。隨着科技的發展,圖形界面及一些其他更復雜的應用出現,內存已經無法存儲這些應用程序了,通常的解決辦法是將程序分割成很多個覆蓋塊,覆蓋塊0最先運行,運行結束之后,就調用另一個覆蓋塊,雖然這些操作由OS來完成,但是,需要程序員對程序進行分割,這非常不高效;因此,人們想出了一個虛擬存儲器(virtual memory)的方法。虛擬存儲器的基本思想是:程序、數據、堆棧的總大小可以超過內存空間的大小,操作系統將當前運行的部分保存在內存中,未使用的部分保存在磁盤中。比如一個16MB的程序和一個內存只有4MB的機器,操作系統通過選擇可以決定哪部分4MB的程序內容保存在內存中,並在需要時,在內存與磁盤中交換程序代碼,這樣16MB的代碼就可以運行在4MB的機器中了。注意:這里面包含了虛擬地址和物理地址的概念
相關概念
地址范圍、虛擬地址映射成物理地址以及分頁機制
- 地址范圍: 指處理器能夠產生的地址集合,如一個32bit的處理器ARM9,其能產生的地址集合是0x0000 0000 ~ 0xffff ffff(4G),這個地址范圍也稱為虛擬地址空間,其中對應的地址為虛擬地址。
- 虛擬地址與物理地址: 與虛擬地址空間和虛擬地址相對應的是物理地址空間和物理地址;物理地址空間只是虛擬地址空間的一個子集。如一台內存為256MB的32bit X86主機,其虛擬地址空間是0 ~ 0xffffffff(4GB),物理地址空間范圍是0 ~ 0x0fff ffff(256M)
- 分頁機制:
-
如果處理器沒有MMU,或者有MMU但沒有啟用,CPU執行單元發出的內存地址將直接傳到芯片引腳上,被內存芯片(以下稱為物理內存,以便與虛擬內存區分)接收,這稱為物理地址(Physical Address,以下簡稱PA),如下圖3-1-1所示;
圖3-1-1 未使用MMU.png
如果處理器啟用了MMU,CPU執行單元發出的內存地址將被MMU截獲,從CPU到MMU的地址稱為虛擬地址(Virtual Address,以下簡稱VA),而MMU將這個地址翻譯成另一個地址發到CPU芯片的外部地址引腳上,也就是將VA映射成PA,,如下圖3-1-2。
圖3-1-2 使用了MMU.png -
大多數使用MMU的機器都采用分頁機制。虛擬地址空間以頁為單位進行划分,而相應的物理地址空間也被划分,其使用的單位稱為頁幀,頁幀和頁必須保持相同,因為內存與外部存儲器之間的傳輸是以頁為單位進行傳輸的。例如,MMU可以通過一個映射項將VA的一頁0xb70010000xb7001fff映射到PA的一頁0x20000x2fff,如果CPU執行單元要訪問虛擬地址0xb7001008,則實際訪問到的物理地址是0x2008。
-
虛擬內存的哪個頁面映射到物理內存的哪個頁幀是通過頁表(Page Table)來描述的,頁表保存在物理內存中,MMU會查找頁表來確定一個VA應該映射到什么PA。
功能
執行過程
操作系統和MMU是這樣配合的:
-
操作系統在初始化或分配、釋放內存時會執行一些指令在物理內存中填寫頁表,然后用指令設置MMU,告訴MMU頁表在物理內存中的什么位置。
-
設置好之后,CPU每次執行訪問內存的指令都會自動引發MMU做查表和地址轉換操作,地址轉換操作由硬件自動完成,不需要用指令控制MMU去做。
重要:我們在程序中使用的變量和函數都有各自的地址,在程序被編譯后,這些地址就成了指令中的地址,指令中的地址就成了CPU執行單元發出的內存地址,所以在啟用MMU的情況下, 程序中使用的地址均是虛擬內存地址,都會引發MMU進行查表和地址轉換操作。(注意理解這句話)
內存保護機制
處理器一般有用戶模式(User Mode)和特權模式(privileged Mode)之分。操作系統可以在頁表中設置每個頁表訪問權限,有些頁表不可以訪問,有些頁表只能在特權模式下訪問,有些頁表在用戶模式和特權模式下都可以訪問,同時,訪問權限又分為可讀、可寫和可執行三種。這樣設定之后,當CPU要訪問一個VA(Virtual Address)時,MMU會檢查CPU當前處於用戶模式還是特權模式,訪問內存的目的是讀數據、寫數據還是取指令執行,如果與操作系統設定的權限相符,則允許訪問,把VA轉換成PA,否則不允許執行,產生異常(Exception)。
異常與中斷:異常與中斷的處理機制類似,不同的是中斷由外部設備產生,而 異常由CPU內部產生的;中斷產生與CPU當前執行的指令無關,而異常是由於當前執行的指令出現問題導致的
通常操作系統會將虛擬地址空間划分為用戶空間和內核空間。例如x86平台的linux系統的虛擬地址空間范圍是0x0000 0000 ~ 0xffff ffff,前3G的空間為用戶空間,后1G的空間為內核空間。用戶程序加載到用戶空間,內核程序加載到內核空間,用戶程序不能訪問內核中的數據,也不能跳轉到內核空間執行。這樣可以保護內核,如果一個進程訪問了非法地址,頂多就是這個進程崩潰,而不會影響到內核和系統的穩定性。在系統發生中斷或異常時,不僅會跳轉到中斷或異常服務函數中執行,而且還會從用戶模式切換到特權模式,從中斷或異常服務程序跳轉到內核代碼中執行。總結一下:在正常情況下處理器在用戶模式執行用戶程序,在中斷或異常情況下處理器切換到特權模式執行內核程序,處理完中斷或異常之后再返回用戶模式繼續執行用戶程序。
段錯誤我們已經遇到過很多次了,它是這樣產生的:
- 用戶程序要訪問的一個VA,經MMU檢查無權訪問。
- MMU產生一個異常,CPU從用戶模式切換到特權模式,跳轉到內核代碼中執行異常服務程序。
- 內核把這個異常解釋為段錯誤,把引發異常的進程終止掉。
S3C2440/S3C2410 中的MMU
S3C2440/S3C2410 MMU概述
-
S3C2440的MMU使用頁表來實現虛擬地址到物理地址的轉換;頁表存儲在內存中,頁表中的每一行對應於虛擬存儲空間的一個頁,該行包含了該虛擬內存頁對應的物理內存頁的地址、該頁的方位權限和該頁的緩沖特性等。這里頁表中的每一行稱為一個地址變換條目(entry)也稱為“描述符”。描述符有:段描述符、大頁描述符、小頁描述符、極小頁描述符——他們保存段、大頁、小頁或極小頁的起始物理地址;粗頁表描述符、細頁表描述符——它們保存二級頁表的物理地址。
-
頁表的存儲:頁表存放在內存中,系統通常有一個寄存器來保存頁表的基地址。在ARM中系統控制協處理器CP15的寄存器C2用來保存頁表的基地址。
-
TLB:因為從虛擬地址到物理地址的變換過程是通過查詢頁表完成的,而頁表又存儲在內存中,如果每次程序執行時去讀取內存中的數據獲取物理地址,代價很大。而程序在執行過程中可能只對頁表中的少數幾個單元進行訪問,根據這一特點,采用一個容量更小(通常為8~16個字)、訪問速度和CPU中通用寄存器相當的存儲器件來存放當前訪問需要的地址變換條目。這個小容量的頁表稱為TLB(Translation Lookaside buffer)。
-
S3C2440/S3C2410中的頁表
在S32440/S3C2410中最多會使用兩級頁表:以段(Section 1MB)的方式進行轉換時只用到一級頁表,以頁(Page)的方式進行轉換時用到二級頁表。 -
CPU訪問內存的過程:
a . 當CPU需要訪問內存時,先在TLB中查詢需要的地址變換條目。如果該條目不存在,CPU從位於內存中的頁表中查詢,並把相應的結果添加到TLB中。這樣,當CPU下一次又需要該地址變換條目時,可以從TLB中直接得到,從而使地址變換的速度大大加快。
b. 當內存中的頁表內容改變,或者通過修改系統控制協處理器CP15的寄存器C2使用新的頁表時,TLB中的內容需要全部清除。系統控制協處理器CP15的寄存器C8用來控制清除TLB內容的相關操作。
c. MMU可以將某些地址變換條目鎖定在TLB中,從而使得獲取該地址變換條目的速度保持很快。在CP15中的C10用於控制TLB內容的鎖定。
d. MMU 可以將整個存儲空間分為最多16個域,每個域對應一定的內存區域,該區域具有相同的訪問控制屬性。MMU中寄存器C3用於控制與域相關的屬性的配置。
e. 當存儲訪問失效時,MMU提供了相應的機制用於處理這種情況。在MMU中寄存器C5和寄存器C6用於支持這些機制。
禁止/使能MMU時應注意的問題(重要)
應注意如下幾點:
- 在使能MMU之前,要在內存中建立頁表,同時,CP15中的各相關寄存器必須完成初始化。
- 如果使用的不是平板存儲模式(物理地址和虛擬地址相等),在禁止/使能MMU時,虛擬地址和物理地址的對應關系會發生改變,這時應該清除cache中的當前地址變換條目。
S3C2440/S3C2410中的MMU地址變換
ARM CPU上的地址轉換過程涉及3個概念:虛擬地址(VA)、變換后的虛擬地址(MVA, modified virtrual address)、物理地址(PA)。
沒啟動MMU時,CPU核、cache、MMU、外設等所有部件使用的都是物理地址。
啟動MMU后,CPU核對外發出虛擬地址VA;VA被轉換為MVA供cache、MMU使用,在這里MVA被轉換為PA,最后使用PA讀寫實際設備。
ARM支持的存儲塊大小有以下幾種:
- 段(section):是大小為1M的存儲塊。
- 大頁(Large Pages):是大小為64KB的存儲塊。
- 小頁(Small Pages):是大小為4KB的存儲塊。
- 極小頁(Tiny Pages):是大小為1KB的存儲塊。
通過配置訪問控制機制,還可以將大頁分成大小為16KB的子頁;將小頁分成大小為1KB的子頁;極小頁不能再細分,只能以1KB大小的整頁為單位。
MMU中的域
MMU中的域指的是一些段、大頁或者小頁的集合。ARM支持最多16個域,每個域的訪問控制特性由CP15中的寄存器C3中的兩位來控制,CP15中的寄存器C3的格式如下所示:

其中每兩位控制一個域的訪問控制特性,其編碼及對應的含義如下所示:

作者:放風箏的小小馬
鏈接:https://www.jianshu.com/p/abb4b5aeb83b
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
MMU內存管理單元介紹
前言
本篇文章簡要闡述MMU的概念,以及以段地址的轉換過程為例,簡單說明MMU將虛擬地址轉換成物理地址的過程。更多詳細內容請查看《ARM-MMU(中文手冊).pdf》。
1、MMU概述
在ARM存儲系統中,使用MMU實現虛擬地址到實際物理地址的映射。為何要實現這種映射?
首先就要從一個嵌入式系統的基本構成和運行方式着手。系統上電時,處理器的程序指針從0x0(或者是由0Xffff_0000處高端啟動)處啟動,順序執行程序,在程序指針(PC)啟動地址,屬於非易失性存儲器空間范圍,如ROM、FLASH等。然而與上百兆的嵌入式處理器相比,FLASH、ROM等存儲器響應速度慢,已成為提高系統性能的一個瓶頸。而SDRAM具有很高的響應速度,為何不使用SDRAM來執行程序呢?為了提高系統整體速度,可以這樣設想,利用FLASH、ROM對系統進行配置,把真正的應用程序下載到SDRAM中運行,這樣就可以提高系統的性能。然而這種想法又遇到了另外一個問題,當ARM處理器響應異常事件時,程序指針將要跳轉到一個確定的位置,假設發生了IRQ中斷,PC將指向0x18(如果為高端啟動,則相應指向0vxffff_0018處),而此時0x18處仍為非易失性存儲器所占據的位置,則程序的執行還是有一部分要在FLASH或者ROM中來執行的。那么我們可不可以使程序完全都SDRAM中運行那?答案是肯定的,這就引入了MMU,利用MMU,可把SDRAM的地址完全映射到0x0起始的一片連續地址空間,而把原來占據這片空間的FLASH或者ROM映射到其它不相沖突的存儲空間位置。例如,FLASH的地址從0x0000_0000-0x00ff_ffff,而SDRAM的地址范圍是0x3000_0000-0x31ff_ffff,則可把SDRAM地址映射為0x0000_0000-0x1fff_ffff而FLASH的地址可以映射到0x9000_0000-0x90ff_ffff(此處地址空間為空閑,未被占用)。映射完成后,如果處理器發生異常,假設依然為IRQ中斷,PC指針指向0x18處的地址,而這個時候PC實際上是從位於物理地址的0x3000_0018處讀取指令。通過MMU的映射,則可實現程序完全運行在SDRAM之中。
在實際的應用中,可能會把兩片不連續的物理地址空間分配給SDRAM。而在操作系統中,習慣於把SDRAM的空間連續起來,方便內存管理,且應用程序申請大塊的內存時,操作系統內核也可方便地分配。通過MMU可實現不連續的物理地址空間映射為連續的虛擬地址空間。
操作系統內核或者一些比較關鍵的代碼,一般是不希望被用戶應用程序所訪問的。通過MMU可以控制地址空間的訪問權限,從而保護這些代碼不被破壞。
2、MMU地址映射的實現
MMU的實現過程,實際上就是一個查表映射的過程。建立頁表(translate table)是實現MMU功能不可缺少的一步。頁表是位於系統的內存中,頁表的每一項對應於一個虛擬地址到物理地址的映射。每一項的長度即是一個字的長度(在ARM中,一個字的長度被定義為4字節)。頁表項除完成虛擬地址到物理地址的映射功能之外,還定義了訪問權限和緩沖特性等。
2.1 映射存儲塊的分類
MMU 支持基於節或頁的存儲器訪問, MMU 可以用下面四種大小進行映射:
節 ( Section ) 構成 1MB 的存儲器塊。
微頁 ( Tiny page ) 構成 1KB 的存儲器塊。
小頁 ( Small page ) 構成 4KB 的存儲器塊。
大頁 ( Large page ) 構成 64KB 的存儲器塊。
其中對於節映射使用一級轉換表就可以了,而對於微頁、小頁、大頁則需要使用兩級轉換表。
2.2 轉換過程
要知道虛擬內存機制必須了解ARM9中的3種地址:VA(虛地址),MVA(修正后虛地址),PA(物理地址)
1)VA,是程序中的邏輯地址,0x00000000~0xFFFFFFFF。
2)MVA,是修改后的虛擬地址。在ARM9里面,如果VA<32M,利用進程標識號PID轉換得到MVA。過程如下:
if(VA < 32M) MVA = VA | ( PID<<25 ) else MVA = VA
- 1
- 2
- 3
- 4
只是上面的過程是由硬件實現的。這樣為VA進行了一級映射,為什么呢?在linux系統里,每個進程的地址空間0-4G,0-3G是進程獨有的,稱為用戶空間,3G-4G是系統的,稱為內核空間,所有進程共享。如果兩個進程所用的VA有重疊,在切換進程時,為了把重疊的VA映射到不同的PA上,需要重建頁表、使無效caches和TLBS。使用了MVA,使進程在VA相同的情況下,使用不同的MVA,進而PA也不同。這就是在VA與PA之間加上一次到MVA的映射的意義。
3)PA,物理地址,MVA通過MMU轉換后的地址。
一級頁表使用 4096 個描述符來表示 4GB 空間,每個描述符對應 1MB 的虛擬地址,存儲它對應的 1MB 物理空間的起始地址,或者存儲下一級頁表的地址。每個描述符占 4 個字節,格式如下:
使用 MVA[31:20]來索引一級頁表(20-31 一共 12 位,2^12=4096,所以是4096 個描述符)。其中段地址的轉換流程如下圖所示:
①頁表基址寄存器位[31:14]和 MVA[31:20]組成一個低兩位為 0 的 32 位地址, MMU 利用這個地址找到段描述符。
②取出段描述符的位[31:20](段基址,section base address),它和 MVA[19:0]組成一個 32 位的物理地址(這就是 MVA 對應的 PA)
2.3 TLB
從MVA 到 PA 的轉換需要訪問多次內存,大大降低了 CPU 的性能,有沒有辦法改進呢?
程序執行過程中,用到的指令和數據的地址往往集中在一個很小的范圍內,其中的地址、數據經常使用,這是程序訪問的局部性。由此,通過使用一個高速、容量相對較小的存儲器來存儲近期用到的頁表條目(段、大頁、小頁、極小頁描述符),避免每次地址轉換都到主存中查找,這樣就大幅提高性能。這個存儲器用來幫助快速地進行地址轉換,成為轉譯查找緩存(Translation Lookaside Buffers, TLB)。
當 CPU 發出一個虛擬地址時,MMU 首先訪問 TLB。如果 TLB 中含有能轉換這個虛擬地址的描述符,則直接利用此描述符進行地址轉換和權限檢查,否則 MMU 訪問頁表找到描述符后再進行地址轉換和權限檢查,並將這個描述符填入TLB 中,下次再使用這個虛擬地址時就直接使用 TLB 用的描述符。
若轉換成功,則稱為”命中”。Linux 系統中,目前的”命中”率高達 90%以上,使分頁機制帶來的性能損失降低到了可接收的程度。若在 TLB 中進行查表轉換失敗,則退縮為一般的地址變換,概率小於 10%。
內存管理單元MMU簡介
現代操作系統及CPU硬件中,都會提供內存管理單元(memory management unit,MMU)來進行內存的有效管理。內存管理算法有許多,從簡單的裸機方法到分頁和分段策略。各種算法都有其優缺點,為特定系統選擇內存管理算法依賴於很多因素,特別是系統的硬件設計。
1 內存管理的目的
內存管理的目的是為了更好的使用內存(似乎是廢話-,-)。 內存是現代操作系統運行的中心。操作系統中任何一個進程的運行都需要內存,但是,操作系統中的內存是有限的;另一方面,從安全的角度出發,進程都需要有自 己的內存空間,其他的進程都不能訪問這個私有的空間;同時,內存的分配會導致內存碎片問題,嚴重影響計算機的性能。以上這三個問題就是一般內存管理算法所 需要處理的目標。
- 交換
- 內存保護
- 碎片問題
2 交換
進程需要在內存中執行,但進程可以暫時從內存中交換(swap)出去到備份存儲上,當需要時再調回到內存中去。
在基於優先級的交換調度算法中,如果一個更高優先級的進程來了且需要服務,內存管理可以交換出低優先級的進程,以便裝入和執行更高優先級的進程。當高優先級的進程執行完畢之后,低優先級的進程可以交換回內存繼續執行。這種交換有時被稱之為滾出(roll out)、滾進(roll in)。
通常一個交換出的進程需要交換回它原來的內存空間。這一限制是由地址捆綁方式決定的。如果捆綁是在匯編時或加載時決定的,那么就不可以移動到不同的位置。如果捆綁是在運行時決定,由於物理地址是在運行時才確定,那么進程可以移到不同的地址空間。
交換的代價:交換時間
交換時間主要是指轉移時間,總的轉移時間和所交換的內存空間成正比。交換不需要或只需要很少的磁頭移動,簡單的說,交換空間通常作為磁盤的一整塊,且獨立於文件系統(如Linux的swap空間),因此使用就有可能很快。
交換需要花很多時間,而且進程執行時間卻很少,故交換通常不執行,但只有在許多進程運行且內存吃緊時,交換才開始啟動。
3 分頁
3.1內存保護和內存碎片的背景
內存保護是指操作系統進程不受用戶進程的影響,保護用戶進程不受其他用戶進程的影響。內存保護最基本的思路是進程使用邏輯地址空間,而內存管理單元所看的是物理地址。操作系統將邏輯地址分配給進程,MMU負責邏輯地址到物理地址的映射(轉換,捆綁)。
值得注意的是對於指令(程序)和數據映射到內存地址可以在以下步驟地任意一步執行:
- 編譯時:如果編譯時就知道進程將在內存中的駐留地址,那么就可以生成絕對代碼。如MS-DOS的COM格式程序。
- 加載時:如果編譯時不知道程序將駐留在何處,那么編譯器就必須要生成可重定位代碼(relocatable code )。這種情況下,最后地址映射會延遲到加載時才確定,如果開始地址發生變換,必須重新加載程序,以引入新值。
- 執行時:如果進程在執行時可以從一個內存段移到另一個內存段,那么映射必須延遲到執行時才進程。采用這種方法需要硬件的支持,目前絕大多數操作系統采用這種方法(基於分頁、分段等)。
內存碎片是操作系統內存分配的產物。最初操作系統的內存是連續分配的,即進程A需要某一大小的內存空間,如200KB,操作系統就需要找出一塊至少200KB的連續內存空間給進程A。隨着系統的運行,進程終止時它將釋放內存,該內存可以被操作系統分配給輸入隊列里的其他等待內存資源的進程。
可以想象,隨着進程內存的分配和釋放,最初的一大塊連續內存空間被分成許多小片段,即使總的可用空間足夠,但不再連續,因此產生的內存碎片。
一 個辦法是不再對內存空間進行連續分配。這樣只要有物理內存就可以為進程進行分配。而實際上,不進行連續分配只是相對的,因為完全這樣做的代價太大。現實 中,往往定出一個最小的內存單元,內存分配是這最小單元的組合,單元內的地址是連續的,但各個單元不一定連續。這樣的內存小單元有頁和段。
當然,分段和分頁也會產生碎片,但理論上每個碎片的大小不超過內存單元的大小。
3.2 分頁
分頁時一種內存管理方案,同時也提供了內存保護機制。它允許分配的物理內存地址可以是非連續的。
邏輯內存分為大小相等塊的組合,這個塊稱之為頁;物理內存則分為固定大小的幀(frame)。頁大小應和幀大小相同,這是由硬件決定的。通常是2的冪,這樣可以方便地將邏輯地址映射到物理地址。
基於分頁的邏輯地址到物理地址的映射
考慮32位地址。如果頁大小是4KB,則需要12位來表示每一頁中的某個具體地址,因此32位的邏輯地址中需要12位來對某一頁中的具體地址尋址。這12位叫做頁偏移。剩下的20位可以作為頁碼,可以有1M的頁。邏輯地址可以表示為:
尋址時,根據頁碼P查頁表,找到該頁對應的幀,將幀號與頁偏移(也是幀偏移)組合即得到物理地址。這樣也說明了為什么頁大小要等於幀大小,因為頁數要等於幀數。
例如,頁大小為4K,頁碼11對應的幀碼是10,即表示是第10塊物理幀,也偏移為5,則邏輯地址0X0000b 005對應的物理地址是0X0000a 005。
3.3 分頁的內存保護
基於分頁的操作系統在分配內存時分給進程所需要的頁數,其對應物理內存的幀號同時裝入該MMU的頁表。同時頁表上有一個標記為,指明該頁是屬於哪個進程的。甚至可以定義該頁對於某個進程的讀寫權限。非法的讀寫操作會產生硬件陷阱(或內存保護沖突)。
3.4 分頁的代價
由上一節可知分頁是基於查找表的,而在內存中存儲這個1M個項目的頁表本身就帶來了內存消耗和查找速度問題。於是,頁表通常需要硬件的支持,即將頁表寫在硬件MMU的寄存器中。
如果頁表比較小,那么頁表寫在寄存器中可以加快查找速度。但絕大多數當代的計算機頁表都非常大。對於這些頁表,采用快速寄存器來實現頁表就不太合理了。
一種辦法是使用 TLB(translation look-aside buffer)。TLB是關聯的寄存器,TLB條目由兩部分組成:頁號和幀號。
TLB只包含頁表中的一小部分條目,整個頁表還是保存在內存中。當CPU產生邏輯地址后,其頁號提交給TLB。如果找到了頁號,那同時也就找到了幀號,就可以訪問物理內存;如果頁號不在TLB中(稱為TLB失效),那就需要訪問頁表。在頁表中找到幀號后,把頁號和幀號增加到TLB中,這樣下次再用時可以很快找到。如果TLB中條目已滿,則操作系統會根據一個替換策略來替換條目。替換策略有很多,從最近最小使用替換到隨機替換等。另外,有的TLB允許某些條目不被替換,如內核代碼的條目。
有的TLB還在條目中保存地址空間保護標志符,用來唯一標志進程,以提供進程內存保護。
3.5 頁表結構
對於32位以及64位邏輯地址的計算機來說,其頁表實在太過龐大。為了壓縮頁表,一個簡單的方法是使用層次化分頁算法,就是將頁表再分頁。(這實際上是一種索引的方法)


即將2^20個頁表項分為2^10個組,每個組里面有2^10項。這樣只需要2K*4=8K的頁表空間,且查找速度也有很大提升。例如原先最壞情況下要查2^20次,現在最壞只要2*2^10次
內存管理單元MMU(memory management unit)
內存管理單元MMU(memory management unit)的主要功能是虛擬地址(virtual memory addresses)到物理地址(physical addresses)的轉換。除此之外,它還可以實現內存保護(memory protection)、緩存控制(cache control)、總線仲裁(bus arbitration)以及存儲體切換(bank switching)。
工作機制
CPU將要請求的虛擬地址傳給MMU,然后MMU先在高速緩存TLB(Translation Lookaside Buffer)查找轉換關系,如果找到了相應的物理地址則直接訪問;如果找不到則在地址轉換表(Translation Table)里查找計算。
虛擬地址
現代的內存管理單元是以頁的方式來分區虛擬地址空間(the range of addresses used by the processor)的。頁的大小是2的n次方,通常為幾KB。所以虛擬地址就被分為了兩個部分:virtual page number和offset。
頁表項(page table entry)
上面從虛擬頁號在頁表里找到的存放物理頁表號的條目就是頁表項(PTE)。PTE一般占1個字長,里面不僅包含了physical page number,還包含了重寫標志位(dirty bit)、訪問控制位(accessed bit)、允許讀寫的進程類型(user/supervisor mode)、是否可以被cached以及映射類型(PTE最后兩位)。
映射
-
映射方式
映射方式有兩種,段映射和頁映射。段映射只用到一級頁表,頁映射用到一級頁表和二級頁表。
-
映射粒度
段映射的映射粒度有兩種,1M section和16M supersection;頁映射的映射粒度有4K small page、64K large page和過時的1K tiny page。