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

时间:2017-10-06 16:48:02

标签: linux-kernel uefi

我正在仅在UEFI模式下的x86_64 firwmare上启动编译为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

返回“没有这样的设备”(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()将始终向我返回false,因为CONFIG_X86_64=nCONFIG_EFI_MIXED取决于CONFIG_X86_64=y

在这些条件下,有没有可以让我阅读efivars的解决方法?

约束:

  • 仅具有UEFI模式的x86_64固件;
  • GRUB x86_64-efi将启动Linux;
  • Linux内核v3.18.48(可能已修补),32位。

2 个答案:

答案 0 :(得分:1)

不,32位操作系统无法进行64位UEFI调用。

我毫不犹豫地说任何不能在软件中完成,但这几乎是不可能的。如果不切换到64位模式,则无法进行64位UEFI调用,这在32位操作系统启动后很难完成。

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

答案 1 :(得分:0)

借助通过 grub-efi-amd64-signed 安装的软件包 chroot,我能够在 64 位 EFI 机器上启动 32 位 Ubuntu。 请参阅此处的 HowTo(德语):https://wiki.ubuntuusers.de/Howto/Installation_von_32-Bit_Ubuntu_auf_EFI-System/

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