Например, код виртуального диска, проект «Ramdisk» из главы 14 примера кода из книги «Программирование ядра OS X и iOS» Оле Генри Халворсена и Дугласа Кларка является разумнымначальная точка.
Экземпляры класса IOMedia
обычно создаются подсистемой хранения автоматически;вам обычно не нужно создавать его подкласс.Подклассы IOBlockStorageDevice
- это обычно путь к драйверам блочных устройств хранения данных, будь то виртуальные или физические.(Например, обработка образа диска (dmg) в macOS реализована в IODiskImageBlockStorageDeviceOutKernel
, также подклассе IOBlockStorageDevice
, в то время как драйвер запоминающего устройства USB основан на SCSI, поэтому IOSCSIPeripheralDeviceType00
создает IOBlockStorageServices
, который находится впревратить подкласс IOBlockStorageDevice
)
Я должен отметить, однако, что для вашей конечной цели устройство хранения блоков, вероятно, не является хорошим решением.Насколько мне известно, MTP основан на файлах и не представляет собой блочное устройство.Поэтому для того, чтобы приложения могли видеть файлы на блочном устройстве, вам необходимо эмулировать какой-то бэкэнд файловой системы внутри драйвера вашего виртуального блочного устройства, что будет излишне сложно, даже если вы выберете что-то простое, например FAT.
Вероятно, это лучший подход для реализации этого в качестве драйвера файловой системы.FUSE, вероятно, будет хорошей отправной точкой для этого;если вы обнаружите это чрезмерное ограничение, вы всегда можете превратить его в «настоящий» ядро VFS kext.