重复内核参数的评估顺序

max*_*zig 2 linux-kernel

如果内核命令行包含同一参数的多个设置,如何评估它们?

例子:

nohz=off ... nohz=on
Run Code Online (Sandbox Code Playgroud)

哪个设置“获胜”?最后一个?

每个参数的评估逻辑是否相同?

V13*_*V13 7

应该是最后一个了。

参数由 处理init/main.c,它使用parse_args()fromkernel/params.c依次扫描它们。对于它调用的每一个parse_one(),最终都会根据参数调用回调。

由于涉及回调,所有参数都会影响您的系统,无论它们的顺序如何。

对于nohz,参数由 注册和处理kernel/time/time-sched.c

__setup("nohz=", setup_tick_nohz);

static int __init setup_tick_nohz(char *str)
{
    return (kstrtobool(str, &tick_nohz_enabled) == 0);
}
Run Code Online (Sandbox Code Playgroud)

所以它设置和取消设置标志。如果中间没有其他任何东西,那么它应该没有影响。

内核开发人员是通情达理的人,他们不会添加其行为取决于传递顺序的参数,因此我认为在大多数情况下,两者的距离不会起作用。

... 但 ...

parse_args() 还有一张支票:

    if (irq_was_disabled && !irqs_disabled())
        pr_warn("%s: option '%s' enabled irq's!\n",
            doing, param);
Run Code Online (Sandbox Code Playgroud)

这表明标志的回调可能会做一些重要的事情,比如启用 irqs。

这个逻辑/扫描还检查模块参数(即modulename.flag=xxx 形式的内核参数),我不会盲目相信模块选择做什么。