Linux記憶體管理概述

2021-06-20 14:47:31 字數 1483 閱讀 8821

(該圖**作者aryang)

下面對各部分進行概述。

linux程序的線性位址空間(程序虛擬位址空間分布),0~3g是user位址空間,3~4g是kernel位址空間。(適用於arm、x86等,mips按0~2g,2~3g劃分)

1.緊接著核心資料區向上是mem_map全域性page陣列。

3.核心動態載入驅動模組so將被load到緊接著modules_vaddr~0xc0000000的16m空間。

小於896m的物理記憶體直接對映到核心3g~3g+896m線性位址空間內,va=pa-phys_offset+page_offset

大約896m的物理記憶體通過建立各級頁表的方式對映到高階對映區。

每個task在起task_struct內都有乙個指標mm指向mm_struct,其控制著該task的所有記憶體資訊,其成員mmap指向vma區鍊錶,pgd指向頁全域性目錄位置。

切換任務時要為下乙個task裝載其pgd到c2(x86為cr3)。

在cpu定址時,mmu將虛擬位址按照2級對映方式,對映到對應物理葉匡的位址偏移上去。

而在記憶體管理上,系統啟動階段使用的是bootmem,它是以簡單的bitmap方式(0:未使用,1:已用)。

系統啟動後buddy接手記憶體管理(以頁為單位),分為兩種情況,per_cpu_pageset和free_area,前者用來分配單個頁(在linux物理記憶體描述三個層級中有詳細描述),後者用來分配多頁的情況,11個鍊錶管理頁塊的大小從2^1~2^11,每個鍊錶中又分為不同遷移型別的子鍊錶。

#define migrate_unmovable     0

#define migrate_reclaimable   1

#define migrate_movable       2

#define migrate_pcptypes      3 /* the number of types on the pcp lists */

#define migrate_reserve       3

#define migrate_isolate       4 /* can't allocate from here */

migrate_types是為了有效解決記憶體碎片問題而引入的,將可移動(使用者空間申請的記憶體可以重新對映)、不可移動(核心空間通常申請的)、可**(檔案對映)等組織在不同的鍊錶中,申請記憶體時按照不同情況在各自型別的鍊錶中釋放,如果所在型別記憶體不足,會fallback到其他型別鍊錶繼續分配。在系統初始化完成時全部記憶體劃分給movable型別鍊錶,當有其他型別需求時再從movable中釋放生成。

slab分配器是物件導向的分配機制,其建立在buddy基礎之上,細節待另一篇詳述。

框架

(該圖**bullbat的部落格,強烈推薦該部落格

linux的記憶體管理概述

今年工作這麼難找?小黃同志要努力啊 咱可不能拖社主義的後退啊 linux將物理記憶體分成每個4k大小的頁,來進行管理。linux中 號稱 pfn,是 page frame number的縮寫。取值範圍是 0 memory size 12 但是由於物理記憶體對映的關係,物理記憶體的0位址對應到到系統上...

記憶體管理 記憶體管理概述

儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...

Spark 記憶體管理概述

spark被稱作記憶體計算引擎,使得很多初學者認為spark執行環境一定需要大量記憶體,更有甚者,認為spark執行期會把原始資料一次性全部載入到記憶體。解開這些疑團,需要了解spark執行時的機制,spark的計算發生在executor,因此,這裡的執行時機制是指executor的行為。對於spa...