Реализация опроса в модуле ядра Linux

У меня есть простой символьный драйвер устройства, который позволяет читать с нестандартного аппаратного устройства. Он использует DMA для копирования данных из памяти устройства в пространство ядра (а затем до пользователя).

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

Я хотел бы реализоватьpoll так что я могу использоватьselect Системный вызов в пользовательском пространстве, что позволяет мне одновременно контролировать и это устройство, и сокет.

Большинство изРесурсы Я могу найти наpoll Сказать:

вызовpoll_wait для каждой очереди ожидания, которая может указывать на изменение статусавернуть битовую маску, указывающую, доступны ли данные

Вторая часть меня смущает. У большинства примеров, которые я видел, есть простой способ (сравнение указателя или бит состояния), чтобы проверить, доступны ли данные. В моем случае данныеникогда не будет доступен, пока я не начну DMAи даже после того, как я это сделаю, данные не будут немедленно доступны (может потребоваться некоторое время, прежде чем устройство действительно получит данные и для завершения DMA).

Как это будет реализовано тогда? Еслиpoll Функция на самом деле запустить DMA, чтобы данные в конечном итоге стали доступны? Я предполагаю, что это сломало бы мойread функция.

Ответы на вопрос(2)

Ваш ответ на вопрос