Файл устройства 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()
) Другой, более сложный вариант - реализовать собственную файловую систему.