Re: Problème de C (noyau Linux)

Page principale

Répondre à ce message
Auteur: Patrice Karatchentzeff
Date:  
À: Nicolas Morey
CC: GUILDE
Sujet: Re: Problème de C (noyau Linux)
Super : c'est exactement ce que je voulais savoir.

Merci de ton aide.

Le lun. 12 déc. 2022 à 11:30, Nicolas Morey
<devel@???> a écrit :
>
>
>
> On 12/12/22 11:05, Patrice Karatchentzeff wrote:
> > Salut NIco,
> >
> > Merci. Je comprends l'idée et je te remercie.
> >
> > Mais je ne comprends toujours pas l'intérêt. C'est donc conditionné au
> > chargement du premier module (qui est de facto chargé car un minimum
> > de modules sont chargés au démarrage, à savoir les modules internes).
> > Ça rend le code obscur alors que jusqu'à là, le code appelait assez
> > explicitement tout ce dont il avait besoin au fur et à mesure. Ià, il
> > appelle cet appel de façon transparente au premier usage d'une
> > fonction C du module. Je me demande pourquoi ce brusque changement de
> > paradigme.
> >
>
> Parce que tu n'as pas forcement d'initramfs. Tu peux imaginer un linux embedded avec tous les modules nécessaire builtin (sans .ko) et booter directement sur un disque sans passer par l'étape initrd/initramfs.
> Vu que c'est tout dynamique, ca te permet de désactiver complètement la compilation du support initramfs (init/noinitramfs.c), de gratter un peu de RAM au passage et le init/main.c n'a pas besoin de le savoir :)
>
> > Mais merci quand même : j'ai compris.
> >
> > PK
> >
> > Le lun. 12 déc. 2022 à 10:48, Nicolas Morey
> > <devel@???> a écrit :
> >>
> >> Hello
> >>
> >> On 12/12/22 09:50, Patrice Karatchentzeff wrote:
> >>> Salut,
> >>>
> >> [...]
> >>>
> >>> Le code, pour fonctionner, renvoie donc à l'appel système
> >>> rootfs_initcall(). Je ne comprends en C le saut entre la fonction
> >>> populate_rootfs et l'appel système.
> >>>
> >>> Pour être clair, pour *moi*, le fichier initramfs.c est un fichier de
> >>> fonctions que le noyau appelle selon son usage. Nul part, il appelle
> >>> la dernière fonction. Pourtant, elle tourne, puisqu'elle est à
> >>> l'origine du message ci-dessus. Je voudrais donc comprendre le truc en
> >>> C qui fait que l'avant-dernière fonction appelle bien l'appel
> >>> système... On dirait que la dernière fonction est automatiquement
> >>> appelée quand le code est compilé... (ce qui semble peu ou prou normal
> >>> pour un appel système, mais cela me semble bizarre : d'habitude, les
> >>> appels dans le code du noyau sont placés dans des fonctions
> >>> explicites, pas dans des bibliothèques. On dirait que le linker devine
> >>> qu'il doit exécuter la fonction et la place au bon endroit).
> >>>
> >> Le bout qu'il te manque est là:
> >>
> >> include/linux/module.h:120:#define rootfs_initcall(fn)      module_init(fn)

> >>
> >> module_init(fn) va automatiquement lancer fn au moment du chargement du module contenant le code.
> >> Plus précisément, module_fn va créer un symbole init_module qui pointe sur fn que le kernel pourra éxecuter au moment voulu lorsqu'il charge le module.
> >>
> >>
> >> Nicolas
> >
> >
> >




-- 
      |\      _,,,---,,_           Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:patrice.karatchentzeff@gmail.com
     |,4-  ) )-,_. ,\ (  `'-'
    '---''(_/--'  `-'\_)