"Freeing unused kernel memory" 从哪里来?
Where does "Freeing unused kernel memory" come from?
我经常从dmesg
中看到Freeing unused kernel memory: xxxK (......)
,但是我在grep/rg的帮助下从内核源代码中找不到这个日志。
它来自哪里?
该行文本不是一个完整的字符串,因此您未能对其进行 grep。
当 free_initmem() 在 init/main.c 调用 free_initmem_default()。
有问题的行源自 free_initmem_default() in include/linux/mm.h:
/*
* 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");
}
该文本的其余部分来自 free_reserved_area() mm/page_alloc.c:
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)
来自我的回答here:
内核源码中的一些函数标有__init
是因为它们在初始化时只运行一次。这指示编译器以特殊方式标记函数。链接器收集所有这些函数并将它们放在最终二进制文件的末尾。
示例方法签名:
static int __init clk_disable_unused(void)
{
// some code
}
内核启动时,这段代码运行只在初始化期间出现一次。在 运行s 之后,内核可以释放此内存以重新使用它,您将看到内核
留言:
Freeing unused kernel memory: 108k freed
我经常从dmesg
中看到Freeing unused kernel memory: xxxK (......)
,但是我在grep/rg的帮助下从内核源代码中找不到这个日志。
它来自哪里?
该行文本不是一个完整的字符串,因此您未能对其进行 grep。
当 free_initmem() 在 init/main.c 调用 free_initmem_default()。
有问题的行源自 free_initmem_default() in include/linux/mm.h:
/*
* 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");
}
该文本的其余部分来自 free_reserved_area() mm/page_alloc.c:
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)
来自我的回答here:
内核源码中的一些函数标有__init
是因为它们在初始化时只运行一次。这指示编译器以特殊方式标记函数。链接器收集所有这些函数并将它们放在最终二进制文件的末尾。
示例方法签名:
static int __init clk_disable_unused(void)
{
// some code
}
内核启动时,这段代码运行只在初始化期间出现一次。在 运行s 之后,内核可以释放此内存以重新使用它,您将看到内核 留言:
Freeing unused kernel memory: 108k freed