カーネルコマンドラインに同じパラメータの複数の設定が含まれている場合は、どう評価しますか?
例:
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);
}
したがって、フラグを設定して解放します。その間に何もなければ何の効果もありません。
カーネル開発者は合理的な人々であり、配信順序によって動作が異なるパラメータを追加しないため、ほとんどの場合、2つの間の距離が影響を与えないと仮定します。
...しかし...
parse_args()
もう一度確認してください。
if (irq_was_disabled && !irqs_disabled())
pr_warn("%s: option '%s' enabled irq's!\n",
doing, param);
これは、フラグのコールバックがirqを有効にするなどの重要な操作を実行できることを示します。
このロジック/スキャンはまた、モジュールパラメータ(modulename.flag = xxx形式のカーネルパラメータなど)を検証するため、モジュールが実行することを選択した操作を盲目的に信頼することはありません。