Linux内存管理之活动内存区

 

/*添加活动区域,需要对原有的进行检查*/   void __init add_active_range(unsigned int nid, unsigned long start_pfn,                           unsigned long end_pfn)   {       int i;          mminit_dprintk(MMINIT_TRACE, "memory_register",               "Entering add_active_range(%d, %#lx, %#lx) "               "%d entries of %d used\n",               nid, start_pfn, end_pfn,               nr_nodemap_entries, MAX_ACTIVE_REGIONS);   //not set macro        mminit_validate_memmodel_limits(&start_pfn, &end_pfn);          /* Merge with existing active regions if possible */       for (i = 0; i < nr_nodemap_entries; i++) {           if (early_node_map[i].nid != nid)               continue;              /* Skip if an existing region covers this new one */           if (start_pfn >= early_node_map[i].start_pfn &&                   end_pfn <= early_node_map[i].end_pfn)               return;              /* Merge forward if suitable */           if (start_pfn <= early_node_map[i].end_pfn &&                   end_pfn > early_node_map[i].end_pfn) {               early_node_map[i].end_pfn = end_pfn;               return;           }              /* Merge backward if suitable */           if (start_pfn < early_node_map[i].end_pfn &&                   end_pfn >= early_node_map[i].start_pfn) {               early_node_map[i].start_pfn = start_pfn;               return;           }       }          /* Check that early_node_map is large enough */       if (i >= MAX_ACTIVE_REGIONS) {           printk(KERN_CRIT "More than %d memory regions, truncating\n",                               MAX_ACTIVE_REGIONS);           return;       }          early_node_map[i].nid = nid;       early_node_map[i].start_pfn = start_pfn;       early_node_map[i].end_pfn = end_pfn;       nr_nodemap_entries = i + 1;   }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/22929.html