arch/arm/kernel/setup.c
void __init setup_arch(char **cmdline_p)
{
arm_memblock_init(mdesc);
paging_init(mdesc);
}
void __init arm_memblock_init(const struct machine_desc *mdesc)
{
early_init_fdt_reserve_self();
early_init_fdt_scan_reserved_mem();
}
/**
* early_init_fdt_scan_reserved_mem() - create reserved memory regions
*
* This function grabs memory from early allocator for device exclusive use
* defined in device tree structures. It should be called by arch specific code
* once the early allocator (i.e. memblock) has been fully activated.
*/
void __init early_init_fdt_scan_reserved_mem(void)
{
int n;
u64 base, size;
if (!initial_boot_params)
return;
/* Process header /memreserve/ fields */
for (n = 0; ; n++) {
fdt_get_mem_rsv(initial_boot_params, n, &base, &size);
if (!size)
break;
early_init_dt_reserve_memory_arch(base, size, 0);
}
of_scan_flat_dt(__fdt_scan_reserved_mem, NULL);
fdt_init_reserved_mem();
}
of_scan_flat_dt是for循环遍历所有可能持有memory-region的节点,调用函数是__fdt_scan_reserved_mem