Ich suchte Linux Kernel-Code, um den nr_cpus
Boot-Parameter zu verstehen. Gemäß der Dokumentation, (https://www.kernel.org/doc/Documentation/kernel-parameters.txt)nr_cpus Boot-Parameter im Linux-Kernel
[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
Im smp.c
Code, wird der Wert auf nr_cpu_ids
gesetzt, die dann überall im Kernel verwendet wird.
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);
Was ich nicht verstehen, die nr_cpu_ids auch durch setup_nr_cpu_ids eingestellt.
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 }
Zunächst dachte ich, dass dies vor der early_param
Aufruf aufgerufen wird. Nach dem Hinzufügen von Protokollen habe ich festgestellt, dass setup_nr_cpu_ids()
nach nr_cpus()
aufgerufen wird. nr_cpu_ids
wird immer auf die Wertesätze in setup_nr_cpu_ids()
statt nr_cpus()
gesetzt. Ich habe sogar seinen Wert in smp_init()
überprüft.
Kann jemand bitte klären, ob meine Beobachtung richtig ist oder nicht?
Was ist die genaue Verwendung von nr_cpu_ids
?
Das hört sich seltsam an, da setup_nr_cpu_ids in Zeile 531 hier http://lxr.free-electron.com/source/init/main.c#L531 aufgerufen wird, während die early_param-Funktionen in Zeile 539 ausgeführt werden. – nos
Das passiert weil jede Architektur eine Funktion setup_arch() implementiert hat, die parse_early_param() aufruft. http://lxr.free-electronics.com/source/arch/x86/kernel/setup.c#L983 setup_arch() wird auf Linie 528 – alex