- 论坛徽章:
- 0
|
本帖最后由 aweii 于 2013-04-04 12:43 编辑
注释说分配node_mem_map 并留出映射页的空间后,需要调整ZONE_NORMAL和ZONE_HIGHMEM之间的边界,我怎么没见max_low_pfn有调整呢?按理说返回的max_low_pfn应该减去kva_pages 啊。该函数最后setup_bootmem_allocator()调用了numa_kva_reserve()把kva_start_pfn~max_low_pfn这段物理内存保留而不参与分配了,为什么不把这段内存也归入高端内存分配而浪费掉呢?- unsigned long __init setup_memory(void)
- {
- int nid;
- unsigned long system_start_pfn, system_max_low_pfn;
- /*
- * When mapping a NUMA machine we allocate the node_mem_map arrays
- * from node local memory. They are then mapped directly into KVA
- * between zone normal and vmalloc space. Calculate the size of
- * this space and use it to adjust the boundary between ZONE_NORMAL
- * and ZONE_HIGHMEM.
- */
- find_max_pfn();
- get_memcfg_numa();
- kva_pages = calculate_numa_remap_pages();//这里计算出重映射的页数
- /* partially used pages are not usable - thus round upwards */
- system_start_pfn = min_low_pfn = PFN_UP(init_pg_tables_end);
- kva_start_pfn = find_max_low_pfn() - kva_pages;//重映射区的地址页号,max_low_pfn应该也到这里吧,往上都作为high_memory
- #ifdef CONFIG_BLK_DEV_INITRD
- /* Numa kva area is below the initrd */
- if (boot_params.hdr.type_of_loader && boot_params.hdr.ramdisk_image)
- kva_start_pfn = PFN_DOWN(boot_params.hdr.ramdisk_image)
- - kva_pages;
- #endif
- kva_start_pfn -= kva_start_pfn & (PTRS_PER_PTE-1);
- system_max_low_pfn = max_low_pfn = find_max_low_pfn();//max_low_pfn = find_max_low_pfn();为啥没有考虑减去kva_pages
- printk("kva_start_pfn ~ %ld find_max_low_pfn() ~ %ld\n",
- kva_start_pfn, max_low_pfn);
- printk("max_pfn = %ld\n", max_pfn);
- #ifdef CONFIG_HIGHMEM
- highstart_pfn = highend_pfn = max_pfn;
- if (max_pfn > system_max_low_pfn)
- highstart_pfn = system_max_low_pfn;
- printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
- pages_to_mb(highend_pfn - highstart_pfn));
- num_physpages = highend_pfn;
- high_memory = (void *) __va(highstart_pfn * PAGE_SIZE - 1) + 1;
- #else
- num_physpages = system_max_low_pfn;
- high_memory = (void *) __va(system_max_low_pfn * PAGE_SIZE - 1) + 1;
- #endif
- printk(KERN_NOTICE "%ldMB LOWMEM available.\n",
- pages_to_mb(system_max_low_pfn));
- printk("min_low_pfn = %ld, max_low_pfn = %ld, highstart_pfn = %ld\n",
- min_low_pfn, max_low_pfn, highstart_pfn);
- printk("Low memory ends at vaddr %08lx\n",
- (ulong) pfn_to_kaddr(max_low_pfn));
- for_each_online_node(nid) {
- node_remap_start_vaddr[nid] = pfn_to_kaddr(
- kva_start_pfn + node_remap_offset[nid]);
- /* Init the node remap allocator */
- node_remap_end_vaddr[nid] = node_remap_start_vaddr[nid] +
- (node_remap_size[nid] * PAGE_SIZE);
- node_remap_alloc_vaddr[nid] = node_remap_start_vaddr[nid] +
- ALIGN(sizeof(pg_data_t), PAGE_SIZE);
- allocate_pgdat(nid);
- printk ("node %d will remap to vaddr %08lx - %08lx\n", nid,
- (ulong) node_remap_start_vaddr[nid],
- (ulong) pfn_to_kaddr(highstart_pfn
- + node_remap_offset[nid] + node_remap_size[nid]));
- }
- printk("High memory starts at vaddr %08lx\n",
- (ulong) pfn_to_kaddr(highstart_pfn));
- for_each_online_node(nid)
- find_max_pfn_node(nid);
- memset(NODE_DATA(0), 0, sizeof(struct pglist_data));
- NODE_DATA(0)->bdata = &node0_bdata;
- setup_bootmem_allocator();
- return max_low_pfn;
- }
复制代码 |
|