Откуда берется "Освобождение неиспользуемой памяти ядра"?
Я часто вижу Freeing unused kernel memory: xxxK (......)
из dmesg
, но я никогда не могу найти этот журнал из исходного кода ядра с помощью grep/rg.
От куда это?
2 ответа
Эта строка текста не существует как одна полная строка, поэтому вы не смогли выполнить ее.
Все это начинает действовать, когда free_initmem () в init/main.c вызывает free_initmem_default ().
Эта строка происходит от free_initmem_default () в 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)
Из моего ответа здесь :
Некоторые функции в исходном коде ядра помечены значком
__init
потому что они запускаются только один раз во время инициализации. Это указывает компилятору пометить функцию особым образом. Компоновщик собирает все такие функции и помещает их в конец финального бинарного файла.
Пример подписи метода:
static int __init clk_disable_unused(void)
{
// some code
}
При запуске ядра этот код запускается только один раз во время инициализации. После запуска ядро может освободить эту память для повторного использования, и вы увидите сообщение ядра:
Освобождение неиспользуемой памяти ядра: освобождено 108 КБ