1. 程式人生 > >Linux-記憶體管理子系統

Linux-記憶體管理子系統

Linux-記憶體管理子系統

記憶體管理子系統職能:

1. 管理虛擬地址和實體地址的對映;2. 管理實體記憶體的分配

虛擬記憶體空間

空間分佈:

1. 使用者空間 如 0-3G地址空間

 

被使用者程序所使用與核心的直接對映區使用的是同個記憶體區域。

2. 核心空間

2-1. 直接對映區(3G-3G+896MB),896MB以下為實體記憶體的低端記憶體,896MB以上為實體記憶體的高階記憶體;在直接對映區中,3G對應實體記憶體0地址,3G+8         96MB對應實體記憶體的896MB地址

2-2. Vmalloc區:既可以訪問低端記憶體也可以訪問高階記憶體

2-3. 永久核心對映區:訪問高階記憶體

2-4. 固定對映的線性地址:訪問一些暫存器等

虛擬記憶體---->實體記憶體(以二級頁表為例)

 

實體記憶體分配

假設實體記憶體空間為擁有50個座位的電影院,電影院老闆欲邀請人坐滿該影院,在影片播完前不能有空位和打瞌睡的人出現,此時邀請的人數必然應該大於50位,因為中途可能會有人離座或者打瞌睡。這就可以類比為什麼需要虛擬記憶體這個概念了,為了最大程式地利用好這個電影院的50個座位(實體記憶體),允許啟動的程序應該大於50個(虛擬地址),當影院中有人離座或者是有人打瞌睡了,在影院外的人便可以進入影院填補這個空位。而分配是由電影院(MMU)來進行的。

 

 

一般使用者空間的程序在一開始並不給其虛擬記憶體對映實體記憶體,而是在當使用到該虛擬記憶體的時候,再通過請頁異常來分配實體記憶體,而核心空間中通過Vmalloc分配的虛擬地址也是如此,只有核心空間中的Kmalloc分配區才會在一開始的時候通過空閒實體記憶體池中選出實體記憶體來與虛擬記憶體對映起來

Tips:

1. 虛擬記憶體大小由硬體來決定,32位系統中虛擬記憶體大小為4G

2. 32位核心中使用者程序可訪問的記憶體最大可達3G,核心可訪問所有實體記憶體

3. 64位核心中可訪問的虛擬記憶體最大可達2^64,此時只要實體記憶體大小不超過核心地址空間範圍則核心地址空間可以採取直接對映的方式,核心可以訪問所有的實體記憶體