核心和使用者程序在分配記憶體時不同,核心更複雜,需更小心,不能太奢侈
物理頁:記憶體管理基本單位,32位(4k),64位(8k),struct page代表每個物理頁
struct page含引用計數(頁是否空閒,若不空閒:1 程序頁表對映 2頁快取記憶體(address_space)3 核心使用)
程序位址空間: 3g到4g為核心空間,核心空間分為
zone_dma(虛擬位址3g開始的0-16mb),對應實體地址0-16mb,固定對映,供io裝置的dma使用
zone_normal(虛擬位址3g開始的16-896mb),對應實體地址16-896mb,固定對映
zone_highem(虛擬位址3g開始的896-1024mb),對應其餘所有實體地址,動態對映(可能目前沒有對映,可能映**又取消又對映到另一塊實體地址上了)
分割槽是相似特效的頁進行分組,除上面3區外,還有zone_dma32(其內頁只能被32位裝置訪問)
不管對映關係是固定的還是動態的,使用頁前必須分配記憶體(小於896mb內對映關係固定,但其中很多頁並未有使用)
區的概念存在於核心空間也存在於物理記憶體中,分配記憶體一定是在物理記憶體中,只不過有些記憶體分配後(物理記憶體的0-896mb)是天然(固定)對映到核心空間,有些是(物理記憶體的896mb-可能4g)還沒有做對映。
很明顯,在zone_dma和zone_normal裡分配記憶體一定是物理和虛擬位址都連續的。
頁分配:
alloc_page: 分配一頁,返回頁page結構
alloc_pages:分配連續物理頁,返回第乙個頁page結構
_get_free_page: 分配一頁,返回頁邏輯位址
_get_free_pages:分配連續物理頁,返回第乙個頁邏輯位址
get_zeroed_page:分配一頁,填充0,返回頁邏輯位址
釋放頁:小心,只能釋放自己分配的頁
位元組(記憶體塊)分配:分配的記憶體可能佔據多個頁,不足乙個頁一般也會圓整。
kmalloc: 分配乙個size大小物理連續記憶體塊,返回指標(邏輯位址)。kfree釋放
vmalloc:分配虛擬位址連續,物理不聯絡的記憶體,返回指標,在物理記憶體的高階記憶體裡分配多個不連續物理頁, 在核心空間的zone_highem裡的vmalloc_start到 vmalloc_end分配乙個vmalloc區對映到分配的物理頁,(不需要分配器標誌),必須建立頁表項,用的少,一般獲得大塊記憶體時使用,vfree釋放
malloc:用於使用者空間記憶體分配,虛擬位址連續,物理不聯絡,和上面所有的都不一樣
絕大多的頁分配和位元組(記憶體塊)分配都需傳遞分配器標誌,vmalloc沒傳
行為修飾符:_gfp_wait(分配時可睡眠)/_gfp_io(可啟動磁碟io)/_gfp_fs(可啟動檔案系統io) 等等
區修飾符:_gfp_dma/_gfp_dma32/_gfp_highmem(優先從highmem,其次normal) ,不指定優先從normal區分配
型別:_gfp_kernel(常用,可睡眠,行為修飾符裡wait/io/fs 的結合)/_gfp_atomic(不能睡眠,多用於中斷處理程式,軟中斷,tasklet裡記憶體分配,容易分配失敗)
slab層:乙個快取記憶體對應某種結構(如task_struct), 快取記憶體含多個slab,乙個slab(滿,部分滿,空)含多個已分配記憶體的資料結構
棧上分配:使用者棧大且可動態擴充套件,核心棧小而固定,使用核心棧進行區域性變數分配(如系統呼叫)要省著點,別溢位了(thread_info都會被覆蓋)
高階記憶體:
在物理記憶體的高於896mb分配空間後,並不一定已經映**,不允許在高階記憶體分配了記憶體但沒有對映可又要返回邏輯位址的情況
alloc_page(s)結合_gfp_highmem, 沒有對映
_get_free_page(s)/get_zeroed_page/kmalloc不允許結合_gfp_highmem,因為返回不了邏輯位址(沒有對映)
vmalloc 對映
kmap永久對映給定物理頁(傳入struct page)到核心位址空間,用於可睡眠時,如果物理頁在低端記憶體(本身已經是永久映**),無效果,如果物理頁在高階記憶體,建立對映,返回邏輯位址,kunmap 解除
kmap_atomic臨時對映,用於不能睡眠時,kunmap_atomic 解除
上圖page_offset為3g處,物理記憶體對映為3g到3g+896mb, high_memory(3g+896mb到4g)又分為三個部分,分別用於vmalloc,kmap和kmap_atomic建立的對映。
每個cpu資料:每個cpu訪問屬於其自己資料,不需要鎖,減少快取失效
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux 採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心...
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心,...
Linux記憶體管理
首先我要說,我這是轉貼,轉的cu論壇上 nonameboy 的帖子,你可以連線過去看看。今天因為要解釋系統中可用記憶體的大小,用google看了半天,還有在cu上找了關天,竞然沒有發現有比較好的章,估計很多人都沒有注意到,懂了以後又沒有整理出來。在cu上看了很多文章說什麼memory leak和li...