Связь ядра с пространством пользователя с низкой задержкой - PullRequest
0 голосов
/ 07 мая 2018
  • У меня есть модуль ядра, который получает прерывание (верхняя половина) от внешней смены контактов GPIO.
  • После получения прерывания модуль ядра должен проснуться или каким-либо образом вызвать функцию / поток в пользовательском пространстве, которое начнет обработку. Время очень ограничено.
  • Данные не нужно отправлять, только сигнал.
  • ЦП является многоядерным, приложение в пространстве пользователя будет привязано к одному ядру.

Существует так много способов взаимодействия между ядром и пользовательским пространством. Какой из них имеет наименьшую задержку? ( т.е. время между ISR и активацией функции ).

( Примечание: да, я могу их сравнить, потому что я задаю вопрос, потому что я могу не знать о всех возможных решениях )

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Стандартный способ для процесса, чтобы дождаться, пока ядро ​​разбудит его, - это использовать системный вызов poll () и обработчик прерываний драйвера вашего устройства, чтобы разбудить все ожидающие его потоки.

Наибольшая задержкаОперация, указанная в ваших 4 пунктах, пробуждает поток приложения, поэтому, если вам нужна еще более короткая задержка, вам нужно, чтобы поток пробуждался, но ожидал события.

Самый низкий механизм задержки, который я использовал, - это прерываниенаписать слово в процессе приложения и создать поток, читающий это слово и продолжающий работу при изменении значения.По сути, спин-блокировка между пользовательским пространством и пространством ядра.Используйте этот механизм, когда вы можете выделить ядро ​​ЦП для спин-блокировки или когда вы ожидаете, что время ожидания будет очень коротким.

Вы можете использовать ioctl () для передачи указателя пространства пользователя на драйвер так,оно знает, какое слово обновлять.

0 голосов
/ 07 мая 2018

Обработчик прерываний может записывать данные непосредственно в диапазон отображаемой памяти, предоставляемый процессом, пока процесс занят, ожидая изменения этой области памяти. Это может быть выполнено даже в верхней половине и должно обеспечить минимально возможную задержку. Убедитесь, что предоставленная ячейка памяти заблокирована в физической памяти, поскольку она не может быть выгружена во время isr.

Подобные подходы можно найти с сокетами пакетов и PACKET_MMAP, где обмен данными между ядром и пространством пользователя осуществляется через пространство общей памяти (см. Документация ядра ).

Если вы не заботитесь об управлении ресурсами через ОС (поскольку у вас есть только одно приложение, ожидающее внешнего ввода), вы также можете выбрать прямой доступ к оборудованию из пространства пользователя (с помощью iopl / inb / outb и friends).

...