есть ли функция рабочей очереди в ядре xnu?

Мне нужно использовать функцию, подобную рабочей очереди, в Mac OSX (драйвер режима ядра), и я ищу способ добавить работу в очередь для последующей обработки потоком ядра. Концептуально это то же самое, что и функция рабочей очереди, доступная в ядре Linux. Есть ли что-то подобное и в ядре XNU?


person musfiqniaz    schedule 21.09.2017    source источник


Ответы (1)


Я не думаю, что есть прямой эквивалент как таковой, хотя я признаю, что не очень хорошо знаком с Linux, поэтому я не буду сравнивать и просто расскажу вам о том, что доступно на macOS/xnu.

Комплект ввода/вывода IOWorkLoops

Если вы создаете драйвер комплекта ввода-вывода, и особенно если вы пишете вторичный обработчик прерываний, вы будете использовать IOWorkLoops. Прерывания абстрагируются объектами IOEventSource, которые планируют вторичные обработчики прерываний для запуска в IOWorkLoop драйвера.

Каждый IOWorkLoop оборачивает один поток ядра, а также предоставляет механизм сериализации/блокировки для ресурсов, совместно используемых с этим потоком. Все задания, отправленные в рабочий цикл либо явно через объект рабочего цикла IOCommandGate, либо напрямую, либо в результате события IOEventSource, будут сериализованы. Обратите внимание, что IOCommandGate задания будут выполняться синхронно в вызывающем потоке, а не в потоке рабочего цикла.

Как всегда с внутренностями macOS/OSX, вы захотите посмотреть комментарии к заголовочному файлу и, возможно, реализацию в исходном коде xnu для получения подробной информации. Я лично нахожу IOWorkLoop немного неуклюжим для некоторых задач, но если вы имеете дело с устройствами PCI и т. д., у вас действительно нет выбора.

thread_call

Более легкий механизм фоновой работы — thread_call API. Он определен в <kern/thread_call.h> и поддерживает выполнение функций в фоновом потоке, управляемом ОС, опционально после задержки или с определенным приоритетом. Это, вероятно, ближе к тому, что вы знаете из Linux, имеет довольно простой API, но не подходит для вторичных обработчиков прерываний.

person pmdj    schedule 21.09.2017