启动链条的逆行者:Chainload,Linux as UEFI Bootloader
如果有一种环境,它既能拥有整个Linux运行资源,还保有主板UEFI BIOS所有启动时(BootTime Service)资源,在其中既能使用Linux强大的驱动和各种库,又能兼容既有主板BIOS的强大环境,请问你是想要,还是想要呢?
这种Linux + UEFI的奇怪而有趣的组合是一个叫做safeboot-loader【1】 的实验品。它和LinuxBoot这种抹去了UEFI而纯Linux环境的BootLoader不同,也与再次重建一个轻薄型UEFI环境的UefiPayload【2】 不同。它可以说是两者的杂烩,既有Linux环境,也有UEFI环境,从而可以做一些有趣的事情,如基于PXE的远程鉴证(Remote Attestation)。
为了达到这种效果,Chainload实际上是按照正常主板UEFI启动,进入了一个定制化Linux环境。再完成基于PXE的远程鉴证后又退回UEFI环境,再进行普通的UEFI启动:
这是它的视频Demo:
它【3】 比UefiPayload方式更有兼容性:
可以使用主板的UEFI启动时服务
可以使用主板的NVRAM存储
可以使用主板的SMM栈
它使用了一下小“技巧”来达到双环境的目的:
Hook了ExitBootServices(),跳过正常代码,防止破坏BS环境;存储了CR3、GDT、LDT和IDT等环境。
AllocatePages了1G内存给Linux用;用memmap=exactmap来防止Linux踩到UEFI BS环境。
大家可以仔细阅读参考资料3来了解它的运行机理。
参考资料
[1]safeboot-loader github主页:https://github.com/osresearch/safeboot-loader
[2]UEFI Payload主页: https://github.com/tianocore/tianocore.github.io/wiki/UefiPayloadPkg
[3] chainload介绍: https://trmm.net/chainload