Связывать Dylibs в Kexts?

Я написал kext для OS X, который реализует USB-фрейм-буфер с использованием (IOKit) libusb и jpeglib. Оба они являются dylibs, и по какой-то причине они не будут правильно связываться в XCode, и ОС не разрешит зависимости, когда попытается загрузить kext.

Основой всего этого является то, что Samsung создает ЖК-рамку, которая может выступать в качестве второго монитора; единственная проблема заключается в том, что это не DisplayLink или какой-либо другой известный протокол - драйвер только для Windows выплевывает пользовательский заголовок, и каждый кадр кодируется в формате JPEG и отправляется на устройство. Моя реализация делает это для OS X, но я использовал libusb, так как это устройство с кадровым буфером и его нужно загружать при запуске - хотел больше иметь дело с управлением дисплеем, чем с обнаружением "горячей" замены и требованиями IOKit к USB-устройству.

Спасибо за любую помощь! Вы, ребята, потрясающие.

1 ответ

Боюсь, что кексы не являются строго динамически связанными между собой (они загружаются во время выполнения, но их структура статична), и, за исключением некоторых героических пользовательских усилий компоновщика / загрузчика, вы не сможете загрузить dylib в пространство ядра.

Насколько я знаю, смысл libusb - писать драйверы USB в пространстве пользователя. Поэтому мне непонятно, почему вы сначала создаете kext (который будет работать в пространстве ядра). Есть ли какой-то элемент устройства, который не может быть запущен из пользовательского пространства с помощью libusb? Если это так, попробуйте создать kext только для этого компонента и поместить оставшуюся часть драйвера в демон пользовательского пространства.

Если разделение между libusb и компонентом, работающим только с ядром, не сработает, вам потребуется использовать USB-интерфейс IOKit пространства ядра в своем kext. Вы, вероятно, можете найти библиотеку JPEG, которая будет компилироваться статически и которая может быть использована в kext (хотя проблема не в наличии полной библиотеки libc), но я сильно подозреваю, что вы на самом деле не хотите этого делать - JPEG (де) Сжатие, похоже, должно быть сделано в пространстве пользователя.

У меня складывается впечатление, что вам вообще не нужно заниматься созданием своего собственного kext - создать приложение командной строки (или GUI), связать с ним libusb и jpeglib и делать все это в пространстве пользователя. Если вы хотите, чтобы это ушло в фоновый режим, используйте обычный метод fork(), чтобы демонизировать ваш процесс, используя канал, сокет или другой IPC для связи с потребителями вашего драйвера. Если вы можете как-то избежать написания одной строки кода ядра, я настоятельно рекомендую придерживаться пользовательского пространства. Отладка кода ядра - большая проблема, и чем сложнее драйвер, тем хуже он становится (я бы посчитал, что сжатие / сжатие JPEG является сложным).

Как обычно, была бы полезна дополнительная информация, особенно по тем частям, которые я упомянул.

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