Comment passer une valeur au module du kernel Linux intégré au démarrage?

Je veux passer un paramètre personnalisé au kernel au démarrage, que mon nouveau code utilisera. Ce paramètre est un nombre.

Je sais comment transmettre une valeur au module du kernel en utilisant la ligne de commande du kernel, à savoir module_param() . Maintenant, je veux transmettre la valeur de u-boot.

Y a-t-il un moyen de le faire, pendant ou après le démarrage?

Modifiez votre fichier de forum présent dans include / config / board_xxx.h de U-Boot, modifiez $ bootargs de manière similaire à la dernière variable définie dans cet exemple:

 setenv bootargs display=\${display} console=\${consoledev},\${baudrate} root=/dev/mmcblk0p1 rw rootdelay=1 control.cmd1={cmd1} 

control est le nom du module de pilote intégré que je ne peux pas contrôler car j’en ai besoin pour démarrer complètement à l’invite Linux.

cmd1 est la variable globale que j’ai définie dans le module dans lequel j’ai utilisé:

 module_param(cmd1, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); 

Ainsi, votre var $ bootargs doit simplement être ajoutée à quelque chose comme:

.=

Si vous savez comment transmettre une valeur à un module du kernel, vous en savez assez 🙂

insmod my_module param=value

Si votre module est intégré au kernel, vous pouvez append votre paramètre aux parameters du kernel

vmlinux ... my_module.param=value ...

Voici une référence: kernel-parameters.txt

Documentation source Linux

Je le préfère de la bouche de la hourse v4.12 / Documentation / admin-guide / kernel-parameters.rst :

 Module parameters can be specified in two ways: via the kernel command line with a module name prefix, or via modprobe, eg: (kernel command line) usbcore.blinkenlights=1 (modprobe command line) modprobe usbcore blinkenlights=1 Parameters for modules which are built into the kernel need to be specified on the kernel command line. modprobe looks through the kernel command line (/proc/cmdline) and collects module parameters when it loads a module, so the kernel command line can be used for loadable modules too. 

Un moyen facile de l’essayer

 CONFIG_DUMMY_IRQ=y 

puis sur la ligne de commande:

 dummy-irq.irq=12 

et quand le kernel démarre, vous voyez:

 dummy-irq: registered for IRQ 12 

qui est imprimé à partir de init de dummy-irq.c .

Chemin de code

Je n’ai pas encore réussi à suivre le code complet, mais je pense que le . est encodé sur https://github.com/torvalds/linux/blob/v4.12/include/linux/moduleparam.h#L13 :

 #define MODULE_PARAM_PREFIX KBUILD_MODNAME "." 

qui est développé dans la module_param macro module_param , dont une étape contient un commentaire de Linus indiquant à quel point ce code est clair:

 /* Lazy bastard, eh? */ 

La QEMU GDB watch backtrace qui finit par le définir pour dummy-irq.c:irq est:

 #0 kstrtouint (s=, base=, res=0xffffffff81a8d820 ) at lib/kstrtox.c:225 #1 0xffffffff8106e124 in param_set_uint (val=, kp=) at kernel/params.c:295 #2 0xffffffff8106ed98 in parse_one (handle_unknown=, arg=, max_level=, min_level=, num_params=, params=, doing=, val=, param=) at kernel/params.c:148 #3 parse_args (doing=, args=0xffff880007fdb99f "", params=, num=, min_level=, max_level=, arg=0x0 , unknown=0xffffffff81aeb8e5 ) at kernel/params.c:243 #4 0xffffffff81aebc6d in start_kernel () at init/main.c:518