首先是 numa_node_id() 函数,它就像是一个 “导航仪”,当进程在运行过程中需要获取当前所处的 NUMA 节点编号时,只要调用这个函数,就能快速定位。它的实现原理涉及到对硬件寄存器、内存映射等底层机制的巧妙运用。在一些基于 Intel 架构的系统中,处理器会通过特定的寄存器来记录当前访问内存所对应的 NUMA 节点信息,...
#define cpumask_of_node (NODE_CPU_MASK(node)) /* node0:0~31; node1: 32~63 */ 说明:XLP832每个节点有1个物理CPU,每个物理CPU有8个核,每个核有4个超线 程,因此每个节点对应32个逻辑CPU,按节点依次展开。另外,实际物理存在的CPU 数目是通过DTB传递给内核的;numa_node_id()可以获取当前CPU所处的No...
#define cpumask_of_node (NODE_CPU_MASK(node)) /* node0:0~31; node1: 32~63 */ 说明:XLP832每个节点有1个物理CPU,每个物理CPU有8个核,每个核有4个超线 程,因此每个节点对应32个逻辑CPU,按节点依次展开。另外,实际物理存在的CPU 数目是通过DTB传递给内核的;numa_node_id()可以获取当前CPU所处的No...
__alloc_pages_node 函数参数中的 nid 就是我们在上篇文章《深入理解 Linux 物理内存管理》的“ 4.1 内核如何统一组织 NUMA 节点 ” 小节介绍的 NUMA 节点 id。 内核使用了一个大小为 MAX_NUMNODES 的全局数组 node_data[] 来管理所有的 NUMA 节点,数组的下标即为 NUMA 节点 Id 。 #ifdefCONFIG_NUMAextern...
static inline struct page *alloc_pages(gfp_t gfp_mask, unsigned int order) { return alloc_pages_node(numa_node_id(), gfp_mask, order); } static inline struct page * __alloc_pages_node(int nid, gfp_t gfp_mask, unsigned int order) { // 校验指定的 NUMA 节点 ID 是否合法,不要越界...
node_spanned_pages:节点中包含空洞的页帧个数 node_id:全局节点IDpgdat_next:连接到下一个内存节点,系统中的所有内存节点都通过单链表连接起来.kswapd_wait:交换守护进程的等待队列. 节点状态管理数据结构 static inline void node_set_state(int node, enum node_states state) ...
staticinline struct page*alloc_pages(gfp_t gfp_mask,unsigned int order){returnalloc_pages_node(numa_node_id(),gfp_mask,order);} 代码语言:javascript 复制 staticinline struct page*__alloc_pages_node(int nid,gfp_t gfp_mask,unsigned int order){// 校验指定的 NUMA 节点 ID 是否合法,不要越界...
#define alloc_pages(gfp_mask, order) alloc_pages_node(numa_node_id(), gfp_mask, order)//分配连续2^order个页面 staticinlinestructpage*alloc_pages_node(intnid,gfp_tgfp_mask,unsignedintorder) { if(unlikely(order>=MAX_ORDER)) returnNULL; ...
static inline struct page *alloc_pages_node(int nid, gfp_t gfp_mask, unsigned int order){ if (nid < 0) nid = numa_node_id(); return __alloc_pages(gfp_mask, order, node_zonelist(nid, gfp_mask));} __alloc_pages()第三个参数根据nid和gfp_mask得到适当的zonelist链表,该过程通过node...
#ifdef CONFIG_NUMA extern struct pglist_data *node_data[]; #define NODE_DATA(nid) (node_data[(nid)]) 这里指定 nid 是为了告诉内核应该在哪个 NUMA 节点上分配内存,我们看到在 alloc_pages 函数中通过 numa_node_id() 获取运行当前进程的 CPU 所在的 NUMA 节点。并通过 !node_online(nid) 确保指定...