ARM中MMU的作用

來源:互聯網
上載者:User
⑴.MMU的使用
MMU是儲存空間嵌入式管理單元的縮寫,是用來管理虛擬記憶體系統的器件。 MMU通常是CPU的一部分,本身有少量儲存空間存放從虛擬位址到物理地址的匹配表。此表稱作TLB(轉換旁置緩衝區)。所有資料請求都送往MMU,由 MMU決定資料是在RAM內還是在大量存放區裝置內。如果資料不在儲存空間內,MMU將產生分頁錯誤中斷。
MMU的兩個主要功能是:
1. 將虛地址轉換成物理地址。
2. 控制儲存空間存取允許。MMU關掉時,虛地址直接輸出到物理地址匯流排。
在實踐中,使用MMU解決了如下幾個問題:
①使用DRAM作為大量存放區時,如果DRAM的物理地址不連續,這將給程式的編寫調試造成極大不便,而適當配置MMU可將其轉換成虛擬位址連續的空間。
②ARM核心的中斷向量表要求放在0地址,對於ROM在0地址的情況,無法調試中斷服務程式,所以在調試階段有必要將可讀寫的儲存空間空間映射到0地址。
③系統的某些位址區段是不允許被訪問的,否則會產生不可預料的後果,為了避免這類錯誤,可以通過MMU匹配表的設定將這些位址區段設為使用者不可存取類型。
啟動程式中產生的匹配表中包含地址映射,儲存頁大小(1M,64K,或4K)以及是否允許存取等資訊。
例如:目標板上的16兆DRAM的物理地址區間為0xc000,0000~0xc07f,ffff;0xc100,0000~0xc17f,ffff;16兆ROM的虛擬位址區間為:0x0000,0000~0x00ff,ffff。匹配表配置如下:
可以看到左邊是連續的虛擬位址空間,右邊是不連續的物理地址空間,而且將DRAM映射到了0地址區間。 MMU通過虛擬位址和頁面表位置資訊,按照轉換邏輯獲得對應物理地址,輸出到地址匯流排上。
應注意到的是使能MMU後,程式繼續運行,但是對於程式員來說程式計數器的指標已經改變,指向了ROM所對應的虛擬位址。
這樣就可以理解為什麼ARM7-TDMI只能運行uc/OS-II之類的作業系統。含有uc/OS-II作業系統和使用者自己的應用程式,整個就是一個應用(一個進程),有ADS一起編譯和連結。個人覺得uc/OS-II所說的任務理解為線程更合適。

