2016-05-09 9 views
3

Ich habe einen Wi-Fi-Treiber (eine .ko-Datei) für Embedded-Linux-System und es gibt zwei identische Wi-Fi-Geräte auf meiner Platine. Nach dem Einspielen der .ko-Datei in den Kernel kann das System diese beiden Wi-Fi-Geräte steuern.Globale Variablen in Linux .ko für mehrere Geräte

Meine Frage ist: Wenn der Quellcode des Treibers globale Variablen (und statische Variablen) enthält, teilen diese beiden Geräte den gleichen Satz von Variablen? Oder gibt es für jedes Gerät zwei Treiberinstanzen?

Danke!

+0

Ich habe letzte Woche an meinem Board getestet. Der Treiber wird nur einmal initialisiert (module_init) und zweimal geprüft, da zwei Geräte an der Platine angeschlossen sind. Globale Variablen (statische Variablen am Anfang der .c-Datei) werden von zwei Geräten gemeinsam genutzt. Ich kopiere den Code weiter in ein anderes Verzeichnis und ändere den Treibernamen (sowie den Namen der Ressourcen im Code) und kompiliere. Linux kann zwei .ko-Treiber laden, und jeder Treiber wird einmal gestartet. Der erste integrierte Treiber wird zweimal geprüft, während der zweite nicht geprüft wird. –

Antwort

5

Linux-Kernel-Module sind genauso in den Kernel eingebunden wie alle anderen Dateien in C. Wenn sie globale Variablen haben, gibt es nur eine Kopie jeder globalen Variable. Sie können sogar globale Variablen aus anderen Modulen verwenden.

+0

Danke. Wenn ich 'int a;' in einer .c-Datei eines Treibers definiere und ein anderes 'int a;' in einer anderen .c-Datei eines anderen Treibers definiere, wird ein Neudefinitionsfehler ausgegeben, wenn ich den Kernel kompiliere? –

+0

@guanboshen Ich bin nicht sehr vertraut mit dem Erstellen von Kernel-Modulen, aber ich würde erwarten, dass Sie einen Fehler bei der Kompilierung erhalten, wenn beide Treiber in den Kernel kompiliert werden, und einen Fehler beim Laden des Moduls, wenn einer oder beide ist ein Modul. – immibis

+2

Nein, globale Variablen mit demselben Namen, aber von ** verschiedenen Modulen ** sind * nicht gemeinsam genutzt *. Wenn das Modul mit Hilfe von "insmod" in den Kernel geladen wird, wird die Verknüpfung entsprechend der Menge * exportierter Symbole * durchgeführt, die vom Kernel gesammelt und alle Module bereits geladen sind. Man kann kein Modul laden, welches (mit EXPORT_SYMBOL) Symbol exportiert, das von bereits geladenem Modul exportiert wird. Symbole mit globaler Sichtbarkeit werden standardmäßig nicht exportiert, sodass sie nicht gemeinsam genutzt werden. – Tsyvarev

3

Es ist normal, dass einzelne Treiber mehrere Geräte unterstützen.

Während einige Modulvariablen von verschiedenen Geräten gemeinsam genutzt werden, werden die meisten Variablen in gerätespezifischen Strukturen gespeichert.

Wenn die Treiberfunktion für das Gerät "A" aufgerufen wird, akzeptiert sie den Zeiger auf die gerätespezifische Struktur "data-A". Mit diesem Zeiger extrahiert die Funktion Parameter von "A". Wenn dieselbe Funktion für das Gerät "B" aufgerufen wird, akzeptiert sie einen Zeiger auf eine andere gerätespezifische Struktur "Daten-B".