深入淺出記憶體管理 記憶體節點 Node

2021-09-03 02:38:16 字數 1280 閱讀 5361

本文以linux核心4.9來做介紹。

typedef struct pglist_data  pg_data_t;
enum ;
如上所示支援的分配方式有兩種,zonelist_fallback和zonelist_nofallback,那麼根據不同的分配方式,對於zone的優先順序可能是不同的,這個陣列可以記錄下來不同策略對應的優先順序,所以這就是該成員存在的意義。

我們以arm64平台為例,它對系統中所有node的定義:

struct pglist_data *node_data[max_numnodes] __read_mostly;

export_symbol(node_data);

static int cpu_to_node_map[nr_cpus] = ;

這裡定義了乙個結構體指標陣列,並作為全域性變數來使用,這個陣列的內容是需要系統啟動時進行初始化和填充的:

/**

* initialize node_data for a node on the local memory

*/static void __init setup_node_data(int nid, u64 start_pfn, u64 end_pfn)

setup_node_data是在如下函式中被呼叫的:

static int __init numa_register_nodes(void)

/* finally register nodes. */

for_each_node_mask(nid, numa_nodes_parsed)

/* setup online nodes to actual nodes*/

node_possible_map = numa_nodes_parsed;

return 0;

}

進一步跟下去會發現它是在void __init arm64_numa_init(void)裡面進行層層呼叫下來的。具體我們不做分析了。

對於單一節點的系統來說,系統中只有乙個node描述符,定義如下:

#ifndef config_need_multiple_nodes

struct pglist_data __refdata contig_page_data = ;

export_symbol(contig_page_data);

#endif

深入淺出記憶體管理 頁表的建立

頁表的建立 linux在啟動過程中,要首先進行記憶體的初始化,那麼就一定要首先建立頁表。我們知道每個程序都擁有各自的程序空間,而每個程序空間又分為核心空間和使用者空間。以arm32為例,每個程序有4g的虛擬空間,其中0 3g屬於使用者位址空間,3g 4g屬於核心位址空間,核心位址空間是所有程序共享的...

XML DOM深入淺出之節點操作

今天就來和大家分享下,關於節點的操作。也就是所謂的增刪改查,不過我目前用的比較多的還是查,因為資料多是從後台查詢出來的,也就暫時用不著再增 改和刪了。不過我會把這些方法都寫到部落格中和大家分享。相信在不同的開發中會有不同的作用。一 xml dom獲取節點值 nodevalue 屬性用於獲取節點的文字...

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...