1

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

它从何而来?

4

2 回答 2

3

该行文本不作为单个完整的字符串存在,因此您无法对其进行 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)

于 2019-07-18T20:55:21.893 回答
0

从我在这里的回答:

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

示例方法签名:

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

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

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

于 2022-01-26T06:46:35.937 回答