大頁記憶體 初始化

2021-08-30 17:46:39 字數 1857 閱讀 6789

所有的大頁均放在 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

static __init int

setup_hugepagesz

(char

*opt)

else

if(ps == pud_size && cpu_has_gbpages)

else

return1;

}

可見,設定的size不是隨意設定,其大小必須要麼是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的定義正...