Forum: PC-Programmierung Linux Kernel Module: Globale Variable?


von olpo (Gast)


Lesenswert?

Hallo,


ich schreibe gerade meinen ersten Linux-Treiber und brauche etwas 
Expertenrat. (Ja, das Buch "Linux Device Drivers" kenn ich.)

In meiner __init Funktion initialisiere ich eine Variable, auf die ich 
später auch in einer send() Funktion zugreifen muss.

Ist es nun elegant diese Variable als globale Variable in das Kernel 
Module zu schreiben, oder gibt es da etwas in "struct platform_driver" 
o.ä., wo die Variable besser aufgehoben ist?
1
#include <linux/init.h>
2
#include <linux/kernel.h>
3
4
int foo;
5
6
static int send(){...}
7
8
9
static SIMPLE_DEV_PM_OPS(myDrv_pm, myDrv_suspend, myDrv_resume);
10
static struct platform_driver myDrv = {
11
  .driver          = {
12
    .name    = "myDriver",
13
    .pm      = &myDrv_pm,
14
  },
15
};
16
17
18
static int __init init_myDrv(void)
19
{ ...
20
  foo = bar();
21
}
22
23
module_init(init_myDrv);


Danke

von Georg A. (georga)


Lesenswert?

Wenn schon, dann "static int foo" ;) Das hält den Namespace sauber... 
Kann man aber machen (und machen auch viele), wenn der Wert der Variable 
unabhängig von einer HW-Instanz und auch der Instanz eines 
Filedeskriptors ist und auch in Zukunft bleiben wird. Der Code wird 
nicht übersichtlicher, wenn man dauernd auf Instanz-Variablen mit -> 
zugreifen muss.

von olpo (Gast)


Lesenswert?

Supi, danke Georg.

Ich möchte mir aber den Fall offen halten, dass der Treiber sowohl für 
HW_1 und auch HW_2 nutzbar ist.
Sprich, "int foo" könnte für verschiedene Nutzer unterschiedlich sein.

Wie könnte ich hier "int foo" in einer struct verstecken?

von ante (Gast)


Lesenswert?

Indem du, dort ein struct statt einen int hinsetzt.
1
typedef struct {
2
   int test;
3
} test_struct;
4
5
...
6
test_struct.test = 'A';

Aber wie gesagt, mach es static, wenn global, sonst sieht das der ganze 
Kernel.

von olpo (Gast)


Lesenswert?

Aber das Struct muss ich doch irgend jemand übergeben. Ansonsten habe 
ich nur ein struct als globale Variable, oder?

von Planlos (Gast)


Lesenswert?

olpo schrieb:
> Aber das Struct muss ich doch irgend jemand übergeben

platform_set_drvdata & platform_get_drvdata ?

von Michael B. (mb_)


Lesenswert?

Globale Daten sind in Gerätetreibern so gut wie nie nötig.
Es gibt immer eine Möglichkeit Instanzdaten abzulegen, die meist als 
"drvdata" oder "priv" oder ähnlich benannt sind.
Die Variante for platform devices wurde bereits genannt.

von Georg A. (georga)


Lesenswert?

> Globale Daten sind in Gerätetreibern so gut wie nie nötig.

Naja, so ein globales debug-Setting beim Modul-Laden kann schon 
hilfreich sein ;)

von hink (Gast)


Lesenswert?

Du kannst auch mal nach
1
EXPORT_SYMBOL
 suchen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.