現(xiàn)代操作系統(tǒng)普遍采用虛擬內(nèi)存管理( Virtual Memory Management) 機制,這需要MMU( Memory Management Unit,內(nèi)存管理單元) 的支持。
地址轉換:MMU將虛擬地址轉換為對應的物理地址是以頁為單位的,在32為系統(tǒng)中1頁為4K。其具體過程如下
- 在操作系統(tǒng)初始化或者分配、釋放內(nèi)存時,會執(zhí)行一些指令在物理內(nèi)存中填寫頁表,然后用指令設置MMU,告訴MMU頁表在物理內(nèi)存中的什么位置。
-
設置好之后, CPU每次執(zhí)行訪問內(nèi)存的指令都會自動引發(fā)MMU做查表和地址轉換的操作,地址轉換操作完全由硬件完成,不需要用指令控制MMU去做。
Paste_Image.png
內(nèi)存保護:通常操作系統(tǒng)把虛擬地址空間劃分為用戶空間和內(nèi)核空間,例如x86平臺的Linux系統(tǒng)虛擬地址空間是0x0000 0000~0xffff ffff,前3GB( 0x0000 0000~0xbfff ffff)是用戶空間,后1GB( 0xc000 0000~0xffff ffff)是內(nèi)核空間。用戶程序在用戶模式下執(zhí)行,不能訪問內(nèi)核中的數(shù)據(jù),也不能跳轉到內(nèi)核代碼中執(zhí)行。這樣可以保護內(nèi)核,如果一個進程訪問了非法地址,頂多這一個進程崩潰,而不會影響到內(nèi)核和其它進程。 CPU在產(chǎn)生中斷或異常時會自動切換模式,由用戶模式切換到特權模式,因此跳轉到內(nèi)核代碼中執(zhí)行中斷或異常服務程序就被允許了。事實上,所有內(nèi)核代碼的執(zhí)行都是從中斷或異常服務程序開始的,整個內(nèi)核就是由各種中斷處理和異常處理程序組成。我們已經(jīng)遇到過很多次的段錯誤是這樣產(chǎn)生的:
- 用戶程序要訪問的一個VA,經(jīng)MMU檢查無權訪問。
- MMU產(chǎn)生一個異常, CPU從用戶模式切換到特權模式,跳轉到內(nèi)核代碼中執(zhí)行異常服務程序。3. 內(nèi)核把這個異常解釋為段錯誤,把引發(fā)異常的進程終止掉。
Paste_Image.png