參考部落格:與程式設計師相關的CPU快取知識
MMU:memory management unit,稱為記憶體管理單元,或者是儲存器管理單元,MMU是硬體裝置,它被儲存在主存(main memory)的兩級也表控制,並且是由協處理器CP15的暫存器1的M位來決定是enabled還是disabled。MMU的主要作用是負責從CPU核心發出的虛擬地址到實體地址的對映,並提供硬體機制的記憶體訪問許可權檢查。MMU使得每個使用者程序擁有自己的地址空間(對於WINCE5.0,每個程序是32MB;而對於WINCE6.0,每個程序的獨佔的虛擬空間是2GB),並透過記憶體訪問許可權的檢查保護每個程序所用的記憶體不被其他程序破壞。
mmu features:
基礎概念:
VA:virtual address稱為虛擬地址,PA:physical address稱為實體地址。CPU透過地址來訪問記憶體中的單元,如果CPU沒有MMU,或者有MMU但沒有啟動,那麼CPU核心在取指令或者訪問記憶體時發出的地址(此時必須是實體地址,假如是虛擬地址,那麼當前的動作無效)將直接傳到CPU晶片的外部地址引腳上,直接被記憶體晶片(實體記憶體)接收,這時候的地址就是實體地址。如果CPU啟用了MMU(一般是在bootloader中的eboot階段的進入main()函式的時候啟用),CPU核心發出的地址將被MMU截獲,這時候從CPU到MMU的地址稱為虛擬地址,而MMU將這個VA翻譯成為PA發到CPU晶片的外部地址引腳上,也就是將VA對映到PA中。MMU將VA對映到PA是以頁(page)為單位的,對於32位的CPU,通常一頁為4k,實體記憶體中的一個物理頁面稱頁為一個頁框(page frame)。虛擬地址空間劃分成稱為頁(page)的單位,而相應的實體地址空間也被進行劃分,單位是頁框(frame).頁和頁框的大小必須相同。
CPU訪問記憶體時的硬體操作順序:
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位元組都取上來快取。
cache的由來:
cpu訪問速度和記憶體速度嚴重不匹配,由此引出了cache的概念,即快取記憶體區。快取記憶體區的速率跟cpu訪問相匹配。
經典cache架構VIPT(Virtually Indexed, Physically Tagge)快取結構與訪存方式:
CPU發出的地址是虛擬地址,CPU訪問記憶體會把該地址傳送給TLB和cache,TLB是MMU的一塊小緩衝區,用來存放虛擬地址和實體地址的對映關係。處理器會使用EPN(Effective Page Number),kernel會維護一個頁表,將虛擬地址的EPN對映到實體記憶體中的頁框號。這個對映關係由kernel進行管理和維護。經過TLB,如果有對應的RPN(real page number),則會出現TLB命中,如果TLB未命中,那麼則需要訪問MMU了。CPU發出的虛擬地址在cache中查詢時,如果要訪問的資料或者指令在cache中已經存在了,這種情況則成為cache hit,在快取命中的情況下,CPU可以直接從快取中獲取所需要的資料,而無需訪問更慢的主存。相反,如果訪問的資料或指令不在cache中,需要從主存中載入到cache中,這種情況被稱為cache miss,cache miss會導致額外的訪問延遲。
除了上述說明的VIPT,還有VIVT,PIPT等等cache架構方式
cache內部結構圖:
快取記憶體行:快取記憶體中最小的訪問單元
tag:儲存在cache中的記憶體地址的一部分,用於標識與此行資料關聯的主記憶體地址。64位地址中的top bits來告訴cache這個資料來自主記憶體的位置,稱為tag。雖然total cache size表示cache可以儲存的總的資料量,但是用於儲存tag的RAM沒有包含在total cache size中。而且tag會佔用cache的物理空間
cache line:如果每個cache中的主記憶體地址都對應一個tag,光儲存tag就會佔用很大空間,效率十分低下,因此,cache中通常用一個tag記錄主存中的連續字塊,cache中的這個邏輯塊通常被稱為cache line,代表快取中最小的可載入單元。cache line包含快取資料或指令時稱為valid,不包含快取資料或指令時稱為invalid。與cache line關聯的是一個或多個狀態位。通常,有一個valid bit來標識此cache line包含可使用的資料,這意味著地址標籤代表一些實際值。在dcache中,還可能有一個或多個dirty bits,用於標記cache line(或其中一部分)是否包含與主記憶體內容不同(更新)的資料。
index:索引是記憶體地址的一部分,用於確定在哪個cache line中找到地址。index用作cache RAMs的地址,不需要作為tag的一部分進行儲存。後面將更詳細地介紹這一點。
way/set:way是cache的一個細分,每個way大小相同,索引方式相同。set由所有ways中index相同的cache lines組成
這意味著地址底部的幾個位(稱為偏移量)不需要儲存在tag中。你需要整行的地址,而不是該行中的每個位元組的地址,因此五個或六個最低位始終為0