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

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-  ) )-,_. ,\ (  `'-'
    '---''(_/--'  `-'\_)