2014-12-05 4 views
3

Я разрабатываю драйвер DMA для Linux. Приложение userpace хочет, чтобы драйвер выполнял асинхронную операцию (передача данных) и получал информацию только после завершения операции. Как приложение userpace получает информацию асинхронно?Как прервать приложение для пользовательского пространства в Linux

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

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

ответ

1

Обычный подход заключается в реализации функции poll для вашего драйвера устройства. Эта функция должна добавить задачу в одну или несколько очередей ожидания. Затем обработчик прерываний может пробудить задачу (задачи), ожидающие очереди (очередей).

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

См. http://www.xml.com/ldd/chapter/book/ch05.html#t3 для примера с привязкой.