1,设备树文件里,运行时的信息有哪些?
在根节点里面有1个子节点 ,chosen {};里面设置了 bootargs, 内核启动时的,命令行参数
可以指定,根文件系统在哪里/, root = /dev/mtdblock4
第1个运行的应用程序是哪1个, init = /linuxrc
内核的打印信息从哪个设备打印出来 。console = ttySAC0,115200
还有1个比较重要的信息,memory{};
不同的板子,内存的起始地址和大小可能不一样,需要在设备树里面,把内存的地址和大小 告诉内核
地址和大小放在memory节点里面的reg属性里。
地址和大小用多少个32Bit的地址来表示?是在根节点的#address-cells = <1 > ;和#size-cells =<1>;来指定
分析chosen节点, bootargs属性的值,存入全局变量,boot_command_line
在head.s里面它最终调用init /main.c里面的start_kernel,在start_kernel里,它会调用到setup_arch
在前面选择了 最合适的machine_desc之后,会调用到early_init_dt_scan_nodes();
里面有3个函数 ,做了3件事
第1件事:处理chosen节点,取出属性之后,存入boot_command_line这个字符数组里 char boot_command_line
第2件事:处理根节点中的 address size2个信息
第3件事 :就是设置内存,就是把根节点memory节点里,把reg里面的地址和大小 告诉内核。
boot_command_line 就是chosen节点里面的bootargs属性的值。
address size(也就是根节点里面的#address #cell)这个获取到的值 ,在分析第3件事的时候有用。
把地址和内存大小取出来后,会调用到memblock_add(base,size); 添加1个内存块。