2012-10-11 6 views
1

J'essaie de comprendre le fichier source Linux /home/akash/Downloads/linux-3.4.3/fs/binfmt_elf.c une partie un code est comme suit où je hv bloqué.comprendre fs/binfmt_elf.c

static struct linux_binfmt elf_format = { 
     .module   = THIS_MODULE, 
     .load_binary = load_elf_binary, 
     .load_shlib  = load_elf_library, 
     .core_dump  = elf_core_dump, 
     .min_coredump = ELF_EXEC_PAGESIZE, 
}; 

qui se réfèrent au fichier include/linux/binfmt.h

struct linux_binfmt { 
     struct list_head lh; 
     struct module *module; 
     int (*load_binary)(struct linux_binprm *, struct pt_regs * regs); 
     int (*load_shlib)(struct file *); 
     int (*core_dump)(struct coredump_params *cprm); 
     unsigned long min_coredump;  /* minimal dump size */ 
}; 

plz giv certains explaination sur ce ..

+0

Vous avez besoin d'explications sur l'initialisation de la structure? – Adil

Répondre

0

elf_format est une variable de type linux_binfmt déclarée comme statique .

Les valeurs attribuées aux membres de elf_format

.module   = THIS_MODULE, 
    .load_binary = load_elf_binary, /* Function pointer assigned with functions */ 
    .load_shlib  = load_elf_library, // do -- 
    .core_dump  = elf_core_dump,  // do -- 
    .min_coredump = ELF_EXEC_PAGESIZE, 
5

Il est l'initialisation d'une structure de type struct linux_binfmt nommé elf_format (avec static durée de stockage, ce qui signifie qu'il existe pour la durée de vie du programme et est initialisée exactement une fois), en utilisant la syntaxe introduite dans C99 qui permet de spécifier le membre de structure spécifique initialisé. Avant C99, l'initialiseur d'un struct nécessitait que les valeurs soient listées dans l'ordre dans lequel les membres sont déclarés dans le struct.

Par exemple:

struct struct_a { int a; char c; }; 

En C89, il n'a pas été possible d'initialiser explicitement c seulement:

struct struct_a s = { 0, 'f' }; /* Have to provide an initial value for 
            'a', the 0, in order to provide an 
            initial value for 'c', the f. */ 

mais dans C99 la nouvelle syntaxe a permis:

struct struct_a s = { .c = 'f' }; 

Les types de membres struct:

  • lh est de type struct list_head, qui n'est pas explicitement initialisé. lh sera initialisé par défaut (tous les membres de lh qui sont des pointeurs sont initialisés à un pointeur null et tous les types arithmétiques seront initialisés à zéro).
  • module est de type struct module* et est initialisé à THIS_MODULE.
  • load_binary est un pointeur vers une fonction qui renvoie un int et prend des arguments de type struct linux_binptrm* et struct pt_regs, et qui est initialisé à une fonction appelée load_elf_binary.
  • load_shlib est un pointeur sur une fonction qui renvoie un int et prend un argument de type struct file* et est initialisé à une fonction appelée load_elf_library.
  • core_dump est un pointeur vers une fonction qui renvoie un int et prend un argument de struct coredump_params* et est initialisé à une fonction appelée elf_core_dump.
  • min_coredump est de type unsigned long et est initialisé à ELF_EXEC_PAGESIZE.

reporter à la section 6.7.8 Initialisation de la norme C99 pour une description complète sur la syntaxe d'initialisation et des règles.

+0

#hmjd: jolie description. – pradipta