カーネルは物理コアにCPU IDをどのように割り当てますか?

カーネルは物理コアにCPU IDをどのように割り当てますか?

実行中のLinuxシステムで物理コアのレイアウトを確認する方法に関する多くの情報を見つけることができますが、まず物理コアにCPU IDを割り当てる方法を知りたいです。

数台のコンピュータでこれを経験した後、割り当ては決定的に見えます(つまり、同じハードウェアから起動すると、同じCPU IDが物理処理コアに割り当てられます)。さらに、作業配布は、隣接する番号が付けられた2つのコアが物理的に互いに離れている「ラウンドロビン」方式のようです。たとえば、私が作業しているサーバー(ソケット2個×CPU×2個、ハイパースレッド2個、x86_64):cpu0ソケット0cpu1ソケット1、cpu2再びソケット0にありますcpu0cpu15このように続くと、cpu16ハイパースレッディングは同じ物理コアに実装されますcpu0

2ソケットx86_64のCPUレイアウト

これが意図的であると思われる場合は、この動作に関するドキュメントをどこで見つけることができるかを知っていますか?これの根拠は何ですか?

特にドキュメントやlkmlの投稿への参照をいただきありがとうございます。ソースコードの正しい位置を指すポインタでも役に立ちます。

答え1

ほとんど文書化されておらず、プラットフォームに大きく依存しています。 x86 の場合、次に使用可能な ID が関数の CPU に割り当てられます。generic_processor_info()

したがって、x86の場合、CPU IDは関数を呼び出す順序によって異なります。 APIC(割り込みコントローラ)が初期化されると呼び出され、APIC設定はBIOSによって提供されるACPI MADTテーブルから取得されます。

acpica-toolsACPIツール(CentOSのパッケージ)を使用して直接デコードしてみることができます。

# acpidump > acpi.dat
# acpixtract -a acpi.dat
# iasl -d apic.dat
...
# cat apic.dsl | awk -F: '/Subtable Type/ { st = $2 }
                          /Processor ID/ { id = $2 }
                          /Processor Enabled/ { print id, $2, st } '

関連情報