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