IOKit Driver для создания / регистрации виртуального устройства хранения - PullRequest
0 голосов
/ 20 октября 2018

В настоящее время я учусь писать расширения ядра OS X (в XCode), так что извините, если у меня есть какие-либо факты неправильно.Я ищу пример того, как я могу написать драйвер IOKit, который может зарегистрировать в системе виртуальное запоминающее устройство (например, жесткий диск USB, карту памяти USB или SD-карту и т. Д.), Которое будет отображаться как обычный диск устройства вЯ считаю, что это будет область IOMedia и использовать класс IOBlockStorageDevice, но я не совсем уверен.Я хочу, чтобы ядро ​​могло обрабатывать все функции, такие как чтение и запись, монтирование и извлечение и т. Д. ...

В самом конце я хочу создать драйвер устройства для обнаружения устройства Android (которое использует MTP).) и смонтировать его как устройство хранения, позволяющее пользователям читать и записывать в него в Finder, а драйвер будет обрабатывать чтение и запись, отправляя данные на телефон.(Я знаю, что, вероятно, есть другие драйверы, которые делают это, но я хотел бы сделать свой собственный) Но сейчас я просто хочу знать, как создать драйвер, который может генерировать виртуальный USB-накопитель.

Спасибо за установкусо мной

1 Ответ

0 голосов
/ 20 октября 2018

Например, код виртуального диска, проект «Ramdisk» из главы 14 примера кода из книги «Программирование ядра OS X и iOS» Оле Генри Халворсена и Дугласа Кларка является разумнымначальная точка.

Экземпляры класса IOMedia обычно создаются подсистемой хранения автоматически;вам обычно не нужно создавать его подкласс.Подклассы IOBlockStorageDevice - это обычно путь к драйверам блочных устройств хранения данных, будь то виртуальные или физические.(Например, обработка образа диска (dmg) в macOS реализована в IODiskImageBlockStorageDeviceOutKernel, также подклассе IOBlockStorageDevice, в то время как драйвер запоминающего устройства USB основан на SCSI, поэтому IOSCSIPeripheralDeviceType00 создает IOBlockStorageServices, который находится впревратить подкласс IOBlockStorageDevice)

Я должен отметить, однако, что для вашей конечной цели устройство хранения блоков, вероятно, не является хорошим решением.Насколько мне известно, MTP основан на файлах и не представляет собой блочное устройство.Поэтому для того, чтобы приложения могли видеть файлы на блочном устройстве, вам необходимо эмулировать какой-то бэкэнд файловой системы внутри драйвера вашего виртуального блочного устройства, что будет излишне сложно, даже если вы выберете что-то простое, например FAT.

Вероятно, это лучший подход для реализации этого в качестве драйвера файловой системы.FUSE, вероятно, будет хорошей отправной точкой для этого;если вы обнаружите это чрезмерное ограничение, вы всегда можете превратить его в «настоящий» ядро ​​VFS kext.

...