Linux內存管理

32位操作系統管理4G內存空間。操作系統將這4G的內存空間劃分爲兩部分,分別是低地址的3G空間(用戶空間)和高地址的1G空間(內核空間),用戶空間供用戶進程使用,內核空間供內核使用。這樣做的好處是將用戶進程和內核進程分開,使內核進程不受用戶進程的影響,使操作系統正常平穩運行。如果不將用戶進程和內核進程分開,創建足夠多的用戶進程,會慢慢佔滿內存,使操作系統無法正常運行導致死機。而將用戶空間和內核空間分開,即使用戶進程佔滿了用戶空間,操作系統還能正常進行工作,這樣就能正常管理用戶空間內存,殺死無用進程,釋放內存空間。對於用戶空間內存,操作系統又做了細分,從低地址到高地址分爲代碼段,數據段,BSS段,堆段,棧段。而堆段是從低地址到高低是擴充內存,棧段是從高地址到低地址擴充內存。代碼段一般存儲編譯好了的二進制代碼;數據段存儲程序中已初始化了的全局變量,靜態變量,常量;BSS段存儲未初始化的全局變量和靜態變量,雖說未初始化,但編譯器會將其賦值0或NULL。堆是程序員手動申請的內存空間和釋放內存空間,用來存儲數據。棧是編譯器自動擴充內存,釋放內存空間,棧用來存儲程序的局部變量,參數等數據。程序在沒運行之前,存儲在磁盤中,當運行時,將程序調入到內存中,使其成爲進程,由於內存空間太小,不能滿足所有進程的需求,所以提出了虛擬內存,每個進程都能分配到3G用戶空間的虛擬內存。進程在沒有訪問物理地址之前,訪問的都是虛擬內存,知道真正訪問物理內存時,MMU將虛擬地址轉化爲物理地址,通過請頁機制,將某頁加載如內存中並執行。
邏輯地址:由程序產生的與段相關的偏移地址部分。邏輯地址由兩部分組成:16位的段選擇器和32位的段內偏移量。將段選擇器和32位段內偏移量相加,即得到32位的線性地址。
虛擬內存地址(線型地址):每個進程可以直接尋址的內存空間,不受其他進程干擾。線性地址由三部分組成,高10位,中間10位,低12位,高10位存放的是頁目錄表索引,通過它,可以找到頁表的物理地址,中間10位爲頁表的偏移量,根據它,能得到物理頁號,物理頁號與12位的頁內偏移量組合能得到物理地址。
物理地址:內存真實地址編號。
硬件電路單元MMU(內存控制單元)通過段機制把邏輯地址轉化爲線型地址,再通過頁機制把線性地址轉化爲物理地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章