커널 명령줄에 동일한 매개변수에 대한 여러 설정이 포함되어 있는 경우 이를 어떻게 평가합니까?
예:
nohz=off ... nohz=on
어떤 설정이 "승리"합니까? 마지막 하나?
각 매개변수에 대한 평가 논리가 동일합니까?
답변1
이것이 마지막이어야합니다.
매개변수는 에 의해 처리되며 from을 init/main.c
사용하여 지속적으로 스캔합니다. 호출할 때마다 콜백은 결국 매개변수에 따라 호출됩니다.parse_args()
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);
이는 플래그의 콜백이 irq 활성화와 같은 중요한 작업을 수행할 수 있음을 나타냅니다.
이 로직/스캔은 또한 모듈 매개변수(예: modulename.flag=xxx 형식의 커널 매개변수)를 확인하므로 모듈이 수행하기로 선택한 작업을 맹목적으로 신뢰하지는 않습니다.