私は過去 3 ~ 4 日間、これに頭を悩ませていましたが、(ARM または非公式の) DECENT の説明文書が見つかりません。私はODROID-XU ボード (big.LITTLE 2 x Cortex-A15 + 2 x Cortex-A7)ボードを持っており、ARM アーキテクチャについてもう少し理解しようとしています。私の「実験的」コードでは、WFI (割り込み待機) 状態から他のコアをウェイクアップしたい段階に到達しました。
私がまだ見つけようとしている不足している情報は次のとおりです。
1.メモリ マップド GIC のベース アドレスを取得するときに、CBAR を読み取る必要があることを理解しています。しかし、最終的な GIC ベース アドレスに到達するために CBAR のビット (2 つの PERIPHBASE 値) をどのように配置する必要があるかを説明しているドキュメントはありません。
2. GICD_SGIR レジスタを介して SGI を送信する場合、0 ~ 15 のどの割り込み ID を選択すればよいですか? それは問題ですか?
3. GICD_SGIR レジスタを介して SGI を送信する場合、どこから実行を開始するかを他のコアに伝えるにはどうすればよいですか?
4.コードが U-BOOT ブートローダーによってロードされるという事実は、この状況にどのように影響しますか?
Cortex-A Series Programmer's Guide v3.0 (ここにあります:リンク)のセクション 22.5.2 (Linux での SMP ブート、271ページ)に次のように記載されています。
プライマリ コアが起動している間、セカンダリ コアは WFI 命令を使用してスタンバイ状態に保持されます。それ (プライマリ コア) は、セカンダリ コアにスタートアップ アドレスを提供し、プロセッサ間割り込み (IPI) を使用してそれらをウェイクアップします。
Linuxはどのようにそれを行いますか? ドキュメント- Sは、「セカンダリコアにスタートアップアドレスを提供します」に関する他の詳細を提供していません。
私の欲求不満は高まっており、答えにとても感謝しています. 事前にどうもありがとうございました!
追加の詳細
私が使用するドキュメント:
- ARMv7-A&R アーキテクチャ リファレンス マニュアル
- Cortex-A15 TRM (テクニカル リファレンス マニュアル)
- Cortex-A15 MPCore TRM
- Cortex-A シリーズ プログラマーズ ガイド v3.0
- GICv2 アーキテクチャ仕様
私が今までにやったこと:
- UBOOT は 0x40008000 にロードします。変換テーブル (TTB) をセットアップし、それに応じて TTBR0 と TTBCR を書き込み、0x40008000 を 0x8000_0000 (2GB) にマップしたので、MMU も有効にしました
- 独自の例外ハンドラをセットアップする
- シリアル経由で Printf 機能を利用できます (ODROID-XU の UART2)
上記のすべてが適切に機能しているようです。
私が今やろうとしていること:
- GIC ベース アドレスを取得 => CBAR を読み取り、その値を 0xFFFF8000 と論理積 (&) し、これを GIC ベース アドレスとして使用しますが、これが正しくないことはほぼ確実です。
- GICD_CTLR に値 0x1 を書き込むことにより、GIC ディストリビュータを有効にします (GIC ベース アドレスからのオフセット 0x1000?)。
- 次のパラメーターを使用して SGI を構築します: Group = 0、ID = 0、TargetListFilter = "All CPUs Except Me" および GICD_SGIR GIC レジスターを介して送信 (書き込み)
- 他のコアには実行開始アドレスを渡していないので、このままでは何も起こりません。
....アップデート....
答えを求めて、Linux カーネルと QEMU のソース コードを調べ始めました。これが私が見つけたものです(間違っている場合は修正してください):
- ボードの電源を入れると、すべてのコアがリセットベクターから実行を開始します
- ソフトウェア (ファームウェア)コンポーネントは、セカンダリ コアで WFI を実行し、これらのセカンダリ コアとプライマリ コアの間のプロトコルとして機能するその他のコードを実行します。
- たとえば、EnergyCore ECX-1000 (Highbank)ボードで使用されるプロトコルは次のとおりです。
**(1)** the secondary cores enter WFI and when
**(2)** the primary core sends an SGI to wake them up
**(3)** they check if the value at address (0x40 + 0x10 * coreid) is non-null;
**(4)** if it is non-null, they use it as an address to jump to (execute a BX)
**(5)** otherwise, they re-enter standby state, by re-executing WFI
**(6)** So, if I had an EnergyCore ECX-1000 board, I should write (0x40 + 0x10 * coreid) with the address I want each of the cores to jump to and send an SGI
質問:
- 1. これを行うソフトウェア コンポーネントは何ですか? SD カードに書き込んだ BL1 バイナリですか、それとも U-BOOT ですか?
- 2. 私の理解では、このソフトウェア プロトコルはボードごとに異なります。そうですか、それとも基礎となるプロセッサにのみ依存していますか?
- 3. ピックワン ARM ボードのこのプロトコルに関する情報はどこにありますか? - ARM の公式 Web サイトまたはボードの Web ページで見つけることができますか?