В Linux, каковы параметры обработки прерываний устройства в коде пространства пользователя, а не в пространстве ядра?
Обработка прерывания Linux в пространстве пользователя
Ответ 1
Опыт показывает, что можно писать хорошие и стабильные драйверы для практически любого PCI-адаптера. Это просто требует некоторой сложности и небольшого проксирующего слоя в ядре. UIO - это шаг в этом направлении, но если вы хотите правильно обрабатывать прерывания в пользовательском пространстве, то UIO может быть недостаточно, например, если устройство не поддерживает бит прерывания PCI-spec, который использует UIO.
Обратите внимание, что задержки процесса пробуждения - это несколько микросекунд, поэтому, если ваша реализация требует очень низкой задержки, тогда пользовательское пространство может быть перетаскиванием на нее.
Если бы я должен был использовать драйвер пользовательского пространства, я бы уменьшил ISR ядра до операции "disable and ack и wakeup-userpace", обработал прерывание внутри процесса пробуждения, а затем снова включил прерывание (конечно, путем записи в карту PCI-памяти из процесса пользовательского пространства).
Ответ 2
Существует UIO, но обработка должна выполняться в kernelspace. OTOH, если вам просто нужно заметить прерывание, вам не нужна часть ядра.
Ответ 3
Вы можете взглянуть на ГЛАВА 10: Обработка прерываний из Драйверы устройств Linux, третье издание.
Ответ 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-пользовательский интерфейс PCI-драйвера
Как сообщить прикладному программному обеспечению о том, что драйвер получил прерывание в Linux?