1. 程式人生 > >linux 使用者態和核心態以及程序上下文、中斷上下文 核心空間使用者空間理解

linux 使用者態和核心態以及程序上下文、中斷上下文 核心空間使用者空間理解

7、記憶體管理單元(MMU)介紹:其是實現虛擬地址和實體地址空間以及核心空間、使用者空間的基礎

MMU是儲存器管理單元的縮寫,是用來管理虛擬記憶體系統的器件。MMU通常是CPU的一部分,本身有少量儲存空間存放從虛擬地址到實體地址的匹配表,一種轉換方法(演算法)。此表稱作TLB(轉換旁置緩衝區)。所有資料請求都送往MMU,由MMU決定資料是在RAM內還是在大容量儲存器裝置內。如果資料不在儲存空間內,MMU將產生頁面錯誤中斷,外部儲存器地址空間由頁、行、列組成

MMU的兩個主要功能是:

1.     將虛地址轉換成實體地址。

2.     控制儲存器存取允許。MMU關掉時,虛地址直接輸出到實體地址匯流排:比如uboot前部分

 在實踐中,使用MMU解決了如下幾個問題:

①使用DRAM作為大容量儲存器時,如果DRAM的實體地址不連續,這將給程式的編寫除錯造成極大不便,而適當配置MMU可將其轉換成虛擬地址連續的空間,將不連續的物理空間變為連續的虛擬地址空間。

②ARM核心的中斷向量表要求放在0地址,對於ROM在0地址的情況,無法除錯中斷服務程式,所以在除錯階段有必要將可讀寫的儲存器空間對映到0地址。

③系統的某些地址段是不允許被訪問的,否則會產生不可預料的後果,為了避免這類錯誤,可以通過MMU匹配表的設定將這些地址段設為使用者不可存取型別,即核心空間和使用者空間區別。

啟動程式中生成的匹配表中包含地址對映,儲存頁大小(1M,64K,或4K)以及是否允許存取等資訊,這是實現上述功能基礎。

例如:目標板上的16兆DRAM的實體地址區間為0xc000,0000~0xc07f,ffff,;0xc100,0000~0xc17f,ffff;這些地址都是邏輯地址即一個地址一個8位資料,16兆ROM的虛擬地址區間為:0x0000,0000~0x00ff,ffff。匹配表配置(匹配表輸入有虛擬地址 頁大小 是否允許存取 頁表)如下:

可以看到左邊是連續的虛擬地址空間,右邊是不連續的實體地址空間,而且將DRAM對映到了0地址區間。 MMU通過虛擬地址和頁面表位置資訊,按照轉換邏輯獲得對應實體地址,輸出到地址總線上。

應注意到的是使能MMU後,程式繼續執行,但是對於程式設計師來說程式計數器的指標已經改變,指向了ROM所對應的虛擬地址。

MMU的作用有兩個

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

MMU是處理器複雜到一定程度出現的產物。這個東西和作業系統的記憶體管理如果結合起來學習和理解,效果最好。

嵌入式系統中,儲存系統差別很大,可包含多種型別的儲存器件,如FLASH,SRAM,SDRAM,ROM等,這些不同型別的儲存器件速度和寬度等各不相同;在訪問儲存單元時,可能採取平板式的地址對映機制對其操作,或需要使用虛擬地址對其進行讀寫;系統中,需引入儲存保護機制,增強系統的安全性。為適應如此複雜的儲存體系要求,ARM處理器中引入了儲存管理單元來管理儲存系統,這是mmu意義。

一  記憶體管理單元(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可以控制地址空間的訪問許可權,從而保護這些程式碼不被破壞,核心空間與使用者空間區別。