GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was bedeutet __init im Linux-Kernel-Code?

Dies demonstriert eine Funktion von Kernel 2.2 und höher. Beachten Sie die Änderung in den Definitionen von init und cleanup Funktionen. Die __init Makro verursacht den init Funktion verworfen und ihr Speicher freigegeben werden, sobald init Funktion endet für eingebaute Treiber, aber nicht für ladbare Module. Wenn Sie darüber nachdenken, wann die init Funktion aufgerufen wird, macht das durchaus Sinn.

Quelle


include/linux/init.h

/* These macros are used to mark some functions or 
 * initialized data (doesn't apply to uninitialized data)
 * as `initialization' functions. The kernel can take this
 * as hint that the function is used only during the initialization
 * phase and free up used memory resources after
 *
 * Usage:
 * For functions:
 * 
 * You should add __init immediately before the function name, like:
 *
 * static void __init initme(int x, int y)
 * {
 *    extern int z; z = x * y;
 * }
 *
 * If the function has a prototype somewhere, you can also add
 * __init between closing brace of the prototype and semicolon:
 *
 * extern int initialize_foobar_device(int, int, int) __init;
 *
 * For initialized data:
 * You should insert __initdata between the variable name and equal
 * sign followed by value, e.g.:
 *
 * static int init_variable __initdata = 0;
 * static const char linux_logo[] __initconst = { 0x32, 0x36, ... };
 *
 * Don't forget to initialize data not at file scope, i.e. within a function,
 * as gcc otherwise puts the data into the bss section and not into the init
 * section.
 * 
 * Also note, that this data cannot be "const".
 */

/* These are for everybody (although not all archs will actually
   discard it in modules) */
#define __init      __section(.init.text) __cold notrace
#define __initdata  __section(.init.data)
#define __initconst __section(.init.rodata)
#define __exitdata  __section(.exit.data)
#define __exit_call __used __section(.exitcall.exit)

Dies sind nur Makros, um einige Teile des Linux-Codes in speziellen Bereichen in der endgültig ausgeführten Binärdatei zu lokalisieren.__init , zum Beispiel (oder besser die __attribute__ ((__section__ (".init.text"))) Dieses Makro wird erweitert zu) weist den Compiler an, diese Funktion auf besondere Weise zu markieren. Am Ende sammelt der Linker alle Funktionen mit dieser Markierung am Ende (oder Anfang) der Binärdatei.

Beim Start des Kernels wird dieser Code nur einmal ausgeführt (Initialisierung). Nach der Ausführung kann der Kernel diesen Speicher freigeben, um ihn wiederzuverwenden, und Sie sehen die Kernel-Nachricht:

Ungenutzten Kernelspeicher freigeben:108 KB freigegeben

Um diese Funktion nutzen zu können, benötigen Sie eine spezielle Linker-Skriptdatei, die dem Linker mitteilt, wo er alle markierten Funktionen finden soll.


Linux
  1. Linux – Was bedeutet ein Punkt nach den Dateiberechtigungsbits?

  2. Was bedeutet in der Ausgabe von Ps?

  3. Linux – Was bedeutet das virtuelle Kernel-Speicherlayout in Dmesg?

  4. Linux – Was bedeutet die Errors=mount-Option fortsetzen?

  5. Linux – Warum kann der Kernel Init nicht ausführen?

Was genau macht make oldconfig im Makefile des Linux-Kernels?

Was bedeutet &am Ende eines Linux-Befehls?

Was bedeutet Lastdurchschnitt unter Unix/Linux?

Was bedeutet der Buchstabe 'u' in /dev/urandom?

Was bedeutet die ep-Fähigkeit?

Was bedeutet das Suffix .d unter Linux?