重复内核参数的评估顺序

重复内核参数的评估顺序

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

例子:

nohz=off ... nohz=on

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

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

答案1

应该是最后一张了。

参数由 处理init/main.c,它使用parse_args()from 来kernel/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);
}

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

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

... 但 ...

parse_args()还有一个检查:

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

这表明标志的回调可能会执行一些重要的操作,例如启用 irqs。

此逻辑/扫描还会检查模块参数(即 modulename.flag=xxx 形式的内核参数),我不会盲目相信模块选择执行的操作。

相关内容