Umfrage in ein Linux-Kernelmodul implementieren

Ich habe einen einfachen Zeichengerätetreiber, mit dem Sie von einem benutzerdefinierten Hardwaregerät lesen können. Es verwendet einen DMA, um Daten aus dem Gerätespeicher in den Kernelspeicher zu kopieren (und dann an den Benutzer).

Dasread call ist sehr einfach. Es startet einen DMA-Schreibvorgang und wartet dann in einer Warteschlange. Wenn der DMA abgeschlossen ist, setzt der Interrupt-Handler ein Flag und aktiviert die Warteschlange. Das Wichtigste ist, dass ich den DMA jederzeit starten kann,noch bevor das Gerät Daten zur Verfügung stellt. Die DMA-Engine wartet, bis die zu kopierenden Daten vorliegen. Das funktioniert gut. Ich kann einen einfachen blockierenden Leseaufruf im Benutzerbereich implementieren und er verhält sich wie erwartet.

Ich möchte @ implementierpoll damit ich das @ benutzen kaselect Systemaufruf im Userspace, so dass ich sowohl dieses Gerät als auch einen Socket gleichzeitig überwachen kann.

Die meisten von denRessource Ich kann auf @ findpoll sag zu:

Anrufpoll_wait für jede Warteschlange, die eine Statusänderung anzeigen kann eine Bitmaske zurückgeben, die angibt, ob Daten verfügbar sind

Der zweite Teil ist das, was mich verwirrt. Die meisten Beispiele, die ich gesehen habe, bieten eine einfache Möglichkeit (einen Zeigervergleich oder ein Statusbit), um zu überprüfen, ob Daten verfügbar sind. In meinem Fall datawird niemals verfügbar sein, es sei denn, ich initiiere den DMA, und selbst wenn ich das mache, sind die Daten nicht sofort verfügbar (es kann einige Zeit dauern, bis das Gerät tatsächlich Daten hat und der DMA abgeschlossen ist).

Wie würde das denn umgesetzt werden? Sollte diepoll -Funktion starten Sie den DMA tatsächlich so, dass die Daten schließlich verfügbar werden? Ich stelle mir vor, das würde mein @ brechread Funktion.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage