2016-10-04 5 views
1

Ich las TLDP und bemerkte, dass alle globalen Variablen und Funktionen als statisch deklariert wurden. Nach weiterem Lesen verstehe ich, dass die Variablen als statisch deklariert werden, um Namensraum Verschmutzung zu reduzieren.Warum sind globale Variablen im Linux-Kernel statisch?

Nach this SO Post,

statischen Funktionen sind Funktionen, die nur sichtbar für andere Funktionen in derselben Datei (genauer gesagt die gleiche Übersetzungseinheit) sind.

Das Deklarieren von Funktionen als statisch reduziert die Namensraumverschmutzung. Aber im Fall von Variablen, nach TLDP:

Wenn eine statische Variable von einem Modul geändert wird, werden alle anderen Module sehen den neuen Wert.

es würde Namespace Verschmutzung erhöhen. Sind globale statische Variablen nicht auch für dieselbe Übersetzungseinheit sichtbar? Wenn ja, wie die oben zitierte Aussage wahr ist? Mir scheint etwas zu fehlen.

Antwort

2

Wenn eine statische Variable von einem

Modul modifiziert

Ich glaube, Sie werden diesen Satz falsch interpretiert. Es kann ein bisschen verwirrend sein. Es bezieht sich nicht auf das Schlüsselwort C static. Es bezieht sich auf die Verwendung der "statischen Speicherdauer" des C-Standards. Siehe Abschnitt 6.2.4 des C-Standards:

1 Ein Objekt hat eine Speicherdauer, die seine Lebensdauer bestimmt. Dort sind drei Speicherdauern: statisch, automatisch und allokiert.

....

3 Ein Objekt, dessen Identifikator mit externer oder interner Bindung erklärt wird, oder mit der Speicherklassen Spezifizierer static hat statische Speicherdauer. Seine Lebensdauer ist die gesamte Ausführung des Programms

Das heißt, „statische Speicherdauer“ Variablen umfassen sowohl globale Variablen und mit dem C static Schlüsselwort deklarierten Variablen. Im TLDP-Artikel bezieht es sich auf das erstere.

+0

Was ist bei einem Kernelmodul ein "Programm"? Ist es der gesamte Kernel oder ist es nur das Modul? – daltonfury42

+0

Die Kernel-Link-Stufe ist strenger als Benutzer-Level-Programme in Bezug auf globale Variablen. Der Kernel-Build verhindert den Zugriff auf globale Variablen aus Modulen, es sei denn, sie werden explizit durch Aufruf des EXPORT_SYMBOL-Makros markiert. – kaylum

+0

Können Sie mir sagen, warum alle globalen Variablen als statisch deklariert werden müssen? – daltonfury42

Verwandte Themen