转载:
一、uboot的的配置和编译
1、配置:make smdk10_config
SRCTREE
MKCONFIG
smdk10_config
mkconfig
s0
生成如下两个文件:
include/config.mk include/config.h
建立两个软链接文件:
ln -s asm-arm asm
ln -s arch-smdk10 asm-arm/arch
2、make
二、uboot的源码分析:
最后,从env变量中获取到bootcmd参数(nand read 0xc0008000 0x100000 0x500000;bootm 0xc0008000),执行到了”
do_bootm ->do_bootm_linux->theKernel
1、do_bootm:从0x500000中读取UImage的头部,填充到一个全局变量header
添加这些信息首先调用setup_start_tag (bd),添加完后调用setup_end_tag (bd)。
3、有了上述信息和配置后我们就可以开始启动内核,调用
theKernel (0, bd->bi_arch_number, bd->bi_boot_params),之后我们的linux内核就开始工作了,uboot的使命就完成了!
以下参考:
①
在 uboot/board/davinci/dm365evm的board_init函数中
机器码:
gd->bd->bi_arch_number = MACH_TYPE_DAVINCI_DM365_EVM
而#define MACH_TYPE_DAVINCI_DM365_EVM
需对应内核的linux/arch/arm/mach-davinci/Board-dm365-evm.c中一行代码
MACHINE_START(DAVINCI_DM365_EVM, "DaVinci_DM365x_EVM")
而DAVINCI_DM365_EVM定义在linux/asm
#define DAVINCI_DM365_EVM 1939
注:
在内核自解压完成以后内核会首先会进入bl __lookup_machine_type函数(在arch/arm/kernel/head.S中),检查machine_type是否匹配,如果不匹配会跳入__error_a函数(在arch/arm/kernel/head-common.S中),导致启动失败
②指定参数位置:
在uboot:
gd->bd->bi_boot_params=PHYS_SDRAM_1+0x100
#definde PHYS_SDRAM_1 0x80000000 定义在include\configs\Davin_dm365evm.h
所以即使uboot中设置
而内核的.boot_params
也能顺利启动内核,已试过
在试验中发现uboot中设置gd->bd->bi_boot_params=0或将gd->bd->bi_boot_params注释掉,都未能顺利启动内核。貌似在uboot必须为gd->bd->bi_boot_params指定一个值才行,而linux的.boot_params 始终都没有用到。
gd是一个全局结构体指针,用于uboot中各个文件中重要的参数传递,其成员见
看一下uboot在sdram 0x30000100处给内核传递了什么东东,见
参考嵌入式Linux应用开发完全手册ch15.1 p243
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务