我在瀏覽Linux內核代碼以瞭解啓動參數nr_cpus
。 作爲每文檔, (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
在smp.c
碼,該值被設置爲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
始終設置爲setup_nr_cpu_ids()
中的值集而不是nr_cpus()
。我甚至在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