UEFIでマルチプロセッシングは可能ですか?

Unified Extensible Firmware Interface仕様によると、オペレーティングシステムをロードする前に初期化手順を提供するソフトウェア環境は、マルチスレッド処理をサポートしていません。 主な理由は、シングルスレッドのUEFIイデオロギーであり、その結果、UEFI APIサービス手順の不採算性です。 同時に、サービス関数の呼び出し(RAMのテストなど)に関係しない多くのタスクにより、複数のプログラムスレッドによる並列実行が可能になるだけでなく、このようなトリップによりパフォーマンスが向上します。



:数年前に私たちの実験室で、ハードウェアリソース、特にローカルAPIC割り込みコントローラーの直接プログラミングを使用して、16ビットMS-DOS環境でマルチプロセッサプラットフォームを初期化するために実施されました。 経験は技術的な観点からは成功しましたが、それは犬にバイオリンの演奏方法を教えたトレーナーについての冗談にやや似ていることが判明しました、そして結局のところ聴衆はバイオリンコンサートを聞くためにサーカスに行きませんでした...



EFI_MP_SERVICES_PROTOCOLと呼ばれる文書化された一連のサービス関数がUEFIファームウェアに存在することは、UEFIでのマルチスレッド処理の運命が多少異なることを示唆しています。 このプロトコルの機能の1つを詳細に検討してみましょう。



APの起動:方法



パラメータのセットと、 StartupThisAPの主要な機能の1つを使用する原則を考慮してください。これにより、AP(アプリケーションプロセッサ)マルチプロセッサシステムの起動と、BSP(ブートストラッププロセッサ)側からの作業の調整が保証されます。



  StartupThisAP   UEFI Platform Initialization Specification

UEFIプラットフォーム初期化仕様のStartupThisAP関数の説明。 ボリューム2。ドライバー実行環境のコアインターフェイス。 バージョン1.3。



この関数を使用すると、マルチプロセッサプラットフォームの特定の論理プロセッサで任意のプロシージャを開始できます。 制御オブジェクトは論理プロセッサです。たとえば、 ハイパースレッディングテクノロジをサポートする2つの8コアプロセッサを備えたシステムでは、論理プロセッサの数は2 * 8 * 2 = 32になります。プロセッサの数を要求するには、 GetNumberOfProcessors関数を使用します 。その例を以下に示します。 SMP検出ユーティリティ



そのため、StartupThisAP関数は7つのパラメーターを取ります。



  1. EFI_MP_SERVICES_PROTOCOL -EFI_Locate_Protocol関数によって返される、呼び出されたプロトコルのインターフェイスユニットへのポインター。
  2. EFI_AP_PROCEDURE -APプロセッサが実行するプロシージャへのポインタ。 プロシージャは、現在のプロセッサの動作モードのルールに従ってメモリに事前に準備する必要があります。たとえば、UEFI x64にはMicrosoft x64呼び出し規約が使用されます。
  3. ProcessorNumber-起動されたプロセッサーの番号。0から数えます。
  4. WaitEvent-呼び出し側プロシージャによって予約されたイベントの番号(ハンドル)。 呼び出されたプロシージャはこのイベントを生成して、APプロセッサでのサブルーチンの正常終了またはタイムアウトを通知します。 特別な場合-このパラメーターの値がゼロの場合、APプロセッサーで手順を開始したBSPプロセッサーは、この手順が完了するのを待ってから関数から戻る必要があります。 ただし、イベントは生成されません。 このモードはブロッキングモードと呼ばれます。
  5. TimeoutInMicroseconds -APプロセッサで実行されているプロシージャの完了のタイムアウトを決定するマイクロ秒単位のタイムアウト値。 タイムアウトが経過すると、プロシージャはエラーで終了します。 このパラメーターのゼロ値は、プロシージャーの実行時間に制限がないことを意味します(無限に待機します)。
  6. ProcedureArgument -APプロセッサで実行されているプロシージャに渡されるパラメーター。 値ゼロは、パラメーターの受け渡しを使用しないことを意味します。
  7. Finished -APで実行中のプロシージャがタイムアウトの期限が切れる前に正常に完了した場合、UEFIファームウェアによってTRUEに設定された変数へのポインター。 値ゼロは、そのような変数を使用しないことを意味します。


実行後、関数はRAXレジスタにUEFIステータスを返します。



まとめ



レガシーBIOSと比較して、UEFIファームウェアは、マルチプロセッサプラットフォームを初期化する際のシステムプログラマのタスクを大幅に簡素化すると言うことができます。 IPIまたはプロセッサ間割り込みと呼ばれるプロセッサ間割り込みの転送、およびUEFIコンテキストと互換性のあるモードへのAPプロセッサの転送は、機器を直接プログラミングするのではなく、サービス機能を使用して実行できます。 例外は、マルチプロセッシングのサポートを提供するプラットフォームリソースが独立した研究または診断の対象であるタスクです。



アプリ







UPD。 画像が置き換えられました:最初は誤ってインターフェースユニットEFI_MP_SERVICES_PROTOCOLの構造がありました



All Articles