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, ®);
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
?