Ich implementiere ein Kernel-Modul, das GPIOs antreibt. Ich biete dem Benutzerland die Möglichkeit, Aktionen über ioctls auszuführen, aber ich möchte tiefer gehen und ein "Benachrichtigungssystem" einrichten, bei dem das Kernelmodul bei einem erkannten Ereignis direkt mit dem Benutzerland Kontakt aufnimmt. Zum Beispiel eine Wertänderung an einem GPIO (bereits durch Interrupt im Kernel-Modul gemeldet).Benachrichtigen Userland von einem Kernel-Modul
Der Hauptzweck ist es, aktive Polling-Schleifen im Userland zu vermeiden, und ich weiß wirklich nicht, wie man Kernel-Modul und Userland verbindet, um Geschwindigkeit, Effizienz und mehr oder weniger passiv zu halten.
Ich kann nichts über eine gute Praxis in diesem Fall finden. Einige Leute sprechen über eine Zeichenschnittstelle (über eine Datei in/dev) und führen eine Blockierung von read() aus dem Benutzerland aus und werden so benachrichtigt, wenn der Lesevorgang zurückkehrt.
Diese Methode sollte gut genug sein, aber im Falle von sehr schnellen GPIO-Wertänderungen, wäre das Benutzerland möglicherweise zu langsam, um eine Benachrichtigung zu verarbeiten und würde schließlich durch Tonnen von Benachrichtigungen zerschmettert, die es nicht verarbeiten kann.
Also ich bin auf der Suche nach einer Methode wie Userland Callback-Funktionen, die aus dem Kernel-Modul für ein Ereignis aufgerufen werden konnte.
Was denkst du, ist die beste Lösung? Gibt es eine Möglichkeit, dieses spezifische Problem zu lösen?
Danke
** Benutzercode konnte im Interrupt-Kontext nicht ausgeführt werden **. (User-Space-Signal-Handler verhindern anderen Code, aber es ist kein Interrupt-Kontext aus der Sicht des Kernels.) So haben Sie zwei Möglichkeiten zur Benutzerbenachrichtigung: 1) einen Thread, der auf einen * blockierenden Anruf wartet * oder 2) * einen signal * (z. B. * SIGUSR1 *) vom Kernel, so dass der User Space-Signal-Handler ausgeführt wird. – Tsyvarev