學習嵌入式才發現要看的書太多,外面的世界很精彩啊,如今來講說MMU吧,MMU是Memory Management Unit的縮寫,是用來管理虛擬內存系統的器件。 MMU一般是CPU的一部分,自己有少許存儲空間存放從虛擬地址到物理地址的匹配表。此表稱做TLB(轉換旁置緩衝區)。全部數據請求都送往MMU,由 MMU決定數據是在RAM內仍是在大容量存儲器設備內。若是數據不在存儲空間內,MMU將產生頁面錯誤中斷。在現代處理器中扮演着很是重要的角色。操做系統經過使用處理器的MMU功能,可以實現不少功能,具體以下:(MMU所起的做用也可參考http://wenku.baidu.com/view/09085f7427284b73f242502f.html)html
I. 虛擬內存。有了虛擬內存,能夠在處理器上運行比實際物理內存大的應用程序。爲了使用虛擬內存,操做系統一般要設置一個交換分區(一般是硬盤),經過將不活躍的內存中的數 據放入交換分區,操做系統能夠騰出其空間來爲其它的程序服務。虛擬內存是經過虛擬地址來實現的。程序員
II. 內存保護。根據須要對特定的內存區塊的訪問進行保護,經過這一功能,咱們能夠將特定的內存塊設置成只讀、只寫或是可同時讀寫。學習
在嵌入式系統中,一般不會使用虛擬地址這一功能,由於它會使得任務的調度時間不具肯定性。還有另外一個緣由就是,嵌入式系統的存儲空間一般很小,有的只採用FLASH做爲存儲介質,並無特定的空間用作交換分區。那在嵌入式系統中,MMU會用來作內存保護嗎?是的,MMU在嵌入式系統中主要是用來作內存保護用的。還記得《程序中的段》中所提到的.text段和.rdata段嗎?咱們說這兩個段一般是相鄰放在連續的內存塊中的,且這塊內存會是隻讀的,而這就須要MMU來幫忙了!將這兩個段所在的內存區塊設置成只讀的目的是,能夠防止其內容被出錯的程序意外的改寫了。對於設置成只讀的內存區當被意外的改寫時,處理器會產生一個段異常,而操做系統則利用這一異常產生一個core(或dump)文件。經過這一文件,咱們能夠分析出是哪一段程序試圖去改寫只讀內存的。應當說採用了內存保護的方法,可能使得程序出錯時,咱們找到問題的根源會相對的容易和快,由於其更接近出錯的程序點。若是不具備內存保護功能,那麼有可能程序去改寫.text或.rdata段所在的區塊時,還能運行,最後出錯的地方可能離實際的出錯點更爲的「遠」。spa
那是誰來負責將.text和.rdata段設置成只讀的呢?一般這能夠在咱們的應用程序在初始化操做系統時完成。操作系統
對於MMU的一個特性咱們在此不得不說起,MMU中存在頁的概念,對於全部的MMU功能其操做都是以頁的大小來進行的。好比,對於32位的x86處理器其頁的大小是4K字節。在採用MMU設置內存的讀寫屬性時,咱們必須將頁的起始地址做爲設置參數,且這一地址必須是頁的整數倍,k或者說地址必須是頁對齊的。那從嵌入式系統開發的角度來看,咱們須要注意什麼呢?咱們必須保護.text的起始地址必須是頁對齊的,這是經過設置鏈接器的腳原本達到目的,即將.text段的起始地址設置成以頁大小進行對齊,還有嗎?先看圖 1,爲了解釋方便咱們假設.rdata段也在.text段中,且.text的起始地址已經採用鏈接器腳本設置成了頁對齊的。指針
在實踐中,使用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所對應的虛擬地址。htm