Файл устройства OSX Userspace

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам