MMU和cache理解和摘要


一直想寫一篇關於MMU和cache的文章,但是又不敢隨意下筆,畢竟感覺對這個東西理解不夠透徹,最近剛好遇到兩個關於這方面的問題,決定還是先把網上的一些介紹和自己的理解整理一篇博文。

 

1.1 MMU

1.1.1 名詞解釋

PGDPage Global Directory):全局頁表

PUDPage Upper Directory):頂層頁表,一般嵌入式系統沒有。

PMDPage Middle Directory):中間層頁表,一般嵌入式系統沒有。

PTEPage Table Entry):頁表

TLBTranslation Lookaside Buffers): 即轉換快表,又簡稱快表,可以理解為MMU內部專用的存放頁表的cache,保存着最近使用的PTE

1.1.2 映射方式

32bitLinux采用三級映射:PGD-->PMD-->PTE64bitLinux采用四級映射:PGD-->PUD-->PMD-->PTE,多了個PUD。在ARM32 Linux采用兩層映射,省略了PMD,除非在定義了CONFIG_ARM_LPAE才會使用3級映射。在ARM32架構中,可以按段(section)來映射,這是采用單層映射模式。使用頁面映射需要兩層映射結構,頁面可以是64KB4KB大小。

如下圖所示,如果采用頁表映射的方式,段映射表就變成一級映射表(Linux中稱為PGD),其頁表項提供的不再是物理地址,而是二級頁表的基地址。32位虛擬地址的高12(bit[31:20])作為訪問一級頁表的索引值,找到相應的表項,每個表項指向一個二級頁表。

以虛擬地址的次8(bit[19:12])作為訪問二級頁表的索引值,得到相應的頁表項,從這個頁表項中找到20位的物理頁面地址。最后將這20位物理頁面地址和虛擬地址的低12位拼湊在一起,得到最終的32位物理地址。這個過程在ARM32架構中由MMU硬件完成,軟件不需要接入。

 

 

 

1.1.3 CPU訪問內存時的硬件操作順序

各步驟在圖中有對應的標號:

 

 

 

1 CPU內核(圖中的ARM)發出VA請求讀數據,TLB(translation lookaside buffer)接收到該地址,那為什么是TLB先接收到該地址呢?因為TLB是MMU中的一塊高速緩存(也是一種cache,是CPU內核和物理內存之間的cache),它緩存最近查找過的VA對應的頁表項,如果TLB里緩存了當前VA的頁表項就不必做translation table walk了,否則就去物理內存中讀出頁表項保存在TLB中,TLB緩存可以減少訪問物理內存的次數。

2 頁表項中不僅保存着物理頁面的基地址,還保存着權限和是否允許cache的標志MMU首先檢查權限位,如果沒有訪問權限,就引發一個異常給CPU內核。然后檢查是否允許cache,如果允許cache就啟動cache和CPU內核互操作。

3 如果不允許cache,那直接發出PA從物理內存中讀取數據到CPU內核。

4 如果允許cache,則以VA為索引到cache中查找是否緩存了要讀取的數據

,如果cache中已經緩存了該數據(稱為cache hit)則直接返回給CPU內核,如果cache中沒有緩存該數據(稱為cache miss),則發出PA從物理內存中讀取數據並緩存到cache中,同時返回給CPU內核。但是cache並不是只去CPU內核所需要的數據,而是把相鄰的數據都去上來緩存,這稱為一個cache line。ARM920T的cache line是32個字節,例如CPU內核要讀取地址0x30000134~0x3000137的4個字節數據,cache會把地址0x30000120~0x3000137(對齊到32字節地址邊界)的32字節都取上來緩存。

5.      ARM920T支持多種尺寸規格的頁表

ARM體系結構最多使用兩級頁表來進行轉換,頁表由一個個條目組成,每個條目存儲一段虛擬地址對應的物理地址及訪問權限,或者下一級頁表的地址。S3C2443最多會用到兩級頁表,已段(section,大小為1M)的方式進行轉換時只用到一級頁表,以頁(page)的方式進行轉換時用到兩級頁表。而頁的大小有3種:大頁(large pages,64KB),小頁(small pages,4KB)和極小頁(tiny pages,1KB)。條目也成為描述符,有段描述符、大頁描述符、小頁描述符和極小頁描述符,分別保存段、大頁、小頁和極小頁的起始物理地址。

 

1.1.4 頁表項結構

 

 

上圖就是頁目錄項和頁表項的格式。可以看出,由於頁表或者頁的物理地址都是4KB對齊的(低12位全是零),所以上圖中只保留了物理基地址的高20位(bit[31:12])。低12位可以安排其他用途。

 

P】:存在位。為1表示頁表或者頁位於內存中。否則,表示不在內存中,必須先予以創建或者從磁盤調入內存后方可使用。

R/W】:讀寫標志。為1表示頁面可以被讀寫,為0表示只讀。當處理器運行在0、1、2特權級時,此位不起作用。頁目錄中的這個位對其所映射的所有頁面起作用。

U/S】:用戶/超級用戶標志。為1時,允許所有特權級別的程序訪問;為0時,僅允許特權級為0、1、2的程序訪問。頁目錄中的這個位對其所映射的所有頁面起作用。

PWT】:Page級的Write-Through標志位。為1時使用Write-Through的Cache類型;為0時使用Write-Back的Cache類型。當CR0.CD=1時(Cache被Disable掉),此標志被忽略。對於我們的實驗,此位清零。

PCD】:Page級的Cache Disable標志位。為1時,物理頁面是不能被Cache的;為0時允許Cache。當CR0.CD=1時,此標志被忽略。

A】:訪問位。該位由處理器固件設置,用來指示此表項所指向的頁是否已被訪問(讀或寫),一旦置位,處理器從不清這個標志位。這個位可以被操作系統用來監視頁的使用頻率。

D】:臟位。該位由處理器固件設置,用來指示此表項所指向的頁是否寫過數據。

PS】:Page Size位。為0時,頁的大小是4KB;為1時,頁的大小是4MB(for normal 32-bit addressing )或者2MB(if extended physical addressing is enabled).

G】:全局位。如果頁是全局的,那么它將在高速緩存中一直保存。當CR4.PGE=1時,可以設置此位為1,指示Page是全局Page,在CR3被更新時,TLB內的全局Page不會被刷新。

AVL】:被處理器忽略,軟件可以使用。

 

 

參考博文:

(54條消息) MMU和cache詳解(TLB機制)_Keep Fighting!-CSDN博客

Linux內存管理 (2)頁表的映射過程 - ArnoldLu - 博客園 (cnblogs.com)

頁目錄項和頁表項 - 山城炮灰 - 博客園 (cnblogs.com)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM