如何在启动时将值传递给内置Linux内核模块?

vm1*_*553 11 linux linux-device-driver linux-kernel

我想在启动时将自定义参数传递给内核,我的新代码将使用该参数.此参数是一个数字.

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

有没有办法在启动期间或启动后执行此操作?

Fed*_*ico 9

如果你知道如何将值传递给内核模块,你就知道了:)

insmod my_module param=value

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

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

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

  • 它也适用于任何其他架构,以及任何其他引导加载程序.在uboot中,您有bootargs环境. (2认同)

Pra*_*kar 9

修改U-Boot的include/config/board_xxx.h中存在的板文件,修改类似于此示例中设置的最后一个变量的$ bootargs:

setenv bootargs display=\${display} console=\${consoledev},\${baudrate} root=/dev/mmcblk0p1 rw rootdelay=1 control.cmd1={cmd1}
Run Code Online (Sandbox Code Playgroud)

control是我无法修改的内置驱动程序模块的名称,因为我需要它来完全启动到Linux提示符.

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

module_param(cmd1, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
Run Code Online (Sandbox Code Playgroud)

所以,你的$ bootargs var只需要添加如下内容:

<your_mod_name>.<your_mod_parameter_var_name>=<an_appropriate_value>


Cir*_*四事件 5

Linux 源文档

我更喜欢从小时的口中得知 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, e.g.:

    (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.
Run Code Online (Sandbox Code Playgroud)

简单的方法来尝试一下

CONFIG_DUMMY_IRQ=y
Run Code Online (Sandbox Code Playgroud)

然后在命令行上:

dummy-irq.irq=12
Run Code Online (Sandbox Code Playgroud)

当内核启动时你会看到:

dummy-irq: registered for IRQ 12
Run Code Online (Sandbox Code Playgroud)

这是从 打印initdummy-irq.c

代码路径

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

#define MODULE_PARAM_PREFIX KBUILD_MODNAME "."
Run Code Online (Sandbox Code Playgroud)

它在宏瀑布中得到扩展module_param,其中一步包含 Linus 的注释,表明该代码的清晰程度:

/* Lazy bastard, eh? */
Run Code Online (Sandbox Code Playgroud)

watch最终设置它的QEMU GDB回溯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
Run Code Online (Sandbox Code Playgroud)