Was bedeutet __devexit in einer Funktionsdeklaration?

9

Ein Fahrer, den ich angeschaut habe, hat

%Vor%

Was bedeutet __devexit im Zusammenhang mit der Funktionsdefinition? Andere Funktionen, die ich gesehen habe, haben höchstens static und einen Rückgabetyp.

    
Kenkron 20.06.2015, 00:05
quelle

3 Antworten

2

Lange Geschichte kurz:

Dies ist ein Makro, das zu einer Gruppe von gcc -Attributen erweitert wird. Sie sind eine Möglichkeit, dem Compiler spezielle Informationen über verschiedene Dinge in Ihrem Code zu geben, wie in diesem Fall eine Funktion.

Verschiedene Compiler haben zu diesem Zweck unterschiedliche Syntaxis, sie sind nicht standardisiert. Zum Beispiel verwendet gcc Attribute, aber andere Compiler verwenden verschiedene Konstrukte.

Lange Geschichte lang:

Ich bin also kein Linux-Kernel-Experte, aber nach dem Quellcode wird dieses Makro für verwendet Hotplug . Ich glaube, es bedeutet, dass die Funktion etwas mit einem bestimmten Gerät tun sollte.

Die von Ihnen bereitgestellte Funktion scheint beispielsweise aus den Hotplug-Funktionen für die Arbeit mit einem Realtek PCI-Express-Kartenlesertreiber zu stammen.

Was macht dieses Makro eigentlich? Nun, schauen wir uns die Definition des Makros näher an:

%Vor%

Der erste Teil ist __section(.devexit.text) :

%Vor%

Wie Sie sehen, wird dadurch __attribute__(__section__()) mit dem Abschnittsnamen ".devexit.text" erstellt. Das bedeutet, dass gcc den Assemblercode einer Funktion mit diesem Attribut in einen benannten Abschnitt in der kompilierten Binärdatei mit dem Namen .devexit.text (anstelle des Standardabschnitts) kompiliert.

Der zweite Teil ist __exitused (nur definiert, wenn das Makro MODULE definiert ist):

%Vor%

Und __used ist abhängig von der gcc-Version entweder folgendermaßen definiert:

%Vor%

oder wie folgt:

%Vor%

Erstere stellt sicher, dass die Funktion, die dieses Attribut besitzt, auch dann kompiliert wird, wenn sie nirgendwo referenziert wird. Letzteres unterdrückt Compilerwarnungen im selben Fall, obwohl es die Kompilierung in keiner Weise beeinflusst.

Und schließlich, __cold :

%Vor%

Dies ist ein Attribut, das den Compiler informiert, dass die Funktion mit diesem Attribut nicht oft aufgerufen wird, damit es entsprechend optimiert werden kann.

Sooo, was haben wir am Ende? Funktionen, die mit __devexit markiert sind, sind Funktionen, die nicht oft aufgerufen werden (falls überhaupt aufgerufen) und in einen benannten Abschnitt eingefügt werden.

Der gesamte Quellcode stammt aus hier . Es sieht so aus, als wäre das Makro jetzt aus dem Linux entfernt worden Kernel .

    
Mints97 26.06.2015, 10:37
quelle
1

"... Es ist wahrscheinlich nur eine Anmerkung ..." --barak manos

Eureka! Es stellt sich heraus, dass das mysteriöse Element vielleicht eine Anmerkung genannt wird, die zusätzliche Informationen über eine Funktion hinzufügt . Diese zusätzlichen Informationen können vom Compiler überprüft werden, um Fehler zu erkennen, die ansonsten unbemerkt bleiben könnten.

Bearbeiten: @MattMcNabb sagt, dass es keine Anmerkung ist. Mehr Unsicherheit.

    
Kenkron 20.06.2015 00:31
quelle
0

Diese Attribute wurden im Linux-Kernel bei bestimmten Treiberfunktionen und Datendeklarationen verwendet und in einen separaten Abschnitt eingefügt, der unter bestimmten Umständen verworfen werden konnte.

Sie werden jedoch ab 3.10.x nicht mehr verwendet (oder definiert). Siehe: Ссылка

    
Robert 12.01.2017 13:25
quelle

Tags und Links