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.
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.
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)
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.
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
__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
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 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.