Linuxブート時のcpu数認識の最後の部分のこれ。
[ 0.000000] smpboot: Allowing 8 CPUs, 0 hotplug CPUs
このメッセージはarch/x86/kernel/smpboot.cにあるprefill_possible_map()が出している。
1252 pr_info("Allowing %d CPUs, %d hotplug CPUs\n", 1253 possible, max_t(int, possible - num_processors, 0));
possibleは以下のような処理で決定してしている。
1222 if (setup_possible_cpus == -1) { 1223 possible = num_processors; 1224 #ifdef CONFIG_HOTPLUG_CPU 1225 if (setup_max_cpus) 1226 possible += disabled_cpus; 1227 #else 1228 if (possible > i) 1229 possible = i; 1230 #endif 1231 } else 1232 possible = setup_possible_cpus;
setup_possible_cpusは初期値-1のグローバル変数。ソースを見た感じだとカーネルの起動時のオプションで設定する程度かな。
1187 static int __initdata setup_possible_cpus = -1; 1188 static int __init _setup_possible_cpus(char *str) 1189 { 1190 get_option(&str, &setup_possible_cpus); 1191 return 0; 1192 } 1193 early_param("possible_cpus", _setup_possible_cpus);
なので、通常は-1になっていてnum_processorsが使われるんじゃないかと。
num_processorsは前回のソースを見ている時に出てきていて、カーネルが認識したcpu数になっている。
prefill_possible_map()が呼ばれた段階でもcpu数が未設定の場合は1が設定される。
1217 /* no processor from mptable or madt */ 1218 if (!num_processors) 1219 num_processors = 1;
そして冒頭のpr_info()でcpu数を出す感じ。
この関数は最後に以下の処理をして、カーネルが認識したcpuに関しては有効だよーとして、それ以外の分は使えないのでfalseを設定する。
1255 for (i = 0; i < possible; i++) 1256 set_cpu_possible(i, true); 1257 for (; i < NR_CPUS; i++) 1258 set_cpu_possible(i, false);
このcpuのビットマスクはlinux/cpumask.hで定義されている。
14 typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
NR_CPUSはコンパイル時に決定している値でうちの環境だと128。
masami@saga:~/linux-kernel (vanilla)$ grep -n NR_CPUS .config 399:CONFIG_NR_CPUS=128
と言う訳でdmesgのLinuxカーネルがsmpの設定している部分のログからどうやってcpuの認識をしているのかを追いかけてきてここまで着たと。
[ 0.000000] found SMP MP-table at [mem 0x000fd7d0-0x000fd7df] mapped at [ffff8800000fd7d0] [ 0.000000] Using ACPI (MADT) for SMP configuration information [ 0.000000] smpboot: Allowing 8 CPUs, 0 hotplug CPUs
基本的な流れはこんな感じかな。
- IntelのMulti Processor SpecitificationにあるMP Floating Pointer Structureを探して、MP構成か調べる
- ACPIのMADTにあるデータ構造を見ていき、cpuを調べる
- 見つかったcpu数を表示
cpu数の表示は今回見たところで、それ以前の部分を調べた記事はこちら。
- LinuxカーネルのSMPまわりの処理を調べてみる
- 「Using ACPI (MADT) for SMP configuration information」のところを読む
- acpi_parse_madt_lapic_entries()とMultiple APIC Description Table
- Linuxカーネルで「ACPI: LAPIC ~」などを出している辺りを読む
- generic_processor_info()によるcpuの処理部分を読む
プロセッサを支える技術 ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)
- 作者: Hisa Ando
- 出版社/メーカー: 技術評論社
- 発売日: 2011/01/06
- メディア: 単行本(ソフトカバー)
- 購入: 22人 クリック: 250回
- この商品を含むブログ (50件) を見る