為完整起見, 我們介紹另一個內存分配的接口, 盡管我們不會准備使用它直到 15 章. 現 在, 能夠說 struct page 是一個描述一個內存頁的內部內核結構. 如同我們將見到的, 在內核中有許多地方有必要使用頁結構; 它們是特別有用的, 在任何你可能處理高端內存 的情況下, 高端內存在內核空間中沒有一個常量地址.
Linux 頁分配器的真正核心是一個稱為 alloc_pages_node 的函數:
struct page *alloc_pages_node(int nid, unsigned int flags, unsigned int order);
這個函數頁有 2 個變體(是簡單的宏); 它們是你最可能用到的版本:
struct page *alloc_pages(unsigned int flags, unsigned int order); struct page *alloc_page(unsigned int flags);
核心函數, alloc_pages_node, 使用 3 個參數, nid 是要分配內存的 NUMA 節點 ID[30]30, flags 是通常的 GFP_ 分配標志, 以及 order 是分配的大小. 返回值是一個指向描述分 配的內存的第一個(可能許多)頁結構的指針, 或者, 如常, NULL 在失敗時.
alloc_pages 簡化了情況, 通過在當前 NUMA 節點分配內存( 它使用 numa_node_id 的返 回值作為 nid 參數調用 alloc_pages_node). 並且, 當然, alloc_pages 省略了 order 參數並且分配一個單個頁.
為釋放這種方式分配的頁, 你應當使用下列一個: void free_page(struct page *page);
void free_pages(struct page *page, unsigned int order); void free_hot_page(struct page *page);
void free_cold_page(struct page *page);
如果你對一個單個頁的內容是否可能駐留在處理器緩存中有特殊的認識, 你應當使用 free_hot_page (對於緩存駐留的頁) 或者 free_cold_page 通知內核. 這個信息幫助內 存分配器在系統中優化它的內存使用.