x86 のリアル モードで、マルチプロセッサ システムの別のプロセッサでコードを実行するには、どの命令を使用する必要がありますか?
(実際のオペレーティング システムが起動する前に、特定の CPU レジスタを設定し、システム内のすべての CPU でこれを行う必要がある、アセンブラーで起動前のコードをいくつか書いています。)
x86 のリアル モードで、マルチプロセッサ システムの別のプロセッサでコードを実行するには、どの命令を使用する必要がありますか?
(実際のオペレーティング システムが起動する前に、特定の CPU レジスタを設定し、システム内のすべての CPU でこれを行う必要がある、アセンブラーで起動前のコードをいくつか書いています。)
では、ブートローダーのようなスタンドアロンの (「プリブート」と言いました) プログラムをリアル モードで実行していますか? そして、これは通常の BIOS を搭載した PeeCee にありますか?
その場合、実行中の CPU は 1 つだけです。他の CPU ユニットをスピンアップするために、オペレーティング システムは通常、次のようなユニバーサル スタートアップ アルゴリズムと呼ばれるものを実行します。
BSP sends AP an INIT IPI
BSP DELAYs (10mSec)
If (APIC_VERSION is not an 82489DX) {
BSP sends AP a STARTUP IPI
BSP DELAYs (200μSEC)
BSP sends AP a STARTUP IPI
BSP DELAYs (200μSEC)
}
BSP verifies synchronization with executing AP
BSP はブート プロセッサです。AP はアプリケーション プロセッサです。IPI はプロセッサ間割り込みです。IPI を実行するには、APIC を有効にする必要があります。APIC は、起動時に有効になっていない PC アーキテクチャの割り込みコントローラー拡張機能です。そのため、コードはどのような ICU バージョンで実行されているかが気になります。これらはすべて、かなり深いカーネル マジックです。例として、Linux、NetBSD、またはその他の *BSD ソース コードを調べてみることもできますが、簡単には読めません。本当に勝てば、どこかで小さなカーネルまたはスタンドアロンの SMP テスト プログラムを見つけることができるかもしれません。
詳細については、Intel マルチプロセッサの仕様を参照してください。