0

我正在开发应该与网络一起使用的 efi 应用程序。为了方便起见,我将EFI\Boot\bootx64.efi文件更改为 efi shell,以便在系统启动时默认启动 efi shell。当 shell 启动时,我运行命令ifconfig -l来查看可用的网络接口设置。

我面临以下行为。

当系统默认启动我的 shell ( EFI\Boot\bootx64.efi) 时,我看不到任何网络接口,正在运行 command ifconfig -l。但。如果我EFI\Boot\bootx64.efi使用(在 HP 笔记本电脑上测试)“引导菜单/从文件引导”手动引导相同的文件 (),shell 将启动并ifconfig -l显示网络接口eth0

因此,使用默认系统启动或从启动菜单手动加载相同的 efi 文件会给我不同的网络可用性结果。

我决定比较两种情况下加载的驱动程序列表。我注意到,当系统以默认模式启动时(不是通过从启动菜单手动指定设备)驱动程序Realtek UEFI UNDI Driver不存在。当我从文件 ( ) 手动启动时EFI\Boot\bootx64.efi,它已加载。

我认为缺少此驱动程序“Realtek UEFI UNDI Driver”是原因。为了检查这一点,我做了以下测试:

  1. 从网络下载的 Realtek UNDI 驱动程序 ( RtkUndiDxe.efi)
  2. 将其复制到 efi 引导文件夹 ( EFI\Boot\)
  3. 系统默认启动进入shell并通过命令手动加载Realter UNDI驱动load 'RtkUndiDxe.efi 结果出现网络接口。

有人可以解释一下,为什么默认系统启动Realtek UEFI UNDI 驱动程序未加载?或者我如何让系统Realtek UEFI UNDI Driver从我自己的 efi 应用程序/驱动程序中加载它自己的?

4

1 回答 1

0

某些驱动程序未在 BIOS 的“快速启动”选项中加载。当我关闭它时,现在加载了网络驱动程序和其他一些驱动程序。

但是,即使您自己打开“快速启动”选项,您也可以加载所需的驱动程序,使用EFI 固件 Volume2 协议,如 MiSimon 在我的问题的评论中所说。

您可以在 EFI_BOOT_SERVICE (gBS)中使用LoadImageStartImage函数。您必须为 LoadImage 函数提供正确的设备路径,您必须首先使用EFI_FIRMWARE_VOLUME2_PROTOCOL协议搜索正确的固件文件。

下面是代码示例(没有错误处理和其他内容),它枚举固件驱动程序文件并将它们加载到内存中。

... Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiFirmwareVolume2ProtocolGuid, NULL, &NoFvHandles, &FvHandleList);
... Status = gBS->HandleProtocol(FvHandleList[Index], &gEfiFirmwareVolume2ProtocolGuid, (VOID **)&Fv); 
... NextStatus = Fv->GetNextFile(Fv, Key, &FileType, &NameGuid, &Attributes, &FileSize); 
... Status = Fv->ReadSection(Fv, &NameGuid, EFI_SECTION_USER_INTERFACE ...
... DevicePath = FvFileDevicePath(FvHandleList[Index], &NameGuid); 
... Status = gBS->LoadImage(FALSE, gImageHandle, DevicePath, NULL, 0, &ImageHandle); 
... Status = gBS->StartImage(ImageHandle ...
于 2021-05-04T11:41:33.837 回答