如果内核命令行包含同一参数的多个设置,如何评估它们?
例子:
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 形式的内核参数),我不会盲目相信模块选择执行的操作。