device_node只是某个结构体而已。
在uboot中把设备树文件随表放入内存中的某个地方就可以使用,为什么内核运行过程中它不会覆盖dtb文件所占用的那块内存呢?
在设备树格式那篇文章中曾经说过,在设备树文件中可以用memreserve指定一块内存,这块内存就是保留下来的内存,内核不会占用它。即使没有指定这块内存,当内核启动的时候,它也会把设备树文件所在的那块内存保留出来。
看一下函数的调用过程:
start_kernel // init/main.c
setup_arch(&command_line); // arch/arm/kernel/setup.c
arm_memblock_init(mdesc); // arch/arm/kernel/setup.c
early_init_fdt_reserve_self();
/* Reserve the dtb region */
// 把DTB所占区域保留下来, 即调用: memblock_reserve
early_init_dt_reserve_memory_arch(__pa(initial_boot_params),
fdt_totalsize(initial_boot_params),
0);
early_init_fdt_scan_reserved_mem(); // 根据dtb中的memreserve信息, 调用memblock_reserve
unflatten_device_tree(); // arch/arm/kernel/setup.c
__unflatten_device_tree(initial_b