如何在开机时将值传递给内build的Linux内核模块?

我想在开机时将自定义parameter passing给内核,我的新代码将使用该参数。 这个参数是一个数字。

我知道如何使用内核命令行module_param()将值传递给内核模块。 现在我想从u-boot传递值。

有没有办法做到这一点,无论是在启动过程中或之后?

修改U-Boot的include / config / board_xxx.h文件中的board文件,修改$ bootargs类似于这个例子中设置的最后一个变量:

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

控制是内置的驱动程序模块的名称,我不能insmod,因为我需要它完全引导到Linux提示符。

cmd1是我在其中使用的模块中定义的全局变量:

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

所以,你的$ bootargs var只需要附加类似的东西:

<your_mod_name>.<your_mod_parameter_var_name>=<an_appropriate_value>

如果你知道如何将一个值传递给内核模块,那么你就足够了解了:)

insmod my_module param=value

如果您的模块内置在内核中,则可以将参数添加到内核参数中

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

这里有一个参考: kernel-parameters.txt

Linux源文件

我更喜欢它从小时候的嘴里v4.12 / Documentation / admin-guide / kernel-parameters.rst :

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

简单的方法来尝试一下

 CONFIG_DUMMY_IRQ=y 

然后在命令行上:

 dummy-irq.irq=12 

当内核启动时你会看到:

 dummy-irq: registered for IRQ 12 

这是从dummy-irq.cinit打印的。

代码路径

我没有设法遵循完整的代码路径,但我认为. 编码在https://github.com/torvalds/linux/blob/v4.12/include/linux/moduleparam.h#L13

 #define MODULE_PARAM_PREFIX KBUILD_MODNAME "." 

它在module_param宏瀑布中得到了扩展,其中的一个步骤包含Linus的注释,指出代码是多么清晰:

 /* Lazy bastard, eh? */ 

QEMU GDB watch回溯,最后将其设置为dummy-irq.c:irq为:

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