edk2-sdm845 是一个自定义的UEFI固件,用来在骁龙845平台上以EL1权限运行任何操作系统。正如README中所说的那样,他相当不完善,但我们只将它作为一个引导程序来使用。在这方面,它足以启动Windows。
从Fastboot到EDK2
在大多数比较新的高通设备上有两个分区,分别叫做xbl和abl。
xbl 作为高通平台上的UEFI固件,内含基于EFI的程序和驱动(如fastboot)。对于LA平台,如果开机时Fastboot模式未被触发,xbl将会立即加载abl。
abl 只在高通LA平台上存在,其源代码可以在CodeAurora上被找到,它内含一个名叫LinuxLoader.efi的EFI程序,用来加载并启动位于boot分区里的安卓Linux内核。
不幸的是,在进入市场的大多数零售设备上,xbl与abl均需经过厂商签名,我们不能对其作任何修改。因此,用设备自带的bl是不可能直接启动Windows的。
我们所采取的途径是将我们的UEFI固件伪装成一个Linux内核。通过在映像的开头添加一段代表Linux内核的代码,并在尾部附加设备树(device tree),abl就能很高兴地加载UEFI映像了。
MemoryMap
EDK2需要MemoryMap以正常工作。你可以参考xbl中的 uefiplat.cfg 。 需要注意的是仅仅复制粘贴是没有用的,你需要做额外的修复。
显示
xbl已经初始化了设备上与显示有关的硬件,并提供了一个framebuffer。故而我们使用SimpleFbDxe以避免麻烦。
EFI驱动
正如我们在前面提到的那样,xbl是基于UEFI的。所以我们可以从中提取出二进制的EFI驱动,并把它们插入新的固件。然而像这样操作的话很多驱动都并不会工作,如按键、USB、PMIC等。万幸的是,UFS能正常工作,让我们得以继续下去。
Windows
就如X86平台上运行的Windows一样,Windows on Arm需要由固件提供的一系列特定的ACPI。简单来说,ACPI用来描述你的设备的硬件组成和相关的配置。
然而,不是随便拿一台WoA笔记本并提取其ACPI就完事了。当ACPI所描述的与真实硬件存在不相符的地方时,高通的驱动程序会感到十分困惑,并扔给你一个蓝屏。
修复ACPI是一个主要难题。
SDM 845UEFI引导镜像
GitHub项目地址 github.com/edk2-porting/edk2-sdm845/releases/
WOA-Drivers 驱动包
GitHub项目地址 github.com/edk2-porting/WOA-Drivers