问题:打流时发现Call trace分页page失败,内存水位线为90M
//参考文献 (15条消息) Linux内存描述之内存区域zone--Linux内存管理(三)_CHENG Jian的博客-CSDN博客
11.早期内存初始化memblock_init()
早期的Linux内核在引导阶段都是通过bootmem来完成初期的内存管理,3.19开始把bootmem弃用了,__alloc_memory_core_aarly()
取代了bootmem的__alloc_memory_core()
来完成内存分配, 而后者其实就是调用的memblock来分配;
12.bootmem_init()完成内存结点和内存区域的初始化工作
在arm64架构下, 内核在start_kernel()->setup_arch()中通过arm64_memblock_init( )完成了memblock的初始化之后, 接着通过setup_arch()->paging_init()开始初始化分页机制。
paging_init负责建立只能用于内核的页表, 用户空间是无法访问的;
arm64架构下, 在setup_arch中通过paging_init函数初始化内核分页机制之后, 内核通过bootmem_init()
开始完成内存结点和内存区域的初始化工作;
对连续内存模型而言,这可以通过zone_sizes_init完成,但calculate_node_totalpages还考虑了内存空洞;
初始化内存域zone数据结构涉及的繁重工作由free_area_init_core执行,它会依次遍历结点的所有内存域;
13.初始化备用内存域列表zonelists
asmlinkage __visible void __init start_kernel(void) { setup_arch(&command_line); build_all_zonelists(NULL, NULL); page_alloc_init(); mm_init(); kmem_cache_init_late(); kmemleak_init(); setup_per_cpu_pageset(); rest_init(); }
14 pagging_init初始化分页机制