U-boot如何启动内核

本文转自:http://blog.csdn.net/hongkaicsu/article/details/5141964

我们用的u-boot已经改的面目全非,不过核心还是完全相同的,换了个面目而已。开源的好处,想改就改来玩玩。不过流程还是人家的。

u-boot通过bootm命令来启动内核,这个命令的处理函数是do_bootm,这个函数处理的是uboot-mkimage制作的映像,如果正好这个映像是内核,那么它就会调用do_bootm_linux函数,并在该函数中给内核传递参数并调用内核入口函数来启动内核。下面就来写写do_bootm和do_bootm_linux的简单流程,以及u-boot是如何把内核启动参数传递给内核的。这里只说流程,背景知识需要提前准备。当然也需要对着代码才能明白这些话是不是P话,是不是错话。OK,开始。

do_bootm开始,首先取环境变量verify的值,这个后面用来判断是否要对映像数据部分进行CRC校验,然后获得映像在内存中的位置。把映像的头部信息拷贝到一个提前准备好的全局变量中去,后续的操作基本都是通过检查这个全局变量的各个成员来进行的。

首先通过MAGIC NUMBER来检查文件类型是否是UIMAGE的映像,然后作头部的CRC校验,再根据前面取得的verify值做映像数据部分的CRC校验,然后检查ARCH,再检查映像类型(是单独的应用程序,还是内核,还是多个文件)。在这里前面的检查,如果不符合,不支持,或者出错,那么都会导致do_bootm出错返回,这是这些操作都不会破坏在内存中存放的UIMAGE映像(当然也可是存放在FLASH中的)。

以上的检查都做完后检查是否是压缩过得映像,这里的压缩指的是U-Boot用的压缩,与内核的zImage不是一回事儿,如果压缩了,那么就调用相应的解压缩程序进行解压缩,解压缩的位置就是在头部信息中指定的装载地址,而这个地址是在用uboot-mkimage制作映像的时候指定的。解压缩结束后再次判断映像类型,如果是内核或者多文件类型,那么就进入do_bootm_linux函数了。

在do_bootm_linux中,首先获得内核入口地址,然后检查initrd映像并取得initrd的位置和大小。然后开始设置启动内核所需要的参数,也就是要传递给内核的参数,现在的u-boot通过一个结构struct tag来管理这一大堆参数。通过调用一大堆setup_xx_tag函数设置完参数以后,关闭中断,关掉并冲刷CACHE,然后调用内核入口函数,通过bdinfo的bi_boot_params成员把存放这些 参数的tag数据结构的地址传递给内核。这样就开始执行内核代码了。大致过程就是这样吧。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qqbeifeng/archive/2009/11/10/4794659.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值