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=y
和CONFIG_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=n
和CONFIG_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在操作系统启动后通常不会持续存在,这将是一个重大变化。
是的,最简单的解决方案是让GRUB读取变量并通过内核引导参数传递。听起来不那么简单... – lseki