Как прервать приложение пользовательского пространства в Linux

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

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

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


person lixunx    schedule 05.12.2014    source источник


Ответы (1)


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

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

См. http://www.xml.com/ldd/chapter/book/ch05.html#t3 для подробного примера.

person Nemo    schedule 08.12.2014