我需要创建一个驱动程序,其行为类似于软件 RAID。例如,驱动程序将需要与多个物理磁盘(甚至可能是网络资源)进行通信,并且对于操作系统来说应该看起来像一个磁盘。
所以两个主要问题是:
1) EFI 驱动程序是否被 Windows、MacOS X 和 Linux 识别和支持?例如,这些系统可以使用 EFI 磁盘驱动程序吗?
2)理论上是否可以为EFI编写这样的驱动程序?我主要关心的是从您自己的虚拟磁盘驱动程序访问其他 EFI 磁盘驱动程序的可能性。
我只有时间快速回复,请原谅我的简洁!
据我所知,只有这些操作系统的引导加载程序使用 UEFI 驱动程序堆栈来加载本机操作系统内核和驱动程序。一旦引导加载程序调用了ExitBootServices(),大多数驱动程序都会被卸载,并且(根据规范)此后可能不会调用基于句柄的驱动程序,这意味着没有磁盘驱动程序。与传统的引导加载程序一样,UEFI 引导加载程序仅使用足够长的基本驱动程序来加载操作系统的本机驱动程序。如果您愿意,您也可以在预引导环境中使用这些驱动程序(尽管听起来您不这样做!)。
TL;DR不,这些系统除了加载操作系统之外不能使用 UEFI 驱动程序。
您绝对应该能够在现有堆栈之上分层您的 UEFI 驱动程序。如果您以前没有使用过 UEFI,这可能会有点棘手,但从概念上讲,该系统是非常模块化的。Internet 上似乎有许多资源可以帮助 您 ,而且总是有Beyond BIOS: Developing with the Unified Extensible Firmware Interface by Vincent Zimmer。
就测试而言,您可以使用英特尔 EDKII中提供的模拟器之一(如果您在 Windows 上,您可能应该使用 Nt32 项目,它适用于 Visual Studio)。
TL;DR是的,您可以编写此驱动程序,但它仅适用于预引导环境中的引导加载程序和应用程序。
1) EFI 驱动程序是否被 Windows、MacOS X 和 Linux 识别和支持?例如,这些系统可以使用 EFI 磁盘驱动程序吗?
不,一旦你运行 ExitBootServices(),它就会消失。您可以拥有一个 RunTimeDXE 驱动程序,但这些驱动程序非常有限。他们无法分配内存(VM Map 由操作系统控制)并且他们无法再访问任何 EFI API。它们可用于将信息从固件传输到操作系统,但更好的选择是私有 EFI 表。
2)理论上是否可以为EFI编写这样的驱动程序?我主要关心的是从您自己的虚拟磁盘驱动程序访问其他 EFI 磁盘驱动程序的可能性。
引导加载程序是唯一能够使用 EFI 驱动程序的。如果要进入操作系统级别,则需要编写自己的操作系统驱动程序,使用 EFI 系统表从 EFI 驱动程序获取信息。此类示例是全盘加密实现。
理论上,您需要编写基于 EFI 块驱动程序、Windows IO 过滤器或 BUS/卷驱动程序、OS X IOStorageFamily KEXT 和 Linux 块设备驱动程序,所有这些都使用 EFI 表、变量或运行时DXE。
由于从 EFI 中可用的平面寻址转换为虚拟内存映射,RuntimeDXE 实现非常困难。