昨天我們對核心子產品進行了簡單的分析,今天為了讓我們今後的分析沒有太多障礙,我們今天先簡單的分析一下linux的記憶體管理子系統,linux的記憶體管理子系統相當的龐大,是以我們今天隻是初識,隻要對其進行簡單的了解就好了,不會去追究代碼,但是在後面我們還會對記憶體管理子系統進行一次深度的分析。
是以今天我們會分析到以下内容:
1. Linux位址映射
2. Linux記憶體配置設定
下面的分析我們依據上圖進行分析,首先我們來看其最右邊的位址分布圖(當然這是虛拟空間)。其位址分布總的可以分為兩個部分我們下面慢慢分析(基于32位處理器)。
1. 使用者空間(0~3G)
a) 空間簡介
其從0x00000000到0xBFFFFFFF共3GB的線性位址空間,每個程序都有一個獨立的3GB使用者空間,當然這是虛拟的空間。
b) 如何轉換為實體空間
2. 核心空間(3~4G)
其從0xC0000000到0xFFFFFFFF共1GB大小,核心空間又可以根據映射方式的不同分為下面四塊,我們一一分析
a) 核心邏輯位址空間
l 空間簡介
其從0xC0000000到high_memory(圖中896MB的地方)最大為896MB(也就是說這塊空間有可能不滿,但最大為896MB),當然是虛拟空間。
注:在此注意一下896MB我們一會在分析。
l 如何轉換為實體空間
這一部分虛拟位址與實體記憶體中對應的位址隻差一個固定偏移量(3G),如果記憶體實體位址空間從0x00000000位址編址,那麼這個固定偏移量就是PAGE_OFFSET(如上圖)。
b) Vmalloc空間
其位址沒有嚴格的界限,這段空間既可以通路到我們的高端記憶體,也可以通路到低端記憶體。(高端和低端一會解釋)
不是通過簡單的線性關系映射,在此不研究。
c) 永久核心映射
其固定用來通路高端記憶體。
d) 固定映射
其在系統初始化期間永久映射I/O位址空間,或者特殊的寄存器。
3. 遺留知識
在剛才我們前面的分析中我們留下了一些問題下面進行解釋。
a) 低端記憶體
核心邏輯位址空間所映射的實體記憶體就是低端記憶體(實際實體記憶體的大小,但是小于896MB)
b) 高端記憶體
低端記憶體位址之上的實體記憶體是高端記憶體(實體記憶體896MB之上)。
c) 896MB來由
Linux将記憶體分為核心空間和使用者空間,其中核心空間中的0xC0000000~high_memory部分用來映射實體記憶體,但是我們還需要映射I/O空間和固定的寄存器,是以留出了high_memory~0xFFFFFFFF之間的位址來映射I/O空間和固定的寄存器,而在X86平台根據經驗設定了這個high_memory為896MB。
l Linux記憶體配置設定
通過上面的介紹我們對linux對記憶體的管理,以及位址的映射有了一個了解,下面我們來分析linux是如何進行記憶體配置設定的。
通過上圖我們可以分析出記憶體的配置設定過程
1. 由malloc、fork等系統調用和kmalloc、vmalloc申請得到虛拟記憶體。
2. 在我們使用該記憶體的時候,産生請頁異常(kmalloc除外)
3. 從空閑的頁框配置設定實體記憶體,和虛拟位址建立映射。
注:kmalloc申請空間是不用經過請頁異常的,傳回的虛拟位址已經對應了實體記憶體。Kmalloc可以配置設定到連續的實體記憶體,vmalloc配置設定的是非連續的實體記憶體。