前面已经通过转载的方式介绍了Linux的设备树,现在来讲讲Linux memory size的初始化:
kernel memory size的初始化函数调用顺序如下:
start_kernel->setup_arch->setup_machine_fdt->early_init_dt_scan_nodes->early_init_dt_scan_chosen->early_init_dt_scan_root->early_init_dt_scan_memory->early_init_dt_add_memory_arch->memblock_add->memblock_add_range.
从setup_machine_fdt开始说起:
const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)//做两件事:通过dts的compitable找到合适的machine_dsec结构体,解析DTS的内容
{
const struct machine_desc *mdesc, *mdesc_best = NULL;
#ifdef CONFIG_ARCH_MULTIPLATFORM
DT_MACHINE_START(GENERIC_DT, "Generic DT based system")
MACHINE_END
mdesc_best = &__mach_desc_GENERIC_DT;
#endif
if (!dt_phys || !early_init_dt_verify(phys_to_virt(dt_phys)))
return NULL;
mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach);
if (!mdesc) {
const char *prop;
int size;
unsigned long dt_root;
early_print("\nError: unrecognized/unsupported "
"device tree compatible list:\n[ ");
dt_root = of_get_flat_dt_root();
prop = of_get_flat_dt_prop(dt_root, "compatible", &size);
while (size > 0) {
early_print("'%s' ", prop);
size -= strlen(prop) + 1;
prop += strlen(prop) + 1;
}
early_print("]\n\n");
dump_machine_table(); /* does not return */
}
/* We really don't want to do this, but sometimes firmware provides buggy data */