开机
初始化硬件
uefi的boot manager自动从BootOrder变量里选择要启动的项
BootOrder变量里存储的是一个可启动项列表,这个列表里的元素是其他的Boot变量
uefi变量是一种存储介质,它类似于硬盘,即在断电的情况下,变量里存储的数据也不会丢失
用户在这一步是可以介入的,比如在开机后,进入到uefi的配置界面,在那里面就可以选择要启动的项了
启动目标项
uefi的boot manager从BootOrder里选择的启动项是一个uefi变量,假设该变量是Boot0004
这个变量里存储了要启动程序在硬盘里的具体位置,假设我们要启动的程序是systemd-boot,那该变量存储的位置通常为 /boot/EFI/systemd/systemd-bootx64.efi
uefi的boot manager使用 EFI_BOOT_SERVICES.LoadImage() 把 /boot/EFI/systemd/systemd-bootx64.efi 加载到内存
uefi的boot manager使用 EFI_BOOT_SERVICES.StartImage() 启动systemd-boot,此时控制流会跳转到systemd-boot作为uefi应用的入口函数
systemd-boot是一种boot loader,它可以用来加载uefi应用程序
linux内核默认会被构建成一个uefi应用程序,所以它可以被systemd-boot直接启动,当然它也可以被uefi直接启动
linux内核启动流程