1,基本概念
一個程序運行時沒必要全部都同時裝入內存,只需要把當前需要運行的部分裝入內存即可,這樣就使得一個大程序可以在較小的內存中運行,也使得內存中可以同時裝入更多的程序並發執行,從用戶角度看,該系統擁有的內存容量比實際的內存容量大的多,這樣的存儲器稱為虛擬存儲器。虛擬存儲器從邏輯上對內存容量進行了擴充,用戶看到的大容量是虛的。
在沒有使用虛擬存儲器的機器上,地址被直接送到內存總線上,使具有相同地址的物理存儲器被讀寫;而在使用了虛擬存儲器的情況下,虛擬地址不是被直接送到內存地址總線上,而是送到存儲器管理單元MMU,把虛擬地址映射為物理地址。(即MMU把虛擬地址空間和物理地址空間給隔開了)
虛擬地址空間:大小由CPU的位數決定,例如在一個32位的CPU系統中,這個虛擬內存地址范圍是0~0xFFFFFFFF (4G),這個地址范圍稱為虛擬地址空間。
虛擬地址:虛擬地址空間中的某一個地址我們稱之為虛擬地址。
物理地址空間和物理地址就是對應實際的內存。
頁表(Page Table):把虛擬內存轉換為物理內存,一般有兩種辦法,其一用一個數學公式進行轉換;另一個就是用表格存儲虛擬地址對應的物理地址,這個表格就稱為頁表。頁表有一個個條目(Entry)(條目也稱為描述符)組成,每個條目存儲了一段虛擬地址對應的物理地址及其訪問權限,或者下一級頁表的地址。我們以兩級頁表為例簡單說一下 虛 到 實的轉換過程:開始是頁表基址寄存器(存了一級頁表的基地址),這樣就來到了一級頁表,根據要找的虛擬地址找到一級頁表中的條目,如果此條目是段描述符,則返回物理地址結束;如果是二級頁表的描述符,則繼續利用虛擬地址在 此二級也頁表中找到條目,如果找到的條目是頁描述符,則返回物理地址,結束。
單獨說一下一級頁表,32位CPU的虛擬地址空間為4GB,一級頁表中使用了4096個描述符來表示這4GB空間,即每個描述符對應1MB的虛擬地址,這4096個描述符中存儲了它各種對應的1MB物理空間的起始地址 或者 下一級頁表的地址。
TLB(Translation Lookaside Buffer)轉換檢測緩沖區是一個內存管理單元,用於改進虛擬地址到物理地址轉換速度的緩存。
CPU每次拿着虛擬內存去找物理地址,從概念上說,這個轉換需要遍歷頁表,如果頁表是二級頁表,就需要2次內存訪問才能拿個物理地址,讀寫數據還得訪問一次。這一遍遍訪問內存,遍歷頁表太慢。所以出現了TLB(常用的幾十個虛擬地址與物理地址的對應表,當然滿了會有算法去更新),CPU發出虛擬地址,MMU先訪問TLB,如果有這個虛擬地址則直接用這個描述符進行地址轉換和權限檢查,沒有再去遍歷頁表,找到描述符進行那倆工作,並把描述符填入TLB(TLB已滿,用round-robin算法找到一個條目,覆蓋它)。
Cache高速緩沖存儲器,在主存和CPU通用寄存器間設置的一個高速的小存儲器,,把正在執行的指令地址附近的指令或數據從主存中調入這個存儲器,供CPU在一段時間內使用。啟用Cache后,CPU讀數據,如果Cache中有這個數據的復本則直接返回,否則從主存中讀取。
TLB 和 Cache的都是一種緩存。
2,MMU
內存管理單元(Memory Management Unit)簡稱MMU,兩個功能:虛擬地址到物理地址的映射;提供硬件機制的內存訪問權限檢查。
1)虛擬地址到物理地址的映射
現代的多用戶多進程操作系統,通過MMU使每個用戶進程都擁有自己獨立的地址空間:地址映射功能使得各進程擁有“看起來”一樣的地址空間。
例如WINDOWS操作系統將地址范圍4M-2G划分為用戶地址空間,進程A在地址0X400000(4M)映射了可執行文件,進程B同樣在地址0X400000(4M)映射了可執行文件,如果A進程讀地址0X400000,讀到的是A的可執行文件映射到RAM的內容,而進程B讀取地址0X400000時,則讀到的是B的可執行文件映射到RAM的內容。
ARM的CPU上地址轉換有3個概念:虛擬地址VA、變換后的虛擬地址MVA、物理地址PA。
- 沒啟動MMU時,CPU、cache、MMU、外設等所有部件使用的是物理地址;
- 啟動MMU之后,CPU對外發出虛擬地址VA,VA被轉換為MVA供cache、MMU使用,MVA在這里被轉換為PA,最后使用PA讀寫實際的硬件設備(內部寄存器或外接設備)。
CPU核看到的、用到的只是虛擬地址VA。實際設備看不到VA和MVA,讀寫他們時使用的是物理地址PA。
2)提供硬件機制的內存訪問權限檢查
簡單來說就是決定一塊內存是否允許讀,是否允許寫。頁表描述符的域(domain),描述符的AP位,CP15寄存器C3,CP15寄存器C1D R/S/A位。MMU根據這些值來進行權限檢查。
《嵌入式Linux應用開發完全手冊》