GNU/Linux >> Tutoriels Linux >  >> Linux

Que signifie __init dans le code du noyau Linux ?

Cela démontre une fonctionnalité du noyau 2.2 et ultérieur. Notez le changement dans les définitions du init et cleanup les fonctions. Le __init macro provoque le init fonction à supprimer et sa mémoire libérée une fois le init la fonction se termine pour les pilotes intégrés, mais pas pour les modules chargeables. Si vous pensez au moment où le init fonction est invoquée, cela est parfaitement logique.

sources


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 dans des zones spéciales du binaire d'exécution final.__init , par exemple (ou mieux le __attribute__ ((__section__ (".init.text"))) cette macro se développe en) indique au compilateur de marquer cette fonction d'une manière spéciale. A la fin, l'éditeur de liens collecte toutes les fonctions avec cette marque à la fin (ou au début) du fichier binaire.

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

Libération de la mémoire inutilisée du noyau :108 ko libérés

Pour utiliser cette fonctionnalité, vous avez besoin d'un fichier de script spécial de l'éditeur de liens, qui indique à l'éditeur de liens où localiser toutes les fonctions marquées.


Linux
  1. Linux - Que signifie l'option de montage Errors=continue ?

  2. Linux - Pourquoi le noyau ne peut-il pas exécuter Init ?

  3. Linux - Parties propriétaires ou fermées du noyau ?

  4. Qu'est-ce que cela signifie de dire que le noyau Linux est préemptif ?

  5. Que signifie &à la fin d'une commande Linux ?

Quelle est la source actuelle du noyau Linux ?

Que fait si [[ $ ? -ne 0 ]] ; signifie en .ksh

Que signifie le nom de l'interface eth0 sous Linux ?

Que signifie la lettre « u » dans /dev/urandom ?

Que signifie le ./ (barre oblique) sous Linux ?

Que signifie la capacité ep ?