Salut,
Je ne suis pas un cador en C et j'ai un truc qui me pose problème dans
le code du noyau Linux.
Je cherche à comprendre d'où est lancé le message :
Trying to unpack rootfs image as initramfs...
A priori, cela vient du do_setup() du kernel_init(). Quand je creuse
un peu, le message est extrait de init/initramsf.c (c'est plus simple
de partir du code source) :
# grep -R "Trying to unpack rootfs image as initramfs" *
init/initramfs.c: printk(KERN_INFO "Trying to unpack rootfs
image as initramfs...\n");
Quand je farfouille dans le code, avec le super site
elixir.bootlin.com, j'isole la fonction en question
https://elixir.bootlin.com/linux/v5.19.17/source/init/initramfs.c#L762
soit do_populate_rootfs()
ce qui in fine me renvoie à
static int __init populate_rootfs(void)
{
initramfs_cookie = async_schedule_domain(do_populate_rootfs, NULL,
&initramfs_domain);
usermodehelper_enable();
if (!initramfs_async)
wait_for_initramfs();
return 0;
}
rootfs_initcall(populate_rootfs);
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).
Merci d'avance,
PK
--
|\ _,,,---,,_ Patrice KARATCHENTZEFF
ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff@gmail.com
|,4- ) )-,_. ,\ ( `'-'
'---''(_/--' `-'\_)