未加载 Realtek UEFI UNDI 驱动程序
Realtek UEFI UNDI Driver not loaded
我正在开发应该与网络一起工作的 efi 应用程序。
为了方便起见,我将 EFI\Boot\bootx64.efi
文件更改为 efi shell 以使系统启动时默认启动 efi shell。
当 shell 启动时,我 运行 命令 ifconfig -l
查看可用的网络接口设置。
我遇到了以下行为。
当系统默认启动我的 shell (EFI\Boot\bootx64.efi
) 时,我没有看到任何网络接口,运行ning 命令 ifconfig -l
。但。
如果我使用(在 HP 笔记本电脑上测试)“从文件启动 menu/boot”手动启动相同的文件 (EFI\Boot\bootx64.efi
),shell 启动并且 ifconfig -l
显示网络接口 eth0
.
因此,使用默认系统启动或从启动菜单手动加载相同的 efi 文件会给我不同的网络可用性结果。
我决定比较两种情况下加载的驱动程序列表。
我注意到,当系统以默认模式启动时(不是通过从启动菜单手动指定设备)驱动程序 Realtek UEFI UNDI Driver
不存在。当我从文件 (EFI\Boot\bootx64.efi
) 手动启动时,它已加载。
我认为没有这个驱动'Realtek UEFI UNDI Driver'是原因。为了检查这一点,我做了以下测试:
- 从网络下载Realtek UNDI驱动(
RtkUndiDxe.efi
)
- 已将其复制到 efi 引导文件夹 (
EFI\Boot\
)
- 系统默认启动进入shell并通过命令
load 'RtkUndiDxe.efi
手动加载Realter UNDI驱动程序
结果,出现了网络接口。
谁能解释一下,为什么默认系统启动时 Realtek UEFI UNDI Driver 没有加载?或者我如何让系统从我自己的 efi app/driver?
加载它自己的 Realtek UEFI UNDI Driver
某些驱动程序未加载到 BIOS 的 “快速启动” 选项中。当我关闭它时,现在加载了网络驱动程序和其他一些。
但您也可以使用 EFI 固件卷 2 协议,即使您自己打开了 “快速启动” 选项,也可以加载所需的驱动程序正如 MiSimon 在对我的问题的评论中所说。
You can use the LoadImage and StartImage functions inside
EFI_BOOT_SERVICE (gBS). You must provide the correct device path to
the LoadImage function, you have to search the correct firmware file
first using the EFI_FIRMWARE_VOLUME2_PROTOCOL 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 ...
我正在开发应该与网络一起工作的 efi 应用程序。
为了方便起见,我将 EFI\Boot\bootx64.efi
文件更改为 efi shell 以使系统启动时默认启动 efi shell。
当 shell 启动时,我 运行 命令 ifconfig -l
查看可用的网络接口设置。
我遇到了以下行为。
当系统默认启动我的 shell (EFI\Boot\bootx64.efi
) 时,我没有看到任何网络接口,运行ning 命令 ifconfig -l
。但。
如果我使用(在 HP 笔记本电脑上测试)“从文件启动 menu/boot”手动启动相同的文件 (EFI\Boot\bootx64.efi
),shell 启动并且 ifconfig -l
显示网络接口 eth0
.
因此,使用默认系统启动或从启动菜单手动加载相同的 efi 文件会给我不同的网络可用性结果。
我决定比较两种情况下加载的驱动程序列表。
我注意到,当系统以默认模式启动时(不是通过从启动菜单手动指定设备)驱动程序 Realtek UEFI UNDI Driver
不存在。当我从文件 (EFI\Boot\bootx64.efi
) 手动启动时,它已加载。
我认为没有这个驱动'Realtek UEFI UNDI Driver'是原因。为了检查这一点,我做了以下测试:
- 从网络下载Realtek UNDI驱动(
RtkUndiDxe.efi
) - 已将其复制到 efi 引导文件夹 (
EFI\Boot\
) - 系统默认启动进入shell并通过命令
load 'RtkUndiDxe.efi
手动加载Realter UNDI驱动程序 结果,出现了网络接口。
谁能解释一下,为什么默认系统启动时 Realtek UEFI UNDI Driver 没有加载?或者我如何让系统从我自己的 efi app/driver?
加载它自己的Realtek UEFI UNDI Driver
某些驱动程序未加载到 BIOS 的 “快速启动” 选项中。当我关闭它时,现在加载了网络驱动程序和其他一些。
但您也可以使用 EFI 固件卷 2 协议,即使您自己打开了 “快速启动” 选项,也可以加载所需的驱动程序正如 MiSimon 在对我的问题的评论中所说。
You can use the LoadImage and StartImage functions inside EFI_BOOT_SERVICE (gBS). You must provide the correct device path to the LoadImage function, you have to search the correct firmware file first using the EFI_FIRMWARE_VOLUME2_PROTOCOL 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 ...