2012-04-25 5 views
5

В KEXT я слушаю файл, закрывая через vnode или прослушиватель области файла. Для некоторых (очень немногих) файлов мне нужно отправить путь к файлу моего системного демона, который выполняет некоторую обработку (это должно произойти в демонах) и возвращает результат обратно в KEXT. Закрытие вызова файла необходимо заблокировать, пока я не получаю ответ от демона. На основе результата мне нужно выполнить некоторую операцию при закрытом вызове и успешно завершить успешный вызов. Существует много дискуссий по теме, связанной с KEXT, на форуме. Но они не являются окончательными и кажутся очень старыми (2002 год). Это требование может быть обработано FtlSendMessage(...) Win32 API. Я ищу эквивалент, что на MacЛучший способ связи от KEXT до Daemon и блокировать до тех пор, пока результат не будет возвращен из Daemon

Вот что я смотрел и хочу резюмировать мое понимание:

  1. Маха сообщение: Обеспечивает очень хороший способ двусторонней связи с использованием отправителя и ответить порты с очередью mechansim. Однако API-интерфейсы машинного сообщения (например, mach_msg, mach_port_allocate, bootstrap_look_up), как представляется, не являются KPI. Может использоваться mach API mach_msg_send_from_kernel, но это само по себе не поможет в двунаправленной связи. Правильно ли я понимаю?
  2. IOUserClient: Это, скорее всего, будет связано с передачей из пользовательского пространства в KEXT и последующим обратным вызовом из KEXT. Я не нашел способ инициировать общение с KEXT до демона, а затем ждать результата от демона. Я что-то упускаю?
  3. Розетки: Это может быть последний вариант, так как мне нужно будет реализовать весь двунаправленный канал связи от KEXT до Daemon.
  4. ioct l/sysctl: Я не знаю много о них. Из того, что я прочитал, его не рекомендуется использовать, особенно для двунаправленной связи.
  5. RPC-Mig: Опять же, я не знаю много о них. Выглядит сложнее из того, что я видел. Не уверен, что это рекомендуется.
  6. KUNCUserNotification: Это, как представляется, просто уведомление пользователя от KEXT. Это не соответствует моему требованию.

Поддерживаемая платформа (10,5 года). Поэтому, глядя на это требование, может ли кто-нибудь предложить и предоставить некоторые указатели на эту тему?

Заранее спасибо.

+0

Вы нашли пример того, как реализовать это с помощью сокетов? – gbdavid

ответ

3

Образец, который я использовал для этого процесса, заключается в том, чтобы процесс пользовательского пространства инициировал соединение сокета с KEXT; KEXT создает новый поток для обработки сообщений по этому сокету и спит поток. Когда KEXT обнаруживает событие, на которое ему нужно ответить, он пробуждает поток сообщений и использует существующий сокет для отправки данных демонам. При получении ответа управление передается обратно в запрашивающий поток, чтобы решить, следует ли наложить вето на операцию.

Я не знаю ни одного ресурса, который будет описывать всю эту картину полностью, но соответствующая КПЭ обсуждается в Mac OS X Internals (который кажется старое, но КПЭ не изменилась, так как это было написано) и OS X and iOS Kernel Programming (который я был техническим рецензентом).

+0

Спасибо Грэм за ваши входы. Я буду исследовать использование опции сокета ядра для связи между KEXT и Daemon. Еще раз спасибо. – RHK

0

Если вы хотите использовать сокет, установленный с ctl_register() на стороне KExt, тогда остерегайтесь: связь с kext на пользовательское пространство (через ctl_enqueuedata()) работает нормально. Однако противоположное направление является ошибкой 10.5.x и 10.6.x.

Через 70,000 или 80,000 send() вызовов с SOCK_DGRAM в области PF_SYSTEM полных чистых разрывов стека с катастрофическими последствиями для всей системы (жесткий выключая единственный выход). Это было исправлено в 10.7.0. Я обходю, используя setsockopt() в нашем проекте для направления от пользовательского пространства до kext, поскольку мы отправляем только очень маленькие данные (просто чтобы разрешить/запретить некоторые операции).

0

Для чего это стоит, autofs использует то, что я предполагаю, что вы имеете в виду под «RPC-Миг», так что это не слишком сложно (MIG используется для описания вызовов RPC, и код заглушки он генерирует ручки вызова соответствующей Mach-message для отправки и получения кода, существуют специальные опции для генерации заглушек в режиме ядра).

Однако он не нуждается в поиске, так как automountd (демон пользовательского режима, к которому отправляет сообщения autofs kext) имеет назначенный ему специальный порт. Выполнение поиска для поиска произвольной службы будет сложнее.

 Смежные вопросы

  • Нет связанных вопросов^_^