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=y
和 CONFIG_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=n
和 CONFIG_EFI_MIXED
取决于 CONFIG_X86_64=y
.
在这些情况下,是否有任何解决方法可以让我阅读 efivars?
限制条件:
- x86_64 仅 UEFI 模式的固件;
- GRUB x86_64-efi 将启动 Linux;
- Linux 内核 v3.18.48(可能已打补丁),32 位。
不,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 更新时,我有时会遇到麻烦。
我正在 x86_64 固件上以仅 UEFI 模式启动编译为 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
其中 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=n
和 CONFIG_EFI_MIXED
取决于 CONFIG_X86_64=y
.
在这些情况下,是否有任何解决方法可以让我阅读 efivars?
限制条件:
- x86_64 仅 UEFI 模式的固件;
- GRUB x86_64-efi 将启动 Linux;
- Linux 内核 v3.18.48(可能已打补丁),32 位。
不,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 更新时,我有时会遇到麻烦。