Bootm命令用来从memory启动内核,bootm命令的执行流程如下图所示。
在串口终端输入bootm命令后,执行do_bootm函数来完成相应的功能。Do_bootm函数首先调用bootm_start函数。(如果不输入,应该也有。)
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);
全部0条评论
快来发表一下你的评论吧 !