本節首先從總體上介紹mmu、cache和cpu核是如何協同工作的,後面兩節分別講解mmu和cache的細節。三星公司的s3c2410是一種很常見的採用arm920t的晶元,涉及到具體的晶元時我們以s3c2410為例。
arm920t的mmu和cache都整合在cp15協處理器中,mmu和cache的聯絡非常密切,以下是cp15協處理器的暫存器列表(摘自[s3c2410使用者手冊]),和cpu核的r0到r15暫存器一樣,協處理器暫存器也是用0到15來編號,在指令中用4個bit來表示暫存器編號,有些協處理器暫存器有影子暫存器,這種情況下對同乙個編號的暫存器使用不同的選項讀或者寫實際上訪問的是不同的暫存器,後文用到某個暫存器時會詳細說明它的功能。
表 1. cp15協處理器的暫存器列表
對cp15協處理器的操作使用mcr和mrc兩條協處理器指令,這兩條指令的記法是從後往前看:mcr是把r(cpu核暫存器)中的資料傳送到c(協處理器暫存器)中,mrc則是把c(協處理器暫存器)中的資料傳送到r(cpu核暫存器)中。對cp15協處理器的所有操作都是通過cpu核暫存器和cp15暫存器之間交換資料來完成的。下圖是協處理器的指令格式(摘自[s3c2410使用者手冊])。
圖 1. 協處理器指令格式
和其它arm指令一樣,cond是條件碼,bit 20是l位,表示該指令是讀還是寫,如果l=1就表示load,從外面讀到cpu核中,也就是mrc指令,如果l=0就表示store,也就是mcr指令。[11:8]這四個位是協處理器編號,cp15的編號是15,因此是4個1。crn是cp15暫存器編號,rd是cpu核暫存器編號,各佔4個位。對於cp15協處理器,規定opcode1應該為0,opcode2和crm是指令的選項,具體含義取決於不同的暫存器。
雖然這裡介紹了協處理器的暫存器編號和相關指令,但讀者只需了解對協處理器是這樣進行操作的就可以了,我們的重點是講解mmu和cache的基本概念,具體各種操作的指令該怎麼寫可以參考[s3c2410使用者手冊]。
mmu是如何把va對映成pa的呢?好像是有一張va轉pa的表,給乙個va查表就可以查到pa,實際上並不是這麼簡單,通常要有乙個多級的查表過程,對於arm體系結構是兩級查表,對於一些64位體系結構則需要更多級。看下面的圖示。
圖 2. translation table walk
首先將32位的va[3]分成三段,前兩段[31:20]和[19:12]作為兩次查表的索引,第三段[11:0]作為頁內的偏移。查表的步驟如下:
1 cp15協處理器的ttb暫存器(看看表 1「cp15協處理器的暫存器列表」中這是第幾個暫存器?)中儲存著第一級頁表(translation table)的基位址,這個基位址指的是pa,也就是說頁表是直接按這個位址存在物理記憶體中的。
2以ttb中的內容為基位址,以va[31:20]為索引在表中查出一項(想一下這個表中一共有多少項?),這個表項中儲存著第二級頁表(coarse page table)的基位址,同樣是實體地址,也就是說第二級頁表也是直接按這個位址存在物理記憶體中的。
3以va[19:12]為索引在第二級頁表中查出一項(想一下這個表中一共有多少項?),這個表項中就儲存著物理頁面的基位址,先前我們說虛擬記憶體管理是以頁為單位的,乙個虛擬記憶體的頁對映到乙個物理記憶體的頁框,從這裡就可以得到印證,因為查表是以頁為單位來查的。
這個過程稱為translation table walk,walk這個詞用得非常形象。從ttb走到一級頁表,又走到二級頁表,又走到物理頁面,一次定址其實是三次訪問物理記憶體。注意這個「走」的過程完全是硬體做的,每次cpu定址時mmu就自動完成以上四步,不需要編寫指令指示mmu去做,前提是作業系統要維護頁表項的正確性,每次分配記憶體時填寫相應的頁表項,每次釋放記憶體時清除相應的頁表項,在必要的時候分配或釋放整個頁表。
有了以上基本概念,我們來看cpu訪問記憶體時的硬體操作順序(摘自[arm參考手冊])。
圖 3 cpu訪問記憶體時的硬體操作順序
我們以cpu讀記憶體為例解釋一下圖中的步驟,各步驟在圖中有對應的標號。
1 cpu核(圖中的「arm」框)發出va請求讀資料,tlb(translation lookaside buffer)接收到該位址。tlb是mmu中的一塊快取記憶體(也是一種cache),它快取最近查詢過的va對應的頁表項,如果tlb裡快取了當前va的頁表項就不必做translation table walk了,否則去物理記憶體中讀出頁表項儲存在tlb中,tlb快取可以減少訪問物理記憶體的次數。
2頁表項中不僅儲存著物理頁面的基位址,還儲存著許可權位和是否允許cache的標誌。mmu首先檢查許可權位,如果沒有訪問許可權,就引發乙個異常給cpu核。然後檢查是否允許cache,如果允許cache就啟用cache和cpu核互操作,圖中的「c, b bits」可以理解為選通線,後面再詳細解釋這兩個位的作用。
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核要讀取位址0x134-0x137的4位元組資料,cache會把位址0x120-0x13f(對齊到32位元組位址邊界)的32位元組都取上來快取。
ARM處理器之MMU和Cache
本節首先從總體上介紹mmu cache和cpu核是如何協同工作的,後面兩節分別講解mmu和cache的細節。三星公司的s3c2410是一種很常見的採用arm920t的晶元,涉及到具體的晶元時我們以s3c2410為例。arm920t的mmu和cache都整合在cp15協處理器中,mmu和cache的聯...
arm處理器模式和arm處理器狀態的區別
arm處理器狀態 arm微處理器的工作狀態一般有兩種,並可在兩種狀態之間切換 第一種為arm狀態,此時處理器執行32位的字對齊的arm指令 第二種為thumb狀態,此時處理器執行16位的 半字對齊的thumb指令。在程式的執行過程中,微處理器可以隨時在兩種工作狀態之間切換,並且,處理器工作狀態的轉變...
RISC CISC 和 ARM處理器
risc riduced instruction set computer 精簡指令集計算機 cisc complex instruction set computer 複雜指令集計算機 所謂 體系結構 是指程式設計師在某cpu上進行程式設計時能夠使用的處理器資源,其中最重要的是處理器所提供的指令系...