Мне нужно использовать функцию, подобную рабочей очереди, в Mac OSX (драйвер режима ядра), и я ищу способ добавить работу в очередь для последующей обработки потоком ядра. Концептуально это то же самое, что и функция рабочей очереди, доступная в ядре Linux. Есть ли что-то подобное и в ядре XNU?
есть ли функция рабочей очереди в ядре xnu?
Ответы (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, но не подходит для вторичных обработчиков прерываний.