Откуда берется "Освобождение неиспользуемой памяти ядра"?

Я часто вижу 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 КБ

Другие вопросы по тегам