從圖中可以看出,內(nèi)核采取了三種機(jī)制將高端內(nèi)存映射到內(nèi)核空間:永恒內(nèi)核映射,流動(dòng)映射和vmalloc機(jī)制。
起首,讓咱們看下實(shí)擬內(nèi)存:
1.物理內(nèi)存的內(nèi)核映射
3.物理內(nèi)存的分配
內(nèi)核收回內(nèi)存申請的請供時(shí),依據(jù)內(nèi)核函數(shù)挪用接心將啟用不同的內(nèi)存分配器。
3.1 分區(qū)頁框分配器
分區(qū)頁框分配器 (zoned page frame allocator) ,處置對連續(xù)頁框的內(nèi)存分配請求。分區(qū)頁框管理器分為兩大局部:前真?zhèn)管理區(qū)分配器和伙伴系統(tǒng),如下圖:
2).內(nèi)核地址空間的后128MB專門用于映射高端內(nèi)存,否則,沒有線性地址的高端內(nèi)存不能被內(nèi)核所訪問。這些高端內(nèi)存的內(nèi)核映射明顯是臨時(shí)映射的,可則也只能映射128MB的高端內(nèi)存。當(dāng)內(nèi)核須要訪問高端內(nèi)存時(shí)就常設(shè)在這個(gè)地區(qū)進(jìn)止地址映射,使用結(jié)束以后再用來進(jìn)行其余高端內(nèi)存的映射。
因?yàn)橐V垢叨藘?nèi)存的內(nèi)核映射,果此曲接可能映射的物理內(nèi)存大小只有896MB,該值保留在high_memory中 廣州從化搬家。內(nèi)核地址空間的線性地址區(qū)間如下圖所示:
1).高端內(nèi)存不能全體映射到內(nèi)核空間,也就是道這些物理內(nèi)存不對應(yīng)的線性地址。不外,內(nèi)核為每一個(gè)物理頁框都分配了對應(yīng)的頁框描述符,全部的頁框描述符都保留在mem_map數(shù)組中,因此每一個(gè)頁框描述符的線性地址都是牢固存在的。內(nèi)核此時(shí)可使用alloc_pages()和alloc_page()來分配高端內(nèi)存,由于這些函數(shù)返回頁框描述符的線性地址。
2.物理內(nèi)存治理機(jī)造
基于物理內(nèi)存在內(nèi)核空間中的映射道理,物理內(nèi)存的經(jīng)管方法也有所分歧。內(nèi)核中物理內(nèi)存的辦理機(jī)制重要有伙陪算法,slab高速緩存和vmalloc機(jī)制。此中搭檔算法和slab高速緩存皆在物理內(nèi)存映射辨別配物理內(nèi)存,而vmalloc機(jī)制則在高端內(nèi)存映射分辨配物理內(nèi)存。
伙伴算法
伙伴算法賣力大塊連續(xù)物理內(nèi)存的分配和釋放,以頁框?yàn)榛A(chǔ)單元。該機(jī)制可以免內(nèi)部碎片。
per-CPU頁框下速緩存
內(nèi)核常常請乞降釋放單個(gè)頁框,該緩存包括預(yù)先分配的頁框,用于謙足當(dāng)?shù)谻PU收出的單一頁框請求。
slab緩存
slab緩存負(fù)責(zé)小塊物理內(nèi)存的分配,并且它也作為高速緩存,主要針對內(nèi)核中時(shí)常分配并釋放的對象。
vmalloc機(jī)制
vmalloc機(jī)制使得內(nèi)核通過連續(xù)的線性地址來拜訪非連續(xù)的物理頁框,如許可以最大限度的應(yīng)用高端物理內(nèi)存。