Обработка прерываний Linux в пространстве пользователя - PullRequest
16 голосов
/ 02 ноября 2011

В Linux, каковы варианты обработки прерываний устройства в коде пространства пользователя, а не в пространстве ядра?

Ответы [ 4 ]

7 голосов
/ 03 ноября 2011

Опыт показывает, что можно написать хорошие и стабильные драйверы пользовательского пространства практически для любого адаптера PCI.Это просто требует некоторой сложности и небольшого уровня прокси в ядре.UIO - это шаг в этом направлении, но если вы хотите правильно обрабатывать прерывания в пользовательском пространстве, тогда UIO может быть недостаточно, например, если устройство не поддерживает бит отключения прерываний PCI-spec, на который полагается UIO.

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

Если бы я должен был реализовать драйвер пользовательского пространства, яуменьшит ISR ядра до операции «disable & ack & wakeup-userpace», обработает прерывание внутри процесса пробуждения, а затем снова включит прерывание (конечно, записав в сопоставленную память PCI процесс пользователя)).

5 голосов
/ 03 ноября 2011

Существует UIO , но обработка все еще должна выполняться в пространстве ядра. OTOH, если вам просто нужно заметить прерывание, вам не нужна часть ядра.

2 голосов
/ 12 декабря 2017

Должен косвенно вызывать код пользователя.

Kernel ISR указывает на прерывание путем записи файла / установки регистра / сигнализации. Приложение пользовательского пространства опрашивает это и продолжает с соответствующим кодом. Крайние случаи: больше или меньше прерываний, чем ожидалось (время ожидания / слишком много прерываний за интервал времени)

Абстракция файла Linux используется для соединения ядра и пространства пользователя. Это выполняется символьными устройствами и ioctl() вызовами. Некоторые могут предпочесть записи sysfs для этой цели.

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

Таким образом, прерывания не могут быть напрямую обработаны вне ядра. Например. разделяемая память может находиться в пользовательском пространстве, и с некоторыми настройками разрешений ввода / вывода можно сопоставлять адреса, поэтому U-I / O работает, но не для прямой обработки прерываний.

Я нашел только один «отчет меньшинства» в теме vfio (http://lxr.free -electrons.com / source / Documentation / vfio.txt ): https://stackoverflow.com/a/21197797/5349798

Похожие вопросы:

Запуск пользовательского потока в контексте прерывания в linux

Возможно ли в linux зарегистрировать обработчик прерываний из любой программы пользовательского пространства?

Ядро Linux: вызвать функцию обратного вызова в пространстве пользователя из пространства ядра

Прерывание Linux против опроса

Драйвер Linux для пользовательского пространства Linux

Как сообщить приложению пользовательского пространства, что драйвер получил прерывание в Linux?

2 голосов
/ 03 ноября 2011
...