sparse_index_init(section, nid):初始化sparse mem_section如果开启CONFIG_SPARSEMEM_EXTREME 则需要 申请 mem_section (为mem_section 对象分配内存 ), 如果非开启则什么都不处理 set_section_nid(): 只有NODE_NOT_IN_PAGE_FLAGS开启才有效,section_to_node_table[section_nr] 主要存储这nr与node id对应管理表...
sparse memory模型会为每一个section都分配一个usermap,最终的物理页面的压缩,迁移等操作,都跟这些位相关,如下图所示: sparse_init函数中,另一部分的作用是遍历所有present section,然后将其映射到vmemmap区域空间。vmemmap区域空间,在之前的文章中也提到过。执行完后,整体的效果如下图所示: 关于Sparse Memory Model...
* Sparsemem tries to allocate bootmem in memory_present(), so must be * done after the fixed reservations. */arm64_memory_present();sparse_init();zone_sizes_init(min,max);memblock_dump_all();} 这个函数基本上完成了linux对物理内存“划分”的初始化,包括node, zone, page frame,以及对应的数...
sparse_init_nid()用于初始化一个node节点上的mem_section,完成初始化。sparse_init_one_section初始化一个section,设置section_mem_map、usage并调整状态。调用关系基于X86 64平台,主要涉及的调用关系见下。paging_init()根据不同架构具体实现,逻辑相同。
*/arm64_memory_present();sparse_init();zone_sizes_init(min,max);high_memory=__va((max<<PAGE_SHIFT)-1)+1;memblock_dump_all();} 2.3 zone_sizes_init函数 在初始化内存结点和内存域之前, 内核首先通过setup_arch()-->bootmem_init()-->zone_sizes_init()来初始化节点和管理区的一些数据项, ...
CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set # end of IRQ subsystem CONFIG_CLOCKSOURCE_WATCHDOG=y CONFIG_ARCH_CLOCKSOURCE_DATA=y CONFIG_ARCH_CLOCKSOURCE_INIT=y CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCK...
SPARSEMEM */ struct page *node_mem_map; /* 指向page实例数组的指针,用于描述结点的所有物理内存页,它包含了结点中所有内存域的页。 */ #ifdef CONFIG_PAGE_EXTENSION struct page_ext *node_page_ext; #endif #endif #ifndef CONFIG_NO_BOOTMEM /* 在系统启动boot期间,内存管理子系统初始化之前, 内核页...
arm_memblock_init 1. paging_init 1. mm_init_cpumask 1. build_all_zonelists--- 1. page_alloc_init 1. vfs_caches_init_early 1. mm_init 1. kmem_cache_init_late 1. debug_objects_mem_init 1. kmemleak_init 1. setup_per_cpu_
sparse_early_usemaps_alloc_pgdat_section实现size 大小的内存分配。 其实就是调用memblock的接口来分配内存,这里涉及的技巧是选择物理地址的位置goal: 目前的方法是:选择的物理地址与pgdat位于同一个section。 /#ifdefCONFIG_MEMORY_HOTREMOVEstaticunsignedlong*__initsparse_early_usemaps_alloc_pgdat_section(structpgli...
memory_present():是sparse内存模型的一个memblock的初始化函数。 memory_present() 根据获取到的memblock初始化对应的mem_section中的信息: /* Record a memory area against a node. */ void __init memory_present(int nid, unsigned long start, unsigned long end) ...