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

问题描述:

我正在以仅UEFI模式在x86_64 firwmare上引导编译为x86_64-efi的GRUB EFI应用程序。32位内核如何从64位UEFI读取efivars?

此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有人预计说:

 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对我说:

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

在Linux源代码展望,因为CONFIG_X86_64=nCONFIG_EFI_MIXED取决于CONFIG_X86_64=y

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

约束:

  • x86_64的固件UEFI唯一方式;
  • GRUB x86_64-efi将推出Linux;
  • Linux内核v3.18.48(可能会打补丁),32位。

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

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

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

+0

是的,最简单的解决方案是让GRUB读取变量并通过内核引导参数传递。听起来不那么简单... – lseki