linux uboot 到内核的参数传递
1.通过tag 的方式传递参数;kernel_entry(0, machid, bd->bi_boot_params);/* does not return */跳入内核入口地址:r1=0、r1=machid、r2=启动参数指针2.uboot跳转内核的传参uboot中增加使用theKernel(0, 362, 0x30000100);来跳转到内核。uboot将r0-r2三个参数传给了内核。r
1.通过tag 的方式传递参数;
kernel_entry(0, machid, bd->bi_boot_params); /* does not return */ 跳入内核入口地址:r1=0、r1=machid、r2=启动参数指针
2. uboot跳转内核的传参
uboot中增加使用theKernel(0, 362, 0x30000100);来跳转到内核。uboot将r0-r2三个参数传给了内核。
r0 一般设置为0;
r1 一般设置为machine id (在使用设备树时该参数没有被使用);
r2 一般设置ATAGS或DTB的开始地址
最初在r2的位置,存放了uboot准备好的tags,传递给内核,当使用设备树时,r2不再存放tag首地址,而是uboot将设备树加载到内存中的地址。
3.DTS的加载过程:
将硬件配置和系统运行参数等组织成Device Tree source file,通过dts编译后成dtb,在系统启动的过程:
一是在引导kernel的同时,将dtb载入内存,前提是定义#define CONFIG_OF_LIBFDT支持设备树,tftp 0x8000 zlmage ,tftpboot 0x100 test-ek.dtb将kernel和dtb下载到flash中,fdt addr 0x100将dtb载入内存,最终通过bootz 0x8000 – 0x100启动系统。
二是讲dts和kernel打包成plmage,这种方式无需将dtb的地址写到uboot中(但是uboot中要实现读plmage头部的功能),uboot从plmage的头部信息处去读取dtb的地址,然后传递给kernel。
三是启动kernel中的”ARM_APPENDED_DTB”选项,该选项将dtb和kernel打包在一起,在kernel启动时会去紧挨着它的地方寻找dtb,这样就不需要uboot来传递dtb地址了。
引入设备树后bootloader加载DTB方法:
1. 标准方法
将linux kernel放到内存地址为<kernel img addr>的内存中。
将DTB放到地址为<dtb addr>的内存中。
在u-boot下通过下面的命令启动内核: bootm <kernel img addr> – <dtb addr>
2.兼容方法
配置内核CONFIG_ARM_APPENDED_DTB选项,将DTB放到紧跟内核后面的地址。
具体方法如下:
1)将DTB放到内核后面
cat arch/arm/boot/zImage arch/arm/boot/dts/myboard.dtb > my-zImage
mkimage ... -d my-zImage my-uImage
2)将打包好的文件my-uImage放到内存:<kernel img addr>
3)在u-boot下使用传统的命令启动内核:bootm <kernel img addr>
blog of arm linux tech by chuncky (http://www.cnblogs.com/chuncky): arm linux everyday,day day up
更多推荐
所有评论(0)