О ядре linux v5.4 arm64_memblock_init () / fdt_enforce_memory_region () - PullRequest
0 голосов
/ 23 октября 2019

Q : Какая польза от свойства linux,usable-memory-range?

Справочная информация:

В последнее время я анализирую, как ядро ​​Linux инициализирует память. Когда я перехожу к функции arm64_memblock_init в arch/arm64/mm/init.c, я встречаю функцию с именем fdt_enforce_memory_region(). Функция обрабатывает linux,usable-memory-range свойство выбранного узла в дереве устройств.

Цепочка вызовов функций: arm64_memblock_init() -> fdt_enforce_memory_region() -> memblock_cap_memory_range().

void __init arm64_memblock_init(void)
{
    const s64 linear_region_size = BIT(vabits_actual - 1);

    /* Handle linux,usable-memory-range property */
    fdt_enforce_memory_region();
    ...
}
static void __init fdt_enforce_memory_region(void)
{
    struct memblock_region reg = {
        .size = 0,
    };

    of_scan_flat_dt(early_init_dt_scan_usablemem, &reg);

    if (reg.size)
        memblock_cap_memory_range(reg.base, reg.size);
}
void __init memblock_cap_memory_range(phys_addr_t base, phys_addr_t size)
{
    int start_rgn, end_rgn;
    int i, ret;

    if (!size)
        return;

    ret = memblock_isolate_range(&memblock.memory, base, size,
                        &start_rgn, &end_rgn);
    if (ret)
        return;
    /* codes below this line make me confused */
    /* remove all the MAP regions */
    for (i = memblock.memory.cnt - 1; i >= end_rgn; i--)  /*-- 1 --*/
        if (!memblock_is_nomap(&memblock.memory.regions[i]))
            memblock_remove_region(&memblock.memory, i);

    for (i = start_rgn - 1; i >= 0; i--)                 /*-- 2 --*/
        if (!memblock_is_nomap(&memblock.memory.regions[i]))
            memblock_remove_region(&memblock.memory, i);

    /* truncate the reserved regions */
    memblock_remove_range(&memblock.reserved, 0, base); /*-- 3 --*/
    memblock_remove_range(&memblock.reserved,          /*-- 4 --*/
            base + size, PHYS_ADDR_MAX);
}

После прочтения некоторые исправления и/Documentation/devicetree/bindings/chosen.txt, я узнал, что свойство linux,usable-memory-range связано с ядром аварийного дампа. У него должны быть какие-то отношения с kdump. Но почему memblock_cap_memory_range() удаляет память типа «память» и «зарезервированный», которые отмечены над функцией от 1 до 4, и она только резервирует память из [base, base + size]? Я не могу этого понять.

Но в некоторых книгах говорится, что prop "linux, usable-memory-range" - это полезный диапазон памяти, а memblock_cap_memory_range() удаляет память за пределы этого диапазона. Если это высказывание верно, я могу это понять. Однако, как я покажу выше, некоторые патчи и в этой статье , а также /Documentation/devicetree/bindings/chosen.txt говорят, что реквизит связан с kdump.

Итак, что такое использование свойства linux,usable-memory-range?

...