Реализация опроса в модуле ядра Linux
У меня есть простой символьный драйвер устройства, который позволяет читать с нестандартного аппаратного устройства. Он использует DMA для копирования данных из памяти устройства в пространство ядра (а затем до пользователя).
read
Звонить очень просто. Он начинает запись DMA, а затем ожидает в очереди ожидания. Когда DMA завершает свою работу, обработчик прерываний устанавливает флаг и активирует очередь ожидания. Важно отметить, что я могу запустить DMA в любое время,даже до того, как устройство имеет данные для предоставления, Механизм DMA будет сидеть и ждать, пока появятся данные для копирования. Это хорошо работает. Я могу реализовать простой блокирующий вызов чтения в пространстве пользователя, и он ведет себя так, как я и ожидал.
Я хотел бы реализоватьpoll
так что я могу использоватьselect
Системный вызов в пользовательском пространстве, что позволяет мне одновременно контролировать и это устройство, и сокет.
Большинство изРесурсы Я могу найти наpoll
Сказать:
poll_wait
для каждой очереди ожидания, которая может указывать на изменение статусавернуть битовую маску, указывающую, доступны ли данныеВторая часть меня смущает. У большинства примеров, которые я видел, есть простой способ (сравнение указателя или бит состояния), чтобы проверить, доступны ли данные. В моем случае данныеникогда не будет доступен, пока я не начну DMAи даже после того, как я это сделаю, данные не будут немедленно доступны (может потребоваться некоторое время, прежде чем устройство действительно получит данные и для завершения DMA).
Как это будет реализовано тогда? Еслиpoll
Функция на самом деле запустить DMA, чтобы данные в конечном итоге стали доступны? Я предполагаю, что это сломало бы мойread
функция.