查看原文
其他

启动链条的逆行者:Chainload,Linux as UEFI Bootloader

wolf uefiblog UEFI社区 2023-12-29
点击上方“公众号” 可以订阅哦!

如果有一种环境,它既能拥有整个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栈

它使用了一下小“技巧”来达到双环境的目的:

  1. Hook了ExitBootServices(),跳过正常代码,防止破坏BS环境;存储了CR3、GDT、LDT和IDT等环境。

  2. 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




继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存