bootm命令的执行流程

描述

Bootm命令用来从memory启动内核,bootm命令的执行流程如下图所示。

在串口终端输入bootm命令后,执行do_bootm函数来完成相应的功能。Do_bootm函数首先调用bootm_start函数。(如果不输入,应该也有。)

Uboot

Bootm_start函数的主要作用是获取内核映像文件的相关信息,并保存到全局变量images中,image是struct bootm_headers结构类型,用来保存可执行内核映像的相关信息,主要包括内核映像的加载地址、起始地址、可执行入口地址等。

获取内核映像的相关信息是为后面的加载内核做准备;

内核可执行映像文件头包含了这些信息,这是通过工具mkimage加上去的。接下来执行bootm_load_os函数。

if (load !=image_start) {
                              memmove_wd ((void *)load,
                                      (void *)image_start, image_len, CHUNKSZ);
                          }

Image_start是不包括内核映像文件头的内核起始位置,也就是zImage的起始位置。

内核加载完成后,下面开始执行内核映像,这是通过调用函数do_bootm_linux来实现的,下面来看do_bootm_linux的执行过程。

Do_bootm_linux首先驱动内核的入口地址,代码如下所示。

theKernel=(void (*)(int, int, uint))images- >ep;

Images.ep为内核可执行映像文件的入口地址及zImage的起始地址,它是从内核映像文件头获取的,在前面的bootm_start函数中已经为它赋值,代码如下所示。

images.ep=image_get_ep (&images.legacy_hdr_os_copy);

如果需要,准备给内核传递的启动参数,然后获取启动内核需要的两个参数:machid和传递给内核参数的位置,这两个参数都保存在全局数据结构体变量bd的成员变量中,如下所示。

bd-  >bi_boot_params
              machid=bd- >bi_arch_number;

最后调用内核映像的第一个可执行函数,把控制权移交给内核,代码如下所示。

theKernel (0, machid, bd- >bi_boot_params);
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分