Was macht __exit beim Entladen von Kernelmodulen in Linux?

1111
Usr1
static void __exit hello_exit(void) { printk(KERN_ALERT "Goodbye\n"); }  module_exit(hello_exit); 

Der __exitModifizierer markiert den Code als nur für das Entladen von Modulen (indem er den Compiler veranlasst, ihn in einem speziellen ELF-Abschnitt zu platzieren). Wenn Ihr Modul direkt in den Kernel integriert ist oder wenn Ihr Kernel so konfiguriert ist, dass keine Module entladen werden, werden die markierten Funktionen __exiteinfach verworfen. Aus diesem Grund kann eine markierte Funktion __exitnur zum Zeitpunkt des Entladens oder Herunterfahrens des Systems aufgerufen werden. Jede andere Verwendung ist ein Fehler.

Ich verstehe nicht, wofür es __exitsteht. Erklären Sie bitte das Szenario, damit ich ein klares Bild habe.

0
Probleme, die sich auf die Programmierung und Softwareentwicklung beziehen, sind nicht relevant, siehe [Welche Themen kann ich hier fragen?] (Http://superuser.com/help/on-topic). Versuchen Sie [SO], aber lesen Sie zuerst [Wie stelle ich eine gute Frage?] (Http://stackoverflow.com/help/how-to-ask). DavidPostill vor 9 Jahren 0

1 Antwort auf die Frage

1
sawdust

Wenn ein Anwendungsprogramm geladen ist und ausgeführt wird, kann es Ressourcen (z. B. Anforderungsspeicher, offene Dateien) anfordern. Wenn das Programm beendet wird, kann der Kernel diese Ressourcen freigeben (wenn das Programm nicht nach sich selbst bereinigt), da die Anwendung im Benutzermodus ausgeführt wird, während der Kernel im Supervisor-Modus ausgeführt wird.

Ein Kernel-ladbares Modul kann auf ähnliche Weise wie ein Anwendungsprogramm geladen und entladen werden. Der Kernel kann das Kernel-Modul jedoch nicht (oder nicht) überwachen, da das Modul Teil des Kernels ist und auch im privilegierten Modus als Teil des Kernels ausgeführt wird.

Bevor ein Kernel-Modul entladen wird, muss es daher alle von ihm erworbenen Ressourcen freigeben sowie alle aktivierten Geräte stilllegen. Die Exitroutine ist die letzte Möglichkeit, dass das Modul diese Vorgänge ausführen muss, oder das System kann sich in einem instabilen Zustand befinden.

Das fasst es so ziemlich zusammen. Um ein Modul zu entfernen, rufen Sie "modprobe -r tun" oder "rmmod tun" auf. Daniel B vor 9 Jahren 0
Es funktioniert gut, ohne zu erwähnen, _exit was ist der Unterschied? Usr1 vor 9 Jahren 0
@ v123 Es handelt sich wahrscheinlich hauptsächlich um syntaktische Zucker / Makro-Tricks. Daniel B vor 9 Jahren 0