【发布时间】:2020-02-19 21:13:24
【问题描述】:
问:linux,usable-memory-range属性有什么用?
背景:
最近在分析Linux内核如何初始化内存。当我转到arch/arm64/mm/init.c 中的arm64_memblock_init 函数时,我遇到了一个名为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);
}
阅读some patches和/Documentation/devicetree/bindings/chosen.txt后,我了解到linux,usable-memory-range属性与故障转储内核有关。它应该与kdump有一些关系。但是为什么memblock_cap_memory_range() remove 'memory' 和 'reserved' 类型的内存在函数上方标记为 1 到 4,而它只保留 [base, base + size] 的内存?这个我看不懂。
但是从一些书籍中,他们说“linux,usable-memory-range”属性是内存的可用范围,memblock_cap_memory_range() 删除超出此范围的内存。如果这句话是真的,我可以理解这一点。但是,正如我在上面显示的那样,some patches 和 this article 以及 /Documentation/devicetree/bindings/chosen.txt 表示该道具与 kdump 相关。
那么,linux,usable-memory-range 属性有什么用?
【问题讨论】:
-
感谢美化我的问题!我由衷的感谢。
-
将代码摘录放入问题中。现在你在说什么已经很模糊了。
-
@0andriy 感谢您的建议。我现在添加了代码。
标签: memory memory-management linux-kernel kernel arm64