我正在仅在UEFI模式下的x86_64 firwmare上启动编译为x86_64-efi的GRUB EFI应用程序。
这个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说:
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=n
和CONFIG_EFI_MIXED
取决于CONFIG_X86_64=y
。
在这些条件下,有没有可以让我阅读efivars的解决方法?
约束:
答案 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 更新时,我有时会遇到麻烦。