【问题标题】:Where does "Freeing unused kernel memory" come from?“释放未使用的内核内存”从何而来?
【发布时间】:2019-07-18 13:50:28
【问题描述】:

我经常从dmesg 中看到Freeing unused kernel memory: xxxK (......),但是在 grep/rg 的帮助下,我永远无法从内核源代码中找到此日志。

它来自哪里?

【问题讨论】:

    标签: linux linux-kernel dmesg


    【解决方案1】:

    该行文本不作为单个完整字符串存在,因此您无法对其进行 grep。
    init/main.c 中的 free_initmem() 调用 free_initmem_default() 时,这一切都开始了。

    有问题的行来自 include/linux/mm.h 中的 free_initmem_default()

    /*
     * Default method to free all the __init memory into the buddy system.
     * The freed pages will be poisoned with pattern "poison" if it's within
     * range [0, UCHAR_MAX].
     * Return pages freed into the buddy system.
     */
    static inline unsigned long free_initmem_default(int poison)
    {
        extern char __init_begin[], __init_end[];
    
        return free_reserved_area(&__init_begin, &__init_end,
                      poison, "unused kernel");
    }
    

    该文本的其余部分来自 mm/page_alloc.c 中的 free_reserved_area()

    unsigned long free_reserved_area(void *start, void *end, int poison, const char *s)
    {
        void *pos;
        unsigned long pages = 0;
    
        ...
    
        if (pages && s)
            pr_info("Freeing %s memory: %ldK\n",
                s, pages << (PAGE_SHIFT - 10));
    
        return pages;
    }
    

    (v5.2 的代码摘录)

    【讨论】:

      【解决方案2】:

      来自我的回答here

      内核源代码中的某些函数标有__init,因为它们在初始化期间只运行一次。这指示编译器以特殊方式标记函数。链接器收集所有此类函数并将它们放在最终二进制文件的末尾。

      示例方法签名:

      static int __init clk_disable_unused(void) 
      {
         // some code
      }
      

      当内核启动时,此代码在初始化期间只运行一次。运行后,内核可以释放此内存以重用它,您将看到内核 留言:

      释放未使用的内核内存:释放 108k

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-08
        • 1970-01-01
        • 2016-01-28
        • 2020-05-21
        • 2019-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多