2013-03-14 2 views
3

Есть ли способ создать блочное устройство через пользовательское пространство в OSX (10.8+), без сторонних библиотек (FUSE и т. Д.)?OSX User Space Device FIle

Я пытаюсь создать инструмент пользовательского пространства. Идея заключается в том, что пользователь поставляет файл в инструмент, и инструмент создает виртуальный интерфейс. Всякий раз, когда интерфейс записывается, инструмент применяет операцию к данным, а затем записывает в исходный файл. Всякий раз, когда интерфейс считывается, инструмент считывает из исходного файла и применяет обратную операцию.

Мне не обязательно требуется блок-устройство. Инструменту необходимо создать какой-то виртуальный интерфейс, который можно рассматривать как файл, то есть его можно открыть и сохранить другим приложением.

Я просмотрел подпрограммы пользовательского пространства набора I/O Kit, но ничего не показалось вам притягательным, так как создание виртуального устройства USB/FireWire/MMC/SCSI кажется чрезмерным.

ответ

2

Ближайшая вещь, о которой я могу думать, не обращаясь к пространству ядра, это фиолетовый или именованный канал - это, по сути, труба с именем файла. К сожалению, будучи трубой, вы не можете искать и т. Д. - вы можете просто открыть fifo для чтения в одном процессе и для записи в другом. Вы создаете их либо с помощью утилиты командной строки mkfifo, либо с помощью функции mkfifo() C.

Существуют также сокеты домена UNIX, которые похожи на IP-сокеты, но снова идентифицируются именем файла, а не сетевой конструкцией. Они могут быть прочитаны и написаны с обоих концов, но снова не ищут.

Что касается фактического выполнения функций ops для vnode (ядро представления файла в OSX), я считаю, что вам нужно сбросить на ядро. Обратите внимание, что набор ввода/вывода не является абсолютно необходимым для создания блочного устройства - если узлов устройства BSD достаточно, и вам не нужна поддержка аппаратного обеспечения или выгрузки томов и т. Д., Вы можете просто создать узел с bdevsw_add(), поставляя вектор ops в качестве параметра. (для устройства хранения на основе ввода-вывода Kit, IOMediaBSDClient делает это автоматически, вместе с созданием символьного устройства с cdevsw_add_with_bdev()). Еще один, более сложный вариант - реализовать свою собственную файловую систему.

+0

Привет, в вашем ответе вы упомянули о возможности создания файловой системы. Если я беспокоюсь только о низкоуровневых операциях так же, как «прочитанная страница/запись страницы/страницы в каталоге/странице», возможно ли установить стандартную файловую систему (HFS +) поверх файла устройства ('/ dev/my_device '), и наслаждаться обоими мирами? – Zohar81

+0

@ Zohar81 Я не понимаю, почему не так, как VFS происходит на уровне BSD, но я этого не пробовал. Если вам нужна поддержка таблицы разделов, вам обязательно нужно будет использовать устройство хранения блоков IOKit. – pmdj