问题:打流时发现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初始化分页机制