天天看點

Linux核心分析(三)----初識linux記憶體管理子系統

昨天我們對核心子產品進行了簡單的分析,今天為了讓我們今後的分析沒有太多障礙,我們今天先簡單的分析一下linux的記憶體管理子系統,linux的記憶體管理子系統相當的龐大,是以我們今天隻是初識,隻要對其進行簡單的了解就好了,不會去追究代碼,但是在後面我們還會對記憶體管理子系統進行一次深度的分析。

Linux核心分析(三)----初識linux記憶體管理子系統

是以今天我們會分析到以下内容:

1.      Linux位址映射

2.      Linux記憶體配置設定

下面的分析我們依據上圖進行分析,首先我們來看其最右邊的位址分布圖(當然這是虛拟空間)。其位址分布總的可以分為兩個部分我們下面慢慢分析(基于32位處理器)。

Linux核心分析(三)----初識linux記憶體管理子系統

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是如何進行記憶體配置設定的。

Linux核心分析(三)----初識linux記憶體管理子系統

通過上圖我們可以分析出記憶體的配置設定過程

1.        由malloc、fork等系統調用和kmalloc、vmalloc申請得到虛拟記憶體。

2.        在我們使用該記憶體的時候,産生請頁異常(kmalloc除外)

3.        從空閑的頁框配置設定實體記憶體,和虛拟位址建立映射。

注:kmalloc申請空間是不用經過請頁異常的,傳回的虛拟位址已經對應了實體記憶體。Kmalloc可以配置設定到連續的實體記憶體,vmalloc配置設定的是非連續的實體記憶體。

繼續閱讀