MMU存储管理
?嵌入式系統中,存儲系統差別很大,可包含多種類型的存儲器件,如FLASH,SRAM,SDRAM,ROM等,這些不同類型的存儲器件速度和寬度等各不相同;在訪問存儲單元時,可能采取平板式的地址映射機制對其操作,或需要使用虛擬地址對其進行讀寫;系統中,需引入存儲保護機制,增強系統的安全性。為適應如此復雜的存儲體系要求,ARM處理器中引入了存儲管理單元來管理存儲系統。
一.內存管理單元(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可以控制地址空間的訪問權限,從而保護這些代碼不被破壞。
二.MMU地址映射的實現
MMU的實現過程,實際上就是一個查表映射的過程。建立頁表(translate table)是實現MMU功能不可缺少的一步。頁表是位于系統的內存中,頁表的每一項對應于一個虛擬地址到物理地址的映射。每一項的長度即是一個字的長度(在ARM中,一個字的長度被定義為4字節)。頁表項除完成虛擬地址到物理地址的映射功能之外,還定義了訪問權限和緩沖特性等。
1、映射存儲塊的分類
MMU 支持基于節或頁的存儲器訪問,MMU可以用下面四種大小進行映射:
節(Section) 構成1MB 的存儲器塊
支持3 中不同的頁尺寸:
微頁(Tiny page) 構成1KB 的存儲器塊
小頁(Small page) 構成4KB 的存儲器塊
大頁(Large page) 構成64KB 的存儲器塊
其中對于節映射使用一級轉換表就可以了,而對于微頁、小頁、大頁則需要使用兩級轉換表。
存在主存儲器內的轉換表有兩個級別:
2、第一級轉換表
(注:本文中的頁表與轉換表同義)
存儲節轉換表和指向第二級表的指針。
注: 上圖中粗糙頁表欄中的最后一項應為‘01’
第一級表的每個入口是一個描述它所關聯的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。然而粗糙第二級表只能映射大頁和小頁,精細第二級表可以映射大頁、小頁和微頁。
節描述符和轉換節參考
l???????? 如果第一級描述符是節描述符,那么各個字段有如下的意義:
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 位
文章出處:http://www.diybl.com/course/6_system/linux/Linuxjs/2008611/124749.html
總結
- 上一篇: VxWorks中信号量实现任务间通信与同
- 下一篇: Vxworks信号量分析