国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux內核分析(三)----初識linux內存管理子系統

2024-06-28 13:22:13
字體:
來源:轉載
供稿:網友
linux內核分析(三)----初識linux內存管理子系統

Linux內核分析(三)

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

在分析今天的內容之前,我們先來看出自http://bbs.chinaunix.net/thread-2018659-2-1.html的一位大神做的內存管理圖,真心佩服大神。其實這張圖可以分為兩個部分,一部分是地址映射,另一部分就是內存分配。

所以今天我們會分析到以下內容:

1. Linux地址映射

2. Linux內存分配

l Linux地址映射

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

1. 用戶空間(0~3G

a) 空間簡介

其從0x00000000到0xBFFFFFFF共3GB的線性地址空間,每個進程都有一個獨立的3GB用戶空間,當然這是虛擬的空間。

b) 如何轉換為物理空間

這一部分虛擬空間到物理空間的轉換方法是我們以前在http://www.CUOXin.com/wrjvszq/p/4246634.html一文中分析過的MMU地址轉換。

2. 內核空間(3~4G

其從0xC0000000到0xFFFFFFFF共1GB大小,內核空間又可以根據映射方式的不同分為下面四塊,我們一一分析

a) 內核邏輯地址空間

l 空間簡介

其從0xC0000000到high_memory(圖中896MB的地方)最大為896MB(也就是說這塊空間有可能不滿,但最大為896MB),當然是虛擬空間。

注:在此注意一下896MB我們一會在分析。

l 如何轉換為物理空間

這一部分虛擬地址與物理內存中對應的地址只差一個固定偏移量(3G),如果內存物理地址空間從0x00000000地址編址,那么這個固定偏移量就是PAGE_OFFSET(如上圖)。

b) Vmalloc空間

l 空間簡介

其地址沒有嚴格的界限,這段空間既可以訪問到我們的高端內存,也可以訪問到低端內存。(高端和低端一會解釋)

l 如何轉換為物理空間

不是通過簡單的線性關系映射,在此不研究。

c) 永久內核映射

l 空間簡介

其固定用來訪問高端內存。

l 如何轉換為物理空間

不是通過簡單的線性關系映射,在此不研究。

d) 固定映射

l 空間簡介

其在系統初始化期間永久映射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分配的是非連續的物理內存。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 呈贡县| 沾化县| 临洮县| 襄汾县| 瓦房店市| 米林县| 红原县| 佛教| 合肥市| 彩票| 卢湾区| 额济纳旗| 日喀则市| 奈曼旗| 盐亭县| 辽中县| 和顺县| 贡觉县| 彝良县| 崇信县| 岗巴县| 扎兰屯市| 石狮市| 丹凤县| 中山市| 驻马店市| 工布江达县| 简阳市| 海林市| 金堂县| 历史| 建阳市| 原阳县| 日土县| 聂拉木县| 宣汉县| 宣城市| 万全县| 珠海市| 明溪县| 揭东县|