MMU(Memory Management Unit,內存管理單元)在現代處理器中扮演着很是重要的角色。操做系統經過使用處理器的MMU功能,能實現如下功能:
1)虛擬內存。有了虛擬內存,能夠在處理器上運行比實際物理內存大的應用程序。爲了使用虛擬內存,操做系統一般要設置一個交換分區(一般是硬盤),經過將不活躍的內存中的數據放入交換分區,操做系統能夠騰出其空間來爲其它的程序服務。虛擬內存是經過虛擬地址來實現的。
2)內存保護。根據須要對特定的內存區塊的訪問進行保護,經過這一功能,咱們能夠將特定的內存塊設置成只讀、只寫或是可同時讀寫。
在嵌入式系統中,一般不會使用虛擬地址這一功能,由於它會使得任務的調度時間不具肯定性。還有另外一個緣由就是,嵌入式系統的存儲空間一般很小,有的只採用FLASH做爲存儲介質,並無特定的空間用作交換分區。那在嵌入式系統中,MMU會用來作內存保護嗎?是的,MMU在嵌入式系統中主要是用來作內存保護用的。還記得《程序中的段》中所提到的.text段和.rdata段嗎?咱們說這兩個段一般是相鄰放在連續的內存塊中的,且這塊內存會是隻讀的,而這就須要MMU來幫忙了!將這兩個段所在的內存區塊設置成只讀的目的是,能夠防止其內容被出錯的程序意外的改寫了。對於設置成只讀的內存區當被意外的改寫時,處理器會產生一個段異常,而操做系統則利用這一異常產生一個core(或dump)文件。經過這一文件,咱們能夠分析出是哪一段程序試圖去改寫只讀內存的。應當說採用了內存保護的方法,可能使得程序出錯時,咱們找到問題的根源會相對的容易和快,由於其更接近出錯的程序點。若是不具備內存保護功能,那麼有可能程序去改寫.text或.rdata段所在的區塊時,還能運行,最後出錯的地方可能離實際的出錯點更爲的「遠」。
那是誰來負責將.text和.rdata段設置成只讀的呢?一般這能夠在咱們的應用程序在初始化操做系統時完成。
對於MMU的一個特性咱們在此不得不說起,MMU中存在頁的概念,對於全部的MMU功能其操做都是以頁的大小來進行的。好比,對於32位的x86處理器其頁的大小是4K字節。在採用MMU設置內存的讀寫屬性時,咱們必須將頁的起始地址做爲設置參數,且這一地址必須是頁的整數倍,k或者說地址必須是頁對齊的。那從嵌入式系統開發的角度來看,咱們須要注意什麼呢?咱們必須保護.text的起始地址必須是頁對齊的,這是經過設置鏈接器的腳原本達到目的,即將.text段的起始地址設置成以頁大小進行對齊,還有嗎?先看圖 1,爲了解釋方便咱們假設.rdata段也在.text段中,且.text的起始地址已經採用鏈接器腳本設置成了頁對齊的。ide