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