99 votes

Ce n' __init dans le code du noyau de Linux?

Dans le noyau Linux code source, j'ai trouvé cette fonction:

static int __init clk_disable_unused(void) 
{
   // some code
}

Ici, je ne peux pas comprendre qu'est - __init moyens.

82voto

Sangeeth Saravanaraj Points 5033

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)

62voto

sashoalm Points 10403

Ce ne sont que des macros pour localiser certaines parties du code linux en particulier les zones de la finale de l'exécution de binaires. __init, par exemple (ou mieux l' __attribute__ ((__section__ (".init.text"))) cette macro s'étend à d') demande au compilateur de cette marque la fonction d'une manière spéciale. À la fin de l'éditeur de liens recueille toutes les fonctions avec cette interrogation à la fin (ou commencer) du fichier binaire.

Lorsque le noyau démarre, ce code s'exécute une seule fois (l'initialisation). Après son exécution, la le noyau peut libérer cette mémoire pour le réutiliser, et vous verrez le noyau message:

Libérer unused kernel memory: 108 k libéré

Pour utiliser cette fonction, vous avez besoin d'un éditeur de liens spéciaux fichier de script, qui raconte l' l'éditeur de liens où trouver tous les marqués fonctions.

6voto

naveen kumar r Points 21

Cela démontre une fonctionnalité de noyau 2.2 et versions ultérieures. Notez le changement dans les définitions de l'init de nettoyage et de fonctions. Le __init macro provoque la fonction init être écarté et sa mémoire libérée une fois que la fonction init termine pour les pilotes intégrés, mais pas les modules chargeables. Si vous pensez à ce sujet lorsque la fonction init est appelée, cela fait beaucoup de sens.

source:http://fixunix.com/embedded/5276-what-__init-linux-kernel-code.html

5voto

Geoffroy Points 5173

__init est une macro définie dans l' ./include/linux/init.h qui se développe en __attribute__ ((__section__(".init.text"))).

Il demande au compilateur de marquer cette fonction d'une manière spéciale. À la fin de l'éditeur de liens recueille toutes les fonctions avec cette marque à la fin (ou commencer) du fichier binaire. Lorsque le noyau démarre, ce code s'exécute une seule fois (l'initialisation). Après son exécution, le noyau peut libérer cette mémoire pour le réutiliser, et vous verrez le noyau

3voto

elmo Points 633

Lire les commentaires (et les docs en même temps) dans linux/ini.h.

Vous devez également savoir que gcc a quelques extensions faites spécialement pour le code du noyau de linux et il semble que cette macro utilise un d'entre eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X