上一篇文章 linux内核启动流程分析 - efi_stub_entry 中,为了叙述方便,我们只是粗略的讲了下efi_main函数,这里我们再具体看下。
通过该函数的注释可知,其主要目的是返回startup_32的运行时地址,这个我们在上篇文章中也说过。
673行保存startup_32的运行时地址到bzimage_addr中。
675行保存boot_params->hdr的地址到hdr中。
有关boot_params的创建及其hdr的初始化,我们在 linux内核启动流程分析 - efi_pe_entry 中有讲到,这里就不再赘述。
继续看该函数的其余部分。
该部分主要讲在某些情况下,加载到内存的kernel需要被移动到合适的位置。
710行通过将bzimage_addr和image_offset相减,计算出kernel被加载到内存时的起始地址。
bzimage_addr由上可知,是startup_32的运行时地址,而startup_32又是compressed部分的起始