32 位内核如何从 64 位 UEFI 读取 efivars?

How could 32bit kernel read efivars from 64bit UEFI?

我正在 x86_64 固件上以仅 UEFI 模式启动编译为 x86_64-efi 的 GRUB EFI 应用程序。

此 GRUB 应用启动 32 位 Linux v3.18.48,CONFIG_EFIVAR_FS=yCONFIG_EFI_VARS=y

现在我想阅读一些 efivars,但我什至无法安装 efivarfs:

mount -t efivarfs efivarfs /sys/firmware/efi/efivars

其中 returns "No such device" (ENODEV)。

这是预期的,因为 dmesg 说:

No EFI runtime due to 32/64-bit mismatch with kernel

正在查看 Linux 来源:

     if (!efi_runtime_supported())
         pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n");
     else {
         if (efi_runtime_disabled() || efi_runtime_init())
             return;
     }

static inline bool efi_is_native(void)
{
    return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT);
}

static inline bool efi_runtime_supported(void)
{
    if (efi_is_native())
        return true;

    if (IS_ENABLED(CONFIG_EFI_MIXED) && !efi_enabled(EFI_OLD_MEMMAP))
        return true;

    return false;
}

似乎 efi_runtime_supported() 对我来说总是 return 错误,因为 CONFIG_X86_64=nCONFIG_EFI_MIXED 取决于 CONFIG_X86_64=y.

在这些情况下,是否有任何解决方法可以让我阅读 efivars?

限制条件:

不,32 位 OS 无法进行 64 位 UEFI 调用。

我不敢说什么不能在软件中完成,但这几乎是不可能的。如果不切换到 64 位模式,则无法进行 64 位 UEFI 调用,这在 32 位 OS 启动后非常困难。

一种可能的方法是更改​​ GRUB 以读取变量并保存它们,并为 OS 检索它们提供一个 32 位接口。由于 GRUB 在 OS 引导后通常不会持续存在,因此这将是一个重大变化。

借助 grub-efi-amd64-signed 安装包 chroot,我能够在 64 位 EFI 机器上启动 32 位 Ubuntu。 在此处查看操作方法(德语):https://wiki.ubuntuusers.de/Howto/Installation_von_32-Bit_Ubuntu_auf_EFI-System/

无论如何,当 GRUB 更新时,我有时会遇到麻烦。