1

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

+1

** 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

Antwort

2

aus dem Kernel zu User-Space :) Aufruf ist sicherlich möglich, beispielsweise ein User-Space Prozess Laichen (man denke an die Kernel startet init, udev und einige mehr) oder unter Verwendung von IPC (netlink und andere).

Dies ist jedoch nicht das, was Sie wollen.

Wie die Leute zu Ihnen erwähnt haben, ist der Weg zu gehen, ein Char-Gerät zu haben und dann Standard-und bekannte select/poll Semantik verwenden. Ich glaube nicht, dass Sie sich Sorgen darüber machen sollten, dass dies langsam ist, wenn Sie davon ausgehen, dass Ihr Userspace-Programm gut konzipiert ist.

In der Tat, dieser Entwurf ist so verbreitet, dass es ein bestehender Rahmen genannt UIO oder Userspace I/O (siehe here und here).

0

Es tut mir leid, ich weiß nicht, ob Sie Userland Callbacks aus dem Kernelraum aufrufen können, aber Sie können Ihre User Space Anwendung auf verschiedene Signale wie SIGKILL, SIGTERM, etc., die Sie an eine senden können User-Space-Prozess aus dem Kernel-Space.

Es gibt auch SIGUSR1 und SIGUSR2, die für die benutzerdefinierte Verwendung/Implementierung reserviert sind. Ihre Anwendung könnte auf SIGUSR1 und/oder SIGUSR2 hören. Dann müssen Sie nur nachsehen, warum Sie benachrichtigt wurden.

Ich weiß, es ist nicht genau das, was Sie wollten, aber vielleicht ist es ein wenig Hilfe. ;)

0

Endlich habe ich mich für etwas anderes entschieden, da das Launieren von Userland-Prozessen viel zu langsam und fehlerträchtig war.

Ich habe mein Software-Design geändert, damit das Benutzerland ein ioctl aufruft, um die letzten Ereignisse zu erhalten. Das ioctl blockiert über Wartewarteschlangen und schläft, während die Ereigniswarteschlange leer ist.

Danke für Ihre Antwort Jungs!

Verwandte Themen