Подтвердить что ты не робот

Обработка прерывания Linux в пространстве пользователя

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 4

Необходимо вызвать косвенный код пользователя.

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

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

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

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

Я нашел только один отчет о меньшинстве в теме vfio (http://lxr.free-electrons.com/source/Documentation/vfio.txt): fooobar.com/info/323032/...

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

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

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

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

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

Linux-пользовательский интерфейс PCI-драйвера

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