1. 程式人生 > >作業系統的記憶體管理機制

作業系統的記憶體管理機制

記憶體管理(Memory management)旨在為系統中所有的task提供穩定可靠的記憶體分配、釋放與保護的機制

不論是android 中的音訊系統、GUI系統、或者是Binder實現的機理等都與記憶體的管理是息息相關的。

虛擬記憶體

計算機出現的早期物理的記憶體普遍很小,不過因為當時的程式體積也不大,所以不會有什麼問題。然而隨著軟體的發展,動輒以GB為單位的程式也是出現了很多。在這種的情況下,如何保證這些軟體能在大多數的機器上執行。 一種方法加大實體記憶體,使得機器能一次性讀入任何程式。這樣的理想是很豐滿的,但是現實卻是不容易實現,因為硬體的升級意味著成本的增加,即使記憶體增加到16G或者是64G問題也是沒有得到根本的解決。 另外的一種方法是使用虛擬記憶體; 基本思想:    (1)將外儲存器的部分空間作為記憶體的擴充套件,如從硬碟劃出4GB的大小。 (2)當記憶體的資源不足的時候,系統將會按照一定的演算法自動的挑選優先順序低的資料塊,並把他們儲存到硬碟中。 (3)後續如果是需要使用硬碟中的這些資料快,系統將會產生“缺頁”的指令,然後把他們交換回記憶體中。 (4)這些操作都是由作業系統核心自動完成的,對上層應用完全透明。 地址空間的轉換的過程:

邏輯地址(LocalAdress)

也成為相對地址,是程式編譯後所產生的地址,邏輯地址由兩部分組成:

Segment Selector(段選擇子)

用於描述邏輯地址所處的段 16bit


TI;table Indicator

RPL:Request Priviledge Level

GDT(Global Descriptor table)、LDT(Local Descriptor Table).他們用來記錄各種段描述符,(Segment Descriptors),而表本身的儲存地址則由GDTR和LDTR兩個CPU暫存器來儲存。GDT的有效的範圍是全域性的,同時系統也允許各自程序建立自己的本地表(LDT)以增加額外的段;

段選擇子中的INDEX就是GDTR/LDTR 中的“序號”------具體是那個表。則由Table Indicator來區分。0標識GDT,1表示LDT

Offset(用於描述段內的偏移值)32 bit

CPU提供了專用的暫存器來承載段選擇子


線性地址

線性地址是邏輯地址經過分段機制轉換後形成的。基本思想

根據段選擇子的TI欄位得到描述符儲存在GDT或者是LDT中

通過GDTR/LDTR 獲得GDT/LDT的儲存地址

根據段選擇子中的INDEX欄位到GDT/LDT中查到對應的段描述符

根據段描述符獲得此段的基地址

根據基地址+段內偏移地址得到線性地址


實體地址

實體地址的空間很好理解,它是指機器真實的實體記憶體所能表示的地址空間的範圍。比如對於只有64K記憶體的系統來說,其實體地址的範圍是0x0000·0xFFFF。任何的作業系統,最終都需要通過真實的額實體地址來訪問記憶體。

頁:與分段的額機制不同的是。分頁的機制操作的物件的大小是固定的記憶體塊,稱為“頁”。一般情況下,頁的大小為4KB。

葉框:葉框是對實體記憶體的最小的操作的單位也是4KB


線性地址中的1、3、6、7、8分別對應著實體記憶體中的1、2、3、4、5的葉框

記憶體的分配與回收

保證硬體無關性
動態分配記憶體和回收
記憶體碎片

記憶體保護

分段與分頁的管理就是記憶體保護的方式 因為每個程序的邏輯地址和實體地址都不是直接對應的,任何程式都沒有辦法訪問到他管轄的範圍外的記憶體空間-----即便刻意產生的記憶體越界與非法訪問,作業系統也會馬上阻止並強行的關閉程式,從而有力的保障應用程式和作業系統的穩定性