MMU的作用有兩個
MMU的作用有兩個:地址翻譯和地址保護 軟體的職責是配置頁表,硬體的職責是根據頁表完成地址翻譯和保護工作。 那三個函數是用來訪問頁表的。如果cpu沒有硬體MMU那麼這張表將毫無意義。 你必須從cpu的角度去理解記憶體映射這個概念。記憶體映射不是調用一個函數,然後讀取傳回值。而是cpu通過MMU把一條指令中要訪問的地址轉換為物理地址,然後發送到匯流排上的過程。 有本書叫做understand linux kernel,耐心看,那本書寫的非常好。

 MMU是Memory Management Unit的縮寫,中文名是記憶體管理單元,它是中央處理器(CPU)中用來管理虛擬儲存空間、實體儲存體器的控制線路,同時也負責虛擬位址映射為物理地址,以及提供硬體機制的記憶體訪問授權。
  一、MMU的曆史
  許多年以前,當人們還在使用DOS或是更古老的作業系統的時候,電腦的記憶體還非常小,一般都是以K為單位進行計算,相應的,當時的程式規模也不大,所以記憶體容量雖然小,但還是可以容納當時的程式。但隨著圖形介面的興起還用使用者需求的不斷增大,應用程式的規模也隨之膨脹起來,終於一個難題出現在程式員的面前,那就是應用程式太大以至於記憶體容納不下該程式,通常解決的辦法是把程式分割成許多稱為覆蓋塊(overlay)的片段。覆蓋塊0首先運行,結束時他將調用另一個覆蓋塊。雖然覆蓋塊的交換是由OS完成的,但是必須先由程式員把程式先進行分割,這是一個費時費力的工作,而且相當枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了一個辦法,這就是虛擬儲存空間(virtual memory).虛擬儲存空間的基本思想是程式,資料,堆棧的總的大小可以超過實體儲存體器的大小,作業系統把當前使用的部分保留在記憶體中,而把其他未被使用的部分儲存在磁碟上。比如對一個16MB的程式和一個記憶體只有4MB的機器,作業系統通過選擇,可以決定各個時刻將哪4M的內容保留在記憶體中,並在需要時在記憶體和磁碟間交換程式片段,這樣就可以把這個16M的程式運行在一個只具有4M記憶體機器上了。而這個16M的程式在運行前不必由程式員進行分割。
  二、MMU的相關概念——位址範圍、虛擬位址映射為物理地址 以及 分頁機制
  任何時候,電腦上都存在一個程式能夠產生的地址集合,我們稱之為位址範圍。這個範圍的大小由CPU的位元決定,例如一個32位的CPU,它的位址範圍是0~0xFFFFFFFF (4G),而對於一個64位的CPU,它的位址範圍為0~0xFFFFFFFFFFFFFFFF (64T).這個範圍就是我們的程式能夠產生的位址範圍,我們把這個位址範圍稱為虛擬位址空間,該空間中的某一個地址我們稱之為虛擬位址。與虛擬位址空間和虛擬位址相對應的則是物理地址空間和物理地址,大多數時候我們的系統所具備的物理地址空間只是虛擬位址空間的一個子集。這裡舉一個最簡單的例子直觀地說明這兩者,對於一台記憶體為256M的32bit x86主機來說,它的虛擬位址空間範圍是0~0xFFFFFFFF(4G),而物理地址空間範圍是0x000000000~0x0FFFFFFF(256M)。
  在沒有使用虛擬儲存空間的機器上,虛擬位址被直接送到記憶體匯流排上,使具有相同地址的實體儲存體器被讀寫;而在使用了虛擬儲存空間的情況下,虛擬位址不是被直接送到記憶體位址匯流排上,而是送到儲存空間嵌入式管理單元MMU,把虛擬位址映射為物理地址。
  大多數使用虛擬儲存空間的系統都使用一種稱為分頁(paging)機制。虛擬位址空間劃分成稱為頁(page)的單位,而相應的物理地址空間也被進行劃分,單位是頁楨(frame).頁和頁楨的大小必須相同。在這個例子中我們有一台可以產生32位地址的機器,它的虛擬位址範圍從0~0xFFFFFFFF(4G),而這台機器只有256M的物理地址,因此他可以運行4G的程式,但該程式不能一次性調入記憶體運行。這台機器必須有一個達到可以存放4G程式的外部儲存空間(例如磁碟或是FLASH),以保證程式片段在需要時可以被調用。在這個例子中,頁的大小為4K,頁楨大小與頁相同——這點是必須保證的,因為記憶體和外圍儲存空間之間的傳輸總是以頁為單位的。對應4G的虛擬位址和256M的實體儲存體器,他們分別包含了1M個頁和64K個頁楨。
  三、MMU的功能
  1、將虛擬位址映射為物理地址
  現代的多使用者多進程作業系統,需要MMU, 才能達到每個使用者進程都擁有自己獨立的地址空間的目標。使用MMU, 作業系統劃分出一段地址地區, 在這塊地址地區中, 每個進程看到的內容都不一定一樣。例如MICROSOFT WINDOWS作業系統將位址範圍4M-2G劃分為使用者地址空間,進程A在地址0X400000(4M)映射了可執行檔,進程B同樣在地址0X400000(4M)映射了可執行檔,如果A進程讀地址0X400000, 讀到的是A的可執行檔映射到RAM的內容,而進程B讀取地址0X400000時,則讀到的是B的可執行檔映射到RAM的內容。
  這就是MMU在當中進行地址轉換所起的作用。
  2、提供硬體機制的記憶體訪問授權
  多年以來,微處理器一直帶有片上儲存空間嵌入式管理單元(MMU),MMU能使單個軟體線程工作於硬體保護地址空間。但是在許多商用即時作業系統中,即使系統中含有這些硬體也沒採用MMU。
  當應用程式的所有線程共用同一儲存空間空間時,任何一個線程將有意或無意地破壞其它線程的代碼、資料或堆棧。異常線程甚至可能破壞核心代碼或內部資料結構。例如線程中的指標錯誤就能輕易使整個系統崩潰,或至少導致系統工作異常。
  就安全性和可靠性而言,基於進程的即時作業系統(RTOS)的效能更為優越。為產生具有單獨地址空間的進程,RTOS只需要產生一些基於RAM的資料結構並使MMU加強對這些資料結構的保護。基本思路是在每個關聯轉換中“接入”一組新的邏輯地址。MMU利用當前映射,將在指令調用或資料讀寫過程中使用的邏輯地址映射為儲存空間物理地址。MMU還標記對非法邏輯地址進行的訪問,這些非法邏輯地址並沒有映射到任何物理地址。
  這些進程雖然增加了利用查詢表訪問儲存空間所固有的系統開銷,但其實現的效益很高。在進程邊界處,疏忽或錯誤操作將不會出現,使用者介面線程中的缺陷並不會導致其它更關鍵線程的代碼或資料遭到破壞。目前在可靠性和安全性要求很高的複雜嵌入式系統中,仍然存在采無儲存空間保護的作業系統的情況,這實在有些不可思議。
  採用MMU還有利於選擇性地將頁面映射或解映射到邏輯地址空間。實體儲存體器頁面映射至邏輯空間,以保持當前進程的代碼,其餘頁面則用於資料對應。類似地,實體儲存體器頁面通過映射可保持進程的線程堆棧。RTOS可以在每個線程堆棧解映射之後,很容易地保留邏輯地址所對應的頁面內容。這樣,如果任何線程分配的堆棧發生溢出,將產生硬體儲存空間保護故障,核心將掛起該線程,而不使其破壞位於該地址空間中的其它重要儲存空間區,如另一線程堆棧。這不僅線上程之間,還在同一地址空間之間增加了儲存空間保護。
  儲存空間保護(包括這類堆疊溢位檢測)在應用程式開發中通常非常有效。採用了儲存空間保護,程式錯誤將產生異常並能被立即檢測,它由原始碼進行跟蹤。如果沒有儲存空間保護,程式錯誤將導致一些細微的難以跟蹤的故障。實際上,由於在扁平儲存空間模型中,RAM通常位於物理地址的零頁面,因此甚至NULL指標引用的解除都無法檢測到。
  四、MMU和CPU
  1、X86系列的MMU
  INTEL出品的80386CPU或者更新的CPU中都整合有MMU. 可以提供32BIT共4G的地址空間.
  X86 MMU提供的定址模式有4K/2M/4M的PAGE模式(根據不同的CPU,提供不同的能力), 此處提供的是目前大部分作業系統使用的4K分頁機制的描述,並且不提供ACCESS CHECK的部分。
  涉及的寄存器
  a) GDT
  b) LDT
  c) CR0
  d) CR3
  e) SEGMENT REGISTER
  虛擬位址到物理地址的轉換步驟
  a) SEGMENT REGISTER作為GDT或者LDT的INDEX, 取出對應的GDT/LDT ENTRY.
  注意: SEGMENT是無法取消的, 即使是FLAT模式下也是如此. 說FLAT模式下不使用SEGMENT REGISTER是錯誤的. 任意的RAM定址指令中均有DEFAULT的SEGMENT假定. 除非使用SEGMENT OVERRIDE PREFIX來改變當前定址指令的SEGMENT, 否則使用的就是DEFAULT SEGMENT.
  ENTRY格式
  typedef struct
  {
  UINT16 limit_0_15;
  UINT16 base_0_15;
  UINT8 base_16_23;
  UINT8 accessed : 1;
  UINT8 readable : 1;
  UINT8 conforming : 1;
  UINT8 code_data : 1;
  UINT8 app_system : 1;
  UINT8 dpl : 2;
  UINT8 present : 1;
  UINT8 limit_16_19 : 4;
  UINT8 unused : 1;
  UINT8 always_0 : 1;
  UINT8 seg_16_32 : 1;
  UINT8 granularity : 1;
  UINT8 base_24_31;
  } CODE_SEG_DESCRIPTOR,*PCODE_SEG_DESCRIPTOR;
  typedef struct
  {
  UINT16 limit_0_15;
  UINT16 base_0_15;
  UINT8 base_16_23;
  UINT8 accessed : 1;
  UINT8 writeable : 1;
  UINT8 expanddown : 1;
  UINT8 code_data : 1;
  UINT8 app_system : 1;
  UINT8 dpl : 2;
  UINT8 present : 1;
  UINT8 limit_16_19 : 4;
  UINT8 unused : 1;
  UINT8 always_0 : 1;
  UINT8 seg_16_32 : 1;
  UINT8 granularity : 1;
  UINT8 base_24_31;
  } DATA_SEG_DESCRIPTOR,*PDATA_SEG_DESCRIPTOR;
  共有4種ENTRY格式, 此處提供的是CODE SEGMENT和DATA SEGMENT的ENTRY格式. FLAT模式下的ENTRY在base_0_15, base_16_23處為0, 而limit_0_15, limit_16_19處為0xfffff. granularity處為1. 表名SEGMENT地址空間是從0到0XFFFFFFFF的4G的地址空間.
  b) 從SEGMENT處取出BASE ADDRESS 和LIMIT. 將要訪問的ADDRESS首先進行ACCESS CHECK, 是否超出SEGMENT的限制.
  c) 將要訪問的ADDRESS+BASE ADDRESS, 形成需要32BIT訪問的虛擬位址. 該地址被解釋成如下格式:
  typedef struct
  {
  UINT32 offset :12;
  UINT32 page_index :10;
  UINT32 pdbr_index :10;
  } VA,*LPVA;
  d) pdbr_index作為CR3的INDEX, 獲得到一個如下定義的資料結構
  typedef struct
  {
  UINT8 present :1;
  UINT8 writable :1;
  UINT8 supervisor :1;
  UINT8 writethrough:1;
  UINT8 cachedisable:1;
  UINT8 accessed :1;
  UINT8 reserved1 :1;
  UINT8 pagesize :1;
  UINT8 ignoreed :1;
  UINT8 avl :3;
  UINT8 ptadr_12_15 :4;
  UINT16 ptadr_16_31;
  }PDE,*LPPDE;
  e) 從中取出PAGE TABLE的地址. 並且使用page_index作為INDEX, 得到如下資料結構
  typedef struct
  {
  UINT8 present :1;
  UINT8 writable :1;
  UINT8 supervisor :1;
  UINT8 writethrough:1;
  UINT8 cachedisable:1;
  UINT8 accessed :1;
  UINT8 dirty :1;
  UINT8 pta :1;
  UINT8 global :1;
  UINT8 avl :3;
  UINT8 ptadr_12_15 :4;
  UINT16 ptadr_16_31;
  }PTE,*LPPTE;
  f) 從PTE中獲得PAGE的真正物理地址的BASE ADDRESS. 此BASE ADDRESS表名了物理地址的.高20位. 加上虛擬位址的offset就是物理地址所在了.
  2、ARM系列的MMU
  ARM出品的CPU,MMU作為一個副處理器存在。根據不同的系列有不同搭配。需要查詢DATASHEET才可知道是否有MMU。如果有的話,一定是編號為15的副處理器。可以提供32BIT共4G的地址空間。
  ARM MMU提供的分頁機制有1K/4K/64K 3種模式. 本文介紹的是目前作業系統通常使用的4K模式。
  涉及的寄存器, 全部位於副處理器15.
  ARM沒有SEGMENT的寄存器,是真正的FLAT模式的CPU。給定一個ADDRESS,該地址可以被理解為如下資料結構:
  typedef struct
  {
  UINT32 offset :12;
  UINT32 page_index :8;
  UINT32 pdbr_index :12;
  } VA,*LPVA;
  從MMU寄存器2中取出BIT14-31,pdbr_index就是這個表的索引,每個入口為4BYTE大小,結構為
  typedef struct
  {
  UINT32 type :2; //always set to 01b
  UINT32 writebackcacheable:1;
  UINT32 writethroughcacheable:1;
  UINT32 ignore :1; //set to 1b always
  UINT32 domain :4;
  UINT32 reserved :1; //set 0
  UINT32 base_addr:22;
  } PDE,*LPPDE;
  獲得的PDE地址,獲得如下結構的ARRAY,用page_index作為索引,取出內容。
  typedef struct
  {
  UINT32 type :2; //always set to 11b
  UINT32 ignore :3; //set to 100b always
  UINT32 domain :4;
  UINT32 reserved :3; //set 0
  UINT32 base_addr:20;
  } PTE,*LPPTE;
  從PTE中獲得的基地址和上offset,組成了物理地址.
  PDE/PTE中其他的BIT,用於存取控制。這邊講述的是一切正常,物理地址被正常組合出來的狀況。
  ARM/X86 MMU使用上的差異
  1、X86始終是有SEGMENT的概念存在. 而ARM則沒有此概念(沒有SEGMENT REGISTER.).
  2、ARM有個DOMAIN的概念. 用於訪問授權. 這是X86所沒有的概念. 當通用OS嘗試同時適用於此2者的CPU上, 一般會拋棄DOMAIN的使用.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.