也谈MMU管理机制
1,結構:
MMU存儲器系統的結構允許對存儲器系統的精細控制。大部分的控制細節由存在存儲器中的轉換表提供。這些表的入口定義了從1KB 到1MB 的各種存儲器區域的屬性。這些屬性包括: ???????? 虛擬地址到物理地址映射 ARM 處理器產生的地址叫虛擬地址,MMU 允許把這個虛擬地址映射到一個不 同的物理地址去。 這個物理地址表示了被訪問的主存儲器的位置。如果使用了快速上下文切換擴展(Fast Context Switch Extension),則在本文中的虛擬地址的意思應該是修改過的虛擬地址(Modified virtualaddress) 這種方式允許我們用很多方式管理物理存儲器的位置,例如: 用具有潛在沖突的地址映射為不同的進程分配存儲器; 允許具有不連續地址的應用把它映射到連續的地址空間。 ???????? 存儲器訪問權限(permissions) 控制對存儲器區域的不可訪問權限、只讀權限、讀寫權限。當訪問不可 訪問權限的存儲器時,會有一個存儲器異常通知ARM 處理器。 允許權限受程序運行在用戶狀態還是特權狀態影響,還和是否使用了域有關。 ???????? 高速緩存和緩沖位(Cachability and bufferability bits [C and B]) 這些在高速緩存和緩沖一節講 系統控制協處理器的寄存器允許對系統的高級控制,如轉換表的位置。他們也用來為ARM 提供內存異常的狀態信息。 查找整個轉換表的過程叫轉換表遍歷。它由硬件制動進行,并需要大量的執行時間(至少一個存儲器訪問,通常是兩個)。為了減少存儲器訪問的平均消耗,轉換表遍歷結果被高速緩存在一個或多個叫作Translation Lookaside Buffers(TLBs)的結構中。通常在ARM 的實現中每個內存接口有一個TLB。 · ?有一個存儲器接口的系統通常有一個唯一的TLB · ?指令和數據的內存接口分開的系統通常有分開的指令TLB 和數據TLB 如果系統有高速緩存, 高速緩存的數量也通常是由同樣的方法確定的。所以在高速緩存的系統中,每個高速緩存一個TLB。當存儲器中的轉換表被改變或選中了不同的轉換表(通過寫CP15 的寄存器2),先前高速緩存的轉換表遍歷結果將不再有效。MMU 結構提供了刷新TLB 的操作。MMU 結構也允許特定的轉換表遍歷結果被鎖定在一個TLB 中,這就保證了對相關的存儲器區域的訪問絕不會導致轉換表遍歷,這也對那些把指令和數據鎖定在高速緩存中的實時代碼有相同的好處。2,存儲器訪問的順序
當ARM 要訪問存儲器時,MMU 先查找TLB 中的虛擬地址表,如果ARM 的結構支持分開的地址TLB 和指令TLB,那么它用: · ?取指令使用指令TLB · ?其它的所有訪問類別用數據TLB 如果TLB 中沒有虛擬地址的入口,則轉換表遍歷硬件從存在主存儲器中的轉換表中獲取轉換和訪問權限,一旦取到,這些信息將被放在TLB 中,它會放在一個沒有使用的入口處或覆蓋一個已有的入口。關于轉換表的信息和轉換表遍歷的實現參見轉換過程一節。 一旦為存儲器訪問的TLB 的入口被拿到,這些信息將被用于: 1. C(高速緩存)和B(緩沖)位被用來控制高速緩存和寫緩沖,并決定是否高速緩存。(如果系統中沒有高速緩存和寫緩沖,則對應的位將被忽略) 2. 訪問權限和域位用來控制訪問是否被允許。如果不允許,則MMU 將向ARM 處理器發送一個存儲器異常;否則訪問將被允許進行。 訪問權限、域和異常幾節有詳細描述。 3. 對沒有高速緩存的系統(包括在沒有高速緩存系統中的所有存儲器訪問),物理地址將被用作主存儲器訪問的地址。對有高速緩存的系統,在高速緩存沒有選中的情況下,物理地址將被用行取(line fetch)的地址。如果選中了高速緩存,則物理地址將被忽略。圖3-1 說明了這種高速緩存系統2.1允許和禁止MMU
通過寫系統控制協處理器的寄存器1 的第0 位可以允許和禁止MMU。在復位后這位是0,MMU 被禁止。當MMU 被禁止時,存儲器訪問將被按如下處理: 1. 由具體的實現確定當MMU 被禁止時是否能夠允許高速緩存和寫緩沖。 · ?當MMU 被禁止時不能允許高速緩存和寫緩沖時,C 和B 位不起作用。 · ?當MMU 被禁止時能允許高速緩存和寫緩沖時: i. 訪問數據時被認為沒有高速緩存和寫緩沖(C==0,B==0) ii. 取指令時: a) 當系統只有一個唯一的TLB 時,認為是沒有高速緩存。(C==0) b) 當系統只有獨立的指令TLB 時,認為是有高速緩存。(C==1) 2. 沒有存儲器訪問權限的檢查,MMU 也不產生異常信號。 3. 物理地址與虛擬地址相同(即所謂的平坦地址映射模式)。 在允許MMU 之前,必須在內存中建立適當的轉換表,并且所有相關的CP15 寄存器要被初始化正確。 允許和禁止MMU 直接改變了虛擬地址到物理地址的映射(除非轉換表被設定為平坦地址映射模式)。所以很可能在允許MMU 時所有的高速緩存需要被刷新。另外,如果允許MMU 的指令的物理地址和虛擬地址不同,取指令將變得復雜化。所以,強烈建議允許MMU 的指令具有相同的物理地址和虛擬地址。3轉換過程
MMU 支持基于節或頁的存儲器訪問: 節(Section) 構成1MB 的存儲器塊 支持3 中不同的頁尺寸: 微頁(Tiny page) 構成1KB 的存儲器塊 小頁(Small page) 構成4KB 的存儲器塊 大頁(Large page) 構成64KB 的存儲器塊 節和大頁是支持允許只用一個TLB 入口去映射大的存儲器區間。小頁和大頁有附加的訪問控制:小頁分成1KB 的子頁,和大頁分成16KB 的子頁。微頁沒有子頁,對微頁的訪問控制是對整個頁。 存在主存儲器內的轉換表有兩個級別: 第一級表 存儲節轉換表和指向第二級表的指針。 第二級表 存儲大頁和小頁的轉換表。一種類型的第二級表存儲微頁轉換表。 MMU 把CPU 產生的虛擬地址轉換成物理地址去訪問外部存儲器,同時繼承并檢查訪問權限。地址轉換有四條路徑。路徑的選取由這個地址是被標記成節映射訪問還是頁映射訪問確定。頁映射訪問可以是大、小和微頁的訪問。 然而,轉換過程總是由下面所描述的那樣由第一級表的獲取開始。節映射的訪問只需要讀取第一級表,頁映射的訪問還需要讀取第二級表。3.1 轉換表基址
當片上(on-chip)的TLB 中不包含被要求的虛擬地址的入口時,轉換過程被啟 動。轉換表基址寄存器(CP15 的寄存器2)保存著第一級轉換表基址的物理地址。 只有bits[31:14]有效,bits[13:0]應該是零(SBZ)。所以第一級表必須在16KB 的邊界。3.2 取第一級表
轉換表基址寄存器的bits[31:14]與虛擬地址的bits[31:20]和兩個0 位連接形成32 為物理地址,如圖3-2。這個地址選擇了一個四字節的轉換表入口,它是第一級描述符或是指向第二級頁表的指針。3.3 第一級描述符
第一級表的每個入口是一個描述它所關聯的1MB 虛擬地址是如何映射的描述符。見表3-1,根據bits[1:0]的組合,有四種可能: · ?如果bits[1:0]==0b00,所關聯的地址沒有被映射,試圖訪問他們將產生一 個轉換錯(fault)。因為他們被硬件忽略,所以軟件可以利用這樣的描述 符的bits[31:2]做自己的用途。推薦為描述符繼續保持正確的訪問權限。 · ?如果bits[1:0]==0b10,這個入口是它所關聯地址的節描述符。見節描述符 和轉換節參考中的細節。 · ?如果bits[0]==1,這個入口給出粗糙第二級表(bit[1]==0),或精細第二 級表(bit[1]==1)。 每一種類型的表描述了它所關聯的1MB 存儲區域的映射。粗糙第二級表較小,每個表1KB,每個精細第二級表4KB。然而粗糙第二級表只能映射大頁和小頁,精細第二級表可以映射大頁、小頁和微頁。? 3.4 節描述符和轉換節參考 如果第一級描述符是節描述符,那么各個字段有如下的意義: Bits[1:0] 描述符類型標識(0b10 表示節描述符) Bits[3:2] 高速緩存和緩沖位 Bits[4] 由具體實現定義 Bits[8:5] 這個描述符控制的節的16 種域之一 Bits[9] 現在沒有使用,應該為零 Bits[11:10] 訪問控制,見表3-3 Bits[19:12] 現在沒有使用,應該為零 Bits[31:20] 節基址,形成物理地址的高12 位 圖3-3 表示了節轉換的完整過程。 注:--------------- 訪問權限必須在物理地址產生之前去檢查,檢查訪問權限的順序見訪問權限一節。 --------------------- 3.5 粗糙頁表描述符 如果第一級描述符是粗糙頁表描述符,那么各個字段有如下的意義: Bits[1:0] 描述符類型標識(0b01 表示粗糙頁表描述符) Bits[4:2] 由具體實現定義 Bits[8:5] 這個描述符控制的頁的16 種域之一 Bits[9] 現在沒有使用,應該為零 Bits[31:10] 頁表基地址是一個指向第二極粗糙頁表的指針, 它給出第二級表訪問的基地址。而第二級粗糙頁表必須在1KB 邊 界對齊。如果從第一級讀取到的是二級粗糙頁表描述符,那么會 象圖3-4 所示執行第二級描述符讀取。 3.6 精細頁表描述符 如果第一級描述符是精細頁表描述符,那么各個字段有如下的意義: Bits[1:0] 描述符類型標識(0b11 表示精細頁表描述符) Bits[4:2] 由具體實現定義 Bits[8:5] 這個描述符控制的頁的16 種域之一 Bits[11:9] 現在沒有使用,應該為零 Bits[31:10] 頁表基地址是一個指向第二級精細頁表的指針,它給出第二級表 訪問的基地址。而第二級精細頁表必須在4KB 邊界對齊。如果從第 一級讀取到的是二級精細頁表描述符,那么會象圖3-5 所示執行第 二級描述符讀取。
3.7 第二級描述符 每個粗糙第二級表對映著以4KB 為單位的虛擬地址范圍市怎么映射的,每個精細第二級表對映著以1KB 為單位的虛擬地址范圍市怎么映射的。那些入口是頁描述符,他們能夠分別描述大于4KB 或1KB 的頁。在這種情況下,這個描述符必須被重復足夠次,以保證這個頁始終使用相同的描述符,不論訪問這個頁中的哪個虛擬地址。對于一個第二級描述符,有四種可能,由描述符的bits[1:0]選擇。見表3-2: · ?如果bits[1:0]==0b00,說關聯的虛擬地址沒有被映射,任何對這些虛擬地 址的訪問將會導致轉換錯(fault)。軟件可以利用這樣的描述符的bits[31:2]做自己的用途,因為他們被硬件忽略。推薦為描述符繼續保持正確的訪問權限。 · ?如果bits[1:0]==0b01,這個入口是大頁描述符,描述64KB 的虛擬地址。 見轉換大頁參考。一個大頁描述符在精細第二級表中必須被重復64 次,在粗 糙第二級表中必須被重復16 次以保證所有的虛擬地址都被描述。 · ?如果bits[1:0]== 0b10,這個入口是小頁描述符,描述4KB 的虛擬地址。 見轉換小頁參考。一個小頁描述符在精細第二級表中必須被重復4 次,以保 證所有的虛擬地址都被描述。在粗糙第二級表中只有一個實例。 · ?如果bits[1:0]== 0b11,這個入口是微頁描述符,描述1KB 的虛擬地址。 見轉換微頁參考。在精細第二級表中只需要一個微頁描述符的實例。微頁描 述符不能在粗糙第二級表中出現,如果出現了,結果不可預測。
大頁描述符字段 大頁描述符的字段有如下意義: bits[1:0] 表示描述符的類型 bits[3:2] 高速緩促和緩沖位 bits[11:4] 訪問權限位。這些為控制對頁的訪問。關于這些位的解釋見表3-3。 大頁被分成4 各子頁。 AP0 編碼對第一個子頁的訪問權限。 AP1 編碼對第二個子頁的訪問權限。 AP2 編碼對第三個子頁的訪問權限。 AP3 編碼對第四個子頁的訪問權限。 bits[15:12] 現在沒有使用,應該為零。 bits[31:16] 用來形成物理地址的對應位。 小頁描述符字段 小頁描述符的字段有如下意義: bits[1:0] 表示描述符的類型 bits[3:2] 高速緩促和緩沖位 bits[11:4] 訪問權限位。這些為控制對頁的訪問。關于這些位的解釋見表3-3。 小頁被分成4 各子頁。 AP0 編碼對第一個子頁的訪問權限。 AP1 編碼對第二個子頁的訪問權限。 AP2 編碼對第三個子頁的訪問權限。 AP3 編碼對第四個子頁的訪問權限。 bits[31:12] 用來形成物理地址的對應位。 微頁描述符字段 微頁描述符的字段有如下意義: bits[1:0] 表示描述符的類型 bits[3:2] 高速緩促和緩沖位 bits[5:4] 訪問權限位。這些為控制對頁的訪問。關于這些位的解釋見表3-3 關于微頁的解釋。 bits[9:6] 現在沒有使用,應該為零。 bits[31:10] 用來形成物理地址的對應位。 3.8 轉換大頁參考 圖3-6 顯示了在粗糙第二級表中轉換一個64KB 的大頁的完整順序。在精細第二級表中的轉換順序頁相似,只是第二級描述符的地址如精細頁表描述符一節所決定。 注:----------------------------- 頁索引的高4 位和第二級表的低階4 位重疊,在粗糙頁表中大頁的每個頁表入口必須被重復16 次。在精細頁表中大頁的每個頁表入口必須被重復64 次。
----------------------------------- 3.9 轉換小頁參考 圖3-7 顯示了在粗糙第二級表中轉換一個4KB 的小頁的完整順序。在精細第二級表中的轉換順序頁相似,只是第二級描述符的地址如精細頁表描述符一節所決定。 注:----------------------------- 當小頁出現在精細第二級表中時,頁索引的高2 位和第二級表的低階2 位重疊,在精細頁表中小頁的每個頁表入口必須被重復4 次。 -----------------------------------
3.10 轉換微頁索引 圖3-8 顯示了在精細第二級表中轉換1KB 微頁的完整過程。 注:--------------------------- 微頁不能出現在粗糙第二級表中。 ---------------------------------
4域
域是節、大頁和小頁的集合。ARM 結構支持16 個域。對域的訪問由域訪問控制寄存器的兩個位字段控制。因為每個字段對訪問對應的域的使能非常迅速,所以整個存儲器區間能很快地交換進出虛擬存儲器。這里支持2 種域訪問方式: 客戶域的用戶(執行程序,訪問數據),被形成這個域的節或頁來監督訪問權限。 管理者控制域的行為(域中的當前節和頁,對域的訪問),不被形成這個域的節或頁來監督訪問權限。 一個程序可以是一些域的客戶,也是另外一些域的管理者,同時沒有對其它域的訪問權限。這允許對程序訪問不同存儲器資源的非常靈活的存儲器保護。表3-4 說明了域訪問控制寄存器的位編碼方式。 5 CP15 寄存器 MMU 由系統控制寄存器的2、3、4、5、6、8、10 號寄存器和1 號寄存器的一些位控制。 5.1 對協處理器寄存器的操作 ARM寄存器到協處理器的數據傳誦指令和反向傳送指令分別為MCR和MRC u?????? MCR MCR指令將ARM處理器的寄存器中的數據傳送到協處理器的寄存器中。若協處理器不能成功執行該操作,將產生未定義指令異常中斷。指令格式如下: MCR{cond} coproc,opcode1,Rd,CRn,CRm{,opcode2} 其中 coproc 指令操作的協處理器的名稱,標準名為pn,n為0~15,這里為p15 opcode1 協處理器的特定操作碼 Rd????? 做源的ARM處理器寄存器 CRn???? 存放第一個操作數的協處理器寄存器 CRm???? 存放第二個操作數的協處理器寄存器 opcode2 可選的協處理器操作碼 指令舉例如下: MCR p6,2,R7,c1,c2 MCR p7,0,R1,c3,c2,1 u?????? MRC MRC指令將協處理器的寄存器中的數據傳送到ARM理器的寄存器中。若協處理器不能成功執行該操作,將產生未定義指令異常中斷。指令格式如下: MRC{cond} coproc,opcode1,Rd,CRn,CRm{,opcode2} 其中 coproc 指令操作的協處理器的名稱,標準名為pn,n為0~15,這里為p15 opcode1 協處理器的特定操作碼 Rd????? 做目標的ARM處理器寄存器 CRn???? 存放第一個操作數的協處理器寄存器 CRm???? 存放第二個操作數的協處理器寄存器 opcode2 可選的協處理器操作碼 指令舉例如下: MRC p6,2,R7,c1,c2 MCR p7,0,R1,c3,c2,1 5.2 寄存器1 的MMU 控制位 寄存器1 的如下這些位用來控制MMU: M(bit[0]) 使能MMU 0 = 禁止MMU 1 = 允許MMU 在沒有MMU 和保護單元的系統上,這個位應該讀出為0,并忽略寫。 A(bit[1]) 使能對齊錯檢查 0 = 禁止 1 = 允許 S(bit[8]) 這是系統保護位,見3-4 節。 R(bit[9]) 這是ROM 保護位,見3-4 節。 5.3 寄存器2:轉換表基地址 讀CP15 寄存器2 時,在bits[31:14]返回當前活動的第一級轉換表的物理地址,bits[13:0]不確定。讀CP15 寄存器2 時,CRm 和操作數2 被忽略,并應該是0。寫CP15 寄存器2 時,在bits[31:14]更新當前活動的第一級轉換表的物理地址,bits[13:0]應該寫0 或先前讀回的值。寫CP15 寄存器2 時,CRm 和操作數2 被忽 略,并應該是0。 5.4 寄存器3:域訪問控制
讀CP15 寄存器3 時,返回域訪問控制寄存器的值。CRm 和操作數2 被忽略,并應該是0。寫CP15 寄存器3 時,更新域訪問控制寄存器的值。CRm 和操作數2 被忽略,并應該是0。 域訪問控制寄存器包含16 個2 位的字段,它定義了對應域的訪問權限。見3-5 節。 5.5 寄存器4:保留 讀寫CP15 寄存器4 不可預料結果。 5.6 寄存器5:錯誤狀態 FSR 讀CP15 寄存器5 時,返回FSR 寄存器的值。FSR 包含最近一次數據錯的信息。只有低9 位有效,高23 位不確定。FSR 指出異常發生時的域和試圖訪問的類型。 bit[8] 返回0 bit[7:4] 指出錯位發生時訪問的域 bit[3:0] 試圖訪問的類型,這些位的編碼見表3-5 FSR 在數據錯時更新。由具體實現確定取指令異常是否更新FSR。見3.6.2 節的 “錯誤地址寄存器(FAR)和錯誤狀態寄存器(FSR)”。CRm 和操作數2 被忽略,并應 該是0。寫FSR 將把FSR 設定成寫的值。這對于程序調試器非常有用,可以用來恢復FSR 的值。高24 位應該寫0 或上次讀到的值。CRm 和操作數2 被忽略,并應該是0。 5.7 寄存器6:錯誤地址 FAR
讀CP15 寄存器6 返回FAR 的值。FAR 保存著錯誤產生時訪問的虛擬地址。在數據錯時更新FAR。由具體實現確定取指令異常是否更新FSR。見3.6.2 節的“錯誤地 址寄存器(FAR)和錯誤狀態寄存器(FSR)”。CRm 和操作數2 被忽略,并應該是0。寫FSR 將把FAR 設定成寫的值。這對于程序調試器非常有用,可以用來恢復FAR 的 值。高24 位應該寫0 或上次讀到的值。CRm 和操作數2 被忽略,并應該是0。 ---注------ 如果使用了第六章描述的快速上下文切換擴展(FCSE),那么: · ?當存儲器錯更新FAR 時,寫入FAR 的是修改的虛擬地址。 · ?當用MRC 指令讀或用MCR 指令寫FAR 時,它的值被當作數據對待,所以沒有由FCSE 產生的地址修改。 ------------ 5.8 寄存器8:TLB 功能 當CP15 的寄存器8 用來控制TLB 時是只讀寄存器。表3-6 顯示了定義的TLB 功能和在MCR 指令中用的CRm 和第二個朝操作數<opcode2>的值。使用沒有在表中的 CRm 和opcode2 的組合將導致不可預料的結果。 如果下面的任何操作被用在單一TLB 的實現中,則在單一TLB 中實現相同的功能: · ?無效的指令TLB (Invalidate instruction TLB) · ?無效的指令單一入口 (Invalidate instruction single entry) · ?無效的整個數據TLB (Invalidate entire data TLB) · ?無效的數據單一入口 (Invalidate data single entry) 否則,如果執行一個與特定實現不相關的功能,會導致不確定的結果。試圖用MRC 指令讀CP15 寄存器8 的結果不確定。當只有很少量的存儲器被重新映射時,無效的單一入口操作能被用來在一些實現中改善性能。對每個被重新映射的存儲器區域(節、小頁或大頁),無效的單一入口需要在存儲器區域的虛擬地址上執行。性能的改善來源于不用重新裝載與沒有被重新映射的存儲器區域相關的TLB 入口。 ---注------ 無效的單一入口操作的性能改善并不被保證。具體實現可以是單一請求入口無效,直到使整個TLB 無效。 ----------- ---小心------ 當存儲器被重新映射時必須使與舊的映射相關的TLB 入口無效。如果不這樣,可能會進入兩個TLB 入口覆蓋虛擬地址范圍的狀態。在最好的情況下訪問這樣的覆蓋虛擬地址范圍會有不可預料的結果;在某些實現中甚至會物理損壞MMU。強烈建議在重新映射存儲器時要加倍小心使TLB 適當地失效。 ------------
---注------ 如果使用了第六章描述的快速上下文切換擴展(FCSE),那么表3-6 中的一些功 能傳遞給CP15 的虛擬地址被當作數據。這意味著對它們來說沒有由FCSE 產生 的地址修改。 ------------ 5.9 寄存器10:TLB 鎖定 轉換表遍歷的執行需要一定的時間,特別當訪問慢速的主存儲器時。在實時中斷處理程序中,當TLB 不包含中斷處理程序的轉換和/或要訪問的數據時,中斷延遲回大量加長。 TLB 鎖定是一些ARM 存儲器系統的特性,它允許把特定的轉換表遍歷的結果裝載到TLB 中。這種方式不會被后來的轉換表遍歷的結果覆蓋。由CP15 寄存器10 設定。設 W=LOG2(TLB 入口數),如果需要的話取整(round-up),則CP15 寄存器10 的格式為:
如果具體的實現有分開的指令和數據TLB,那么有2 個不同的寄存器,由訪問寄存器10 的MCR 或MRC 指令中的opcode2 字段選擇: opcode2 == 0 選擇數據TLB 鎖定寄存器 opcode2 == 1 選擇指令TLB 鎖定寄存器 如果具體的實現只有唯一的TLB,那么只有1 個寄存器,opcode2 字段應該為0。訪問寄存器10 的MCR 或MRC 指令中的CRm 總應該為0。 寫寄存器10 有如下結果: victim 字段表示下次TLB 失敗(miss)時,轉換表遍歷的結果替代哪個TLB 入口。Base 字段包含TLB 替換的策略,只使用從(base)到(TLB 入口-1)的TLB 入口, victim 應該在這個區間。 轉換表遍歷的結果在寫到TLB 入口時,若P==1 則它被保護起來,不能被寄存器8的使整個TLB 失效操作影響;若P==0 則會被那些操作給失效掉。 ---注------ 如果TLB 的入口不是2 的N 次方,那么寫到大于或等于TLB 入口數的TLB 入口的base 或victim 的值將不確定。 ----------- 讀寄存器10 將返回它的值。 TLB 鎖定過程 通常鎖定N 個TLB 入口的過程如下: 1. 禁止中斷等,來保證當這個過程執行時不會產生異常 2. 如果一個指令TLB 或唯一TLB 被鎖定,用base==N、index==N 和P==0 寫到適當版本的寄存器10。如果可能,把另指令預取很難理解的分枝預測功能關掉。 3. 使要被鎖定的整個TLB 失效。 4. 如果是指令TLB 鎖定,要確保剩下的鎖定過程所要預取的指令相關的TLB 入口都被裝載。(要注意鎖定是從哪里開始的,通常可能一個TLB 入口包含所有這些。這時TLB 被失效后的第一條指令能完成這個功能)如果是數據TLB 鎖定,要確保剩下的鎖定過程所要訪問數據的相關的TLB 入口都被裝載。這包含被代碼用到的嵌入文字(inline literals)(通常最好避免在鎖定過程中使用嵌入文字,并把所有的數據放在由一個TLB 入口所包含的區域,然后從那里加載一個數據)如果一個唯一TLB 被鎖定,執行以上所有的過程。 5. i 從0 到N-1 循環 a. 用base==i、index==i 和P==1 寫到寄存器10。 b. 強迫被鎖定到TLB 入口i 處的轉換表遍歷結果的存儲器區域發生轉換表遍歷: * 如果是數據TLB 或唯一TLB 被鎖定,從那個區域加載一個數據 * 如果是指令TLB 被鎖定,用B5-15 頁所描述的指令預取高速緩沖寄存器7 來在那個區域產生指令預取。 6. 用base==N、index==N 和P==0 寫到寄存器10。 ---注------ 如果你使用FCSE,要注意第5b 步,因為: · ?如果是數據TLB 鎖定或唯一TLB 鎖定,加載數據指令的地址是會被FCSE 修改的。 · ?如果是指令TLB 鎖定,用在寄存器7 的地址被當作數據,所以不會被FCSE 修改。 為了減少混淆,建議鎖定過程應該是: · ?從禁止FCSE 開始(設置PID 為0) · ?把適當的PID 值OR 到使用的虛擬地址的高7 位來自己產生修改的虛擬地址。 ----------- TLB 解鎖過程 用上面的過程解鎖被鎖定的TLB 部分: 1. 用寄存器8 的操作使每個被鎖定的單一入口失效 2. 用base==0、index==0 和P==0 寫到寄存器10。 ---注------ 第一步是為了保證P==1 的入口在TLB 中不在被剩下。如故它們被剩在TLB 中,后續的TLB 鎖定過程中使整個TLB 失效(第三步)將不會有預期的結果。 ----------- 參考文獻: 宛城布衣《ARM常見指令集合》 無名氏??? 〈ARM Architecture Reference Manual〉部分中譯
總結
- 上一篇: 第5节 三个败家子(5)——刘封,被封印
- 下一篇: Win2003下Exchange2003