Ich implementiere einen benutzerdefinierten seriellen Bus-Treiber für eine bestimmte ARM-basierte Linux-Platine (eigentlich ein benutzerdefinierter UART-Treiber). Dieser Treiber muss die Kommunikation mit einer bestimmten MCU am anderen Ende des Busses über ein benutzerdefiniertes Protokoll ermöglichen. Der Treiber wird nicht (und tatsächlich muss nicht) keine seiner Funktionen dem Benutzerbereich aussetzen, noch ist es möglich, es im Benutzerbereich überhaupt zu implementieren (daher die Notwendigkeit für den benutzerdefinierten Treiber anstelle des Standard-TTY-Subsystems).Implementierung korrekter Inter-Modul-Synchronisation im Linux-Kernel
Der Treiber implementiert das Kommunikationsprotokoll und UART liest/schreibt, und er muss eine Reihe von Funktionen auf höherer Ebene an seine Benutzer exportieren, damit diese mit der MCU kommunizieren können (zB read_register()
, drive_gpios()
, all diese Sachen) . Es wird nur einen Benutzer dieses Moduls geben.
Das aufrufende Modul muss auf den Abschluss der Operationen warten (die oben genannten read_register()
und andere). Ich überlege gerade, Semaphore zu verwenden: Das Benutzermodul ruft die Funktion meines Treibers auf, die die Übertragung initiiert und auf einen Semaphor wartet; Der IRQ-Handler meines Treibers wird Anfragen an die MCU senden und die Antworten lesen und, wenn sie fertig sind, an den Semaphor senden, wodurch das aufrufende Modul aufgeweckt wird. Aber ich bin nicht wirklich vertraut mit Kernel-Programmierung, und ich bin verblüfft von der Vielzahl von möglichen alternativen Implementierungen (Tasklets? Warteschlangen?).
Die Frage ist: ist mein Semaphor-Ansatz OK oder zu naiv? Was sind die möglichen Alternativen? Gibt es irgendwelche Fallstricke, die ich vermisse?
Semaphore sollten die Arbeit von dem, was ich verstehe, zu besseren Linux Interna verstehen bitte beziehen Sie sich auf nettes Buch "Linex Kernel-Entwicklung 3rd Edition", die als kostenlose PDF verfügbar ist und auf dem neuesten Stand (.39 Kernel glaube ich). Dieses Buch geht nicht wirklich tief, aber es erklärt Grundprinzipien und zeigt Optionen. Viel Spaß beim Hacken. – AoeAoe
Ein schönes Buch, danke! Wenn jemand anderes interessiert ist, würde ich auch vorschlagen, Linux Drivers Development und Linux Kernel Module Development zu erwerben (beide sind online kostenlos verfügbar) –