所有的大頁均放在 hstates 的全域性變數中。
mm/hugetlb.c
struct hstate hstates[huge_max_hstate];
每個hstates
陣列的元素,均表示一種大小的page,其中huge_max_hstate
的值為2,這也就解釋了為什麼hugepage目前只支援2個pagesize。
當前系統有多少個型別 的hugepage,可以通過/sys/kernel/mm/hugepages/
檢視,例如我當前系統只有20個大小為1g的page:
$ls -l /sys/kernel/mm/hugepages/
total 0
drwxr-xr-x 2 root root 0 nov 1 11:52 hugepages-1048576kb
系統啟動後,會執行$cat /sys/kernel/mm/hugepages/hugepages-1048576kb/nr_hugepages
20
parse_args
函式解析一些啟動引數
sudo grubby --update-kernel=all --args="hugepagesz=1g default_hugepagesz=1g hugepages=20"
我們設定的啟動引數均會被解析,當解析hugepagesz=
時呼叫setup_hugepagesz
函式,該函式 通過hugetlb_add_hstate
,初始化hstates
。
可見,設定的size不是隨意設定,其大小必須要麼是static __init int
setup_hugepagesz
(char
*opt)
else
if(ps == pud_size && cpu_has_gbpages)
else
return1;
}
pud_size
或者pmd_size
。對於x64來說,就是1g或者2m。
解析 到hugepages=
命令的時候,會呼叫hugetlb_nrpages_setup
static
void __init hugetlb_hstate_alloc_pages
(struct hstate *h)
elseif(
!alloc_fresh_huge_page
(h,&node_states[n_memory]))
break;}
h->max_huge_pages = i;
}
alloc_bootmem_huge_page
函式申請一塊大記憶體,然後放在全域性佇列huge_boot_pages
中。
實際是在/* put bootmem huge pages into the standard lists after mem_map is up */
static
void __init gather_bootmem_prealloc
(void
)}
prep_new_huge_page
函式中,設定page的析構函式為free_huge_page
。將大頁page,放入h->hugepage_freelists
記憶體初始化
電容的分類 dram 基本原件是電容,需要定時重新整理,儲存速度較慢 dram又分為 sram 同步動態隨機儲存器 synchronous dynamic random access memory ddr 雙倍速率同步動態隨機儲存器 double data rate sdram ddr2 在 ddr...
記憶體初始化過程
1,物理記憶體資訊的獲取 0x15中斷,功能號 e820h,e801h,e88h 見檔案 linux arch i386 boot setup.s 執行完上面的 後,記憶體資訊被分為多條資訊放在e820map位置處,每個資訊條目長20位元組,包含乙個記憶體區間的資訊,條目數放在e820nr處。即實際...
Linux核心頁表初始化
linux在核心啟動過程中start kernel setup arch會呼叫如下兩個函式對頁表進行初始化和建立。static inline void prepare page table void 由於arm採用兩級對映,pmd不占用字段,pmd pgd,而這裡一次清了兩個pgd,和pgd的定義正...