例子:dts中简单节点:
/{
chosen{
bootargs = "noinitrd root=/dev/mtblock4 rw init=/linuxrc console=ttySAC0,115200";
};
};
此节点就指定了kernel启动时的命令行参数:
- 指定了根文件系统在哪里: root=/dev/mtblock4 rw
- 指定了第一个运行的应用程序是哪一个:init=/linuxrc
- 指定了内核的打印信息从什么设备输出出来:console=ttySAC0,115200"
函数调用过程:
从dtb中将某个变量提取出来,赋值给kernel中的某个变量即可。
start_kernel //init/main.c
setup_arch(&command_line) //arch/arm/kernel/setup.c
mdesc = setup_machine_fdt(__atags_pointer); // arch/arm/kernel/devtree.c
early_init_dt_scan_nodes() // drivers/of/ftd.c
of_scan_flat_dt(early_init_dt_scan_chosen,boot_command_line);
of_scan_flat_dt(early_init_dt_scan_root,NULL);
of_scan_flat_dt(early_init_dt_scan_memory,NULL);
整个处理过程总结:
- /chosen节点中的bootargs属性的值,存入全局变量: boot_command_line
- 确定根结点的这两个属性值: #address-cells, #size-cells,存入全局变量:dt_root_addr_cells,dt_root_size_cells
- 解析/memory中的reg属性,提取出“base,size”,最终调用memblock_add(base,size);