Linuxカーネルコードを参照して、nr_cpus
ブートパラメータを理解していました。 smp.c
コードでドキュメントを1として 、 (https://www.kernel.org/doc/Documentation/kernel-parameters.txt)Linuxカーネルのnr_cpusブートパラメータ
[SMP] Maximum number of processors that an SMP kernel
could support. nr_cpus=n : n >= 1 limits the kernel to
supporting 'n' processors. Later in runtime you can not
use hotplug cpu feature to put more cpu back to online.
just like you compile the kernel NR_CPUS=n
、値は、カーネル内でどこでも使用されているnr_cpu_ids
に設定されています。
http://lxr.free-electrons.com/source/kernel/smp.c
527 static int __init nrcpus(char *str)
528 {
529 int nr_cpus;
530
531 get_option(&str, &nr_cpus);
532 if (nr_cpus > 0 && nr_cpus < nr_cpu_ids)
533 nr_cpu_ids = nr_cpus;
534
535 return 0;
536 }
537
538 early_param("nr_cpus", nrcpus);
私がnr_cpu_idsを理解していないこともsetup_nr_cpu_idsによって設定されています。
555 /* An arch may set nr_cpu_ids earlier if needed, so this would be redundant */
556 void __init setup_nr_cpu_ids(void)
557 {
558 nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1;
559 }
最初は、これはearly_param
の呼び出しの前に呼び出されたと考えました。ログを追加した後、nr_cpus()
の後にsetup_nr_cpu_ids()
が呼び出されました。 nr_cpu_ids
は、nr_cpus()
ではなく、常にsetup_nr_cpu_ids()
の値セットに設定されています。私はsmp_init()
でその価値を確認しました。
私の観察が正しいかどうか誰でも明確にしてください。
nr_cpu_ids
の正確な使用法は何ですか?
setup_nr_cpu_idsが531行目でhttp://lxr.free-electrons.com/source/init/main.c#L531で呼び出されているのに対して、early_param関数が539行で実行されている間は少し奇妙に聞こえます – nos
すべてのアーキテクチャには、parse_early_param()を呼び出すsetup_arch()関数が実装されているためです。 http://lxr.free-electrons.com/source/arch/x86/kernel/setup.c#L983 setup_arch()は528行で呼び出されます – alex