用于创建/注册虚拟存储设备的 IOKit 驱动程序



我目前正在学习如何编写os x内核扩展(在Xcode中(,如果我有任何事实错误,很抱歉。我正在寻找一个如何编写 IOKit 驱动程序的示例,该驱动程序可以在系统中注册虚拟存储设备(如 USB 硬盘驱动器、U 盘或 SD 卡等(,该设备将在查找器中显示为普通设备驱动器,我相信它会在 IOMedia 区域附近并使用类 IOBlockStorageDevice,但我不完全确定。我希望内核能够处理所有功能,如读写操作、挂载和弹出等......

最后,我想创建设备驱动程序来检测Android设备(使用MTP(并将其安装为存储设备,允许用户在查找器中读取和写入它,驱动程序将处理将数据发送到手机的读写。(我知道可能还有其他司机这样做,但我想自己做(但现在我只想知道如何制作可以生成虚拟 USB 驱动器的驱动程序。

谢谢你容忍我

例如虚拟磁盘的示例代码,Ole Henry Halvorsen和Douglas Clarke的"OS X and iOS Kernel Programming"一书中的示例代码第14章中的"Ramdisk"项目是一个合理的起点。

IOMedia类的实例通常由存储子系统自动创建;通常不需要对其进行子类化。子类化IOBlockStorageDevice通常是块存储设备驱动程序的方法,无论它们是虚拟的还是物理的。(例如,macOS 的磁盘映像 (dmg( 处理是在IODiskImageBlockStorageDeviceOutKernel中实现的,也是IOBlockStorageDevice的一个子类,而 USB 大容量存储驱动程序是基于 SCSI 的,所以IOSCSIPeripheralDeviceType00会创建一个IOBlockStorageServices,而又是IOBlockStorageDevice的子类(

但是,我应该指出,对于您的最终目标,块存储设备可能不是一个好的解决方案。据我所知,MTP 是基于文件的,并不代表块设备。因此,要使应用程序查看块设备上的文件,您需要在虚拟块设备驱动程序中模拟某种文件系统后端,即使您选择像 FAT 这样简单的东西,这也将变得不必要地复杂。

将其实现为文件系统驱动程序可能是更好的方法。FUSE 可能是一个很好的起点;如果您发现这过于限制,您可以随时将其转换为"真正的"基于内核的VFS kext。

最新更